이번엔
public interface MemberRepository extends JpaRepository<Member, Long> {
}
여기의 JpaRepository 등의 안으로 들어가, 분석해 볼거임.
package org.springframework.data.jpa.repository;
@NoRepositoryBean
public interface JpaRepository<T, ID> extends ListCrudRepository<T, ID>, ListPagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
void flush();
<S extends T> S saveAndFlush(S entity);
<S extends T> List<S> saveAllAndFlush(Iterable<S> entities);
@Deprecated
default void deleteInBatch(Iterable<T> entities) {
deleteAllInBatch(entities);
}
void deleteAllInBatch(Iterable<T> entities);
void deleteAllByIdInBatch(Iterable<ID> ids);
void deleteAllInBatch();
@Deprecated
T getOne(ID id);
@Deprecated
T getById(ID id);
T getReferenceById(ID id);
@Override
<S extends T> List<S> findAll(Example<S> example);
@Override
<S extends T> List<S> findAll(Example<S> example, Sort sort);
}
내부임. SpringDataJPA 기능들이 있음.
DB들끼리 공통적인 부분은
commons에 구현해 놨고,
SpringDataJPA는 저기다 구현해 놓음.
다음은
package org.springframework.data.repository;
@NoRepositoryBean
public interface ListPagingAndSortingRepository<T, ID> extends PagingAndSortingRepository<T, ID> {
List<T> findAll(Sort sort);
}
아무래도 페이징은 공통적인 부분이니, data.jpa가 아니라 그냥 repository임.
페이징, Crud는 공통적임.
JpaRepository는 Jpa 특화
package org.springframework.data.repository;
@NoRepositoryBean
public interface ListCrudRepository<T, ID> extends CrudRepository<T, ID> {
<S extends T> List<S> saveAll(Iterable<S> entities);
List<T> findAll();
List<T> findAllById(Iterable<ID> ids);
}
리스트 Crud
package org.springframework.data.repository;
@NoRepositoryBean
public interface CrudRepository<T, ID> extends Repository<T, ID> {
<S extends T> S save(S entity);
<S extends T> Iterable<S> saveAll(Iterable<S> entities);
Optional<T> findById(ID id);
boolean existsById(ID id);
Iterable<T> findAll();
Iterable<T> findAllById(Iterable<ID> ids);
long count();
void deleteById(ID id);
void delete(T entity);
void deleteAllById(Iterable<? extends ID> ids);
void deleteAll(Iterable<? extends T> entities);
void deleteAll();
}
Crud.
@Indexed
public interface Repository<T, ID> {
}
얘가 이제 Bean으로 만드는 거 도와주는 애임.
여기서 이제 몇가지 정리해 보면,
제너릭에서
T : 엔티티
ID : 식별타입
S : 자식 타입
주요메서드
save() : 저장
delete() : 삭제. 내부에서 em.remove() 호출
findById() : 내부에서 em.find() 호출
getOne() : 엔티티를 프록시로 조회해 옴. 지연로딩 할 때 가져오는 그 프록시 맞음. 그걸 임의로 그 상태로 가져올 수 있게 할 수 있음. 내부에서 em.getReference() 호출
findAll() : 모든 엔티티 조회. sort나 페이징 조건을 파라미터로 옵션으로 넣을 수 있음.
보면, 대부분의 DB 공통기능들은 거진 다 들어있음.
그러면 공통적이지 않은, 예를 들어 name으로 조회해 온다던지..
그걸 이제부터 알아볼 거임.
'스프링데이터 + JPA > 스프링 데이터 JPA' 카테고리의 다른 글
10. JPA 네임드 쿼리 (0) | 2023.11.20 |
---|---|
9. 메소드 이름으로 쿼리 생성 (0) | 2023.11.20 |
7. 공통 인터페이스 적용 (0) | 2023.11.19 |
6. 공통 인터페이스 설정 (0) | 2023.11.19 |
5. 순수 JPA 리포지토리 (0) | 2023.11.18 |