JavaConfig 설정 - 스프링 부트 사용시 생략 가능
@Configuration
@EnableJpaRepositories(vasePackages = "Repository 위치")
public class AppConfig {}
- 스프링 부트 사용시 @SpringBootApplication 위치를 지정(해당 패키지와 하위 패키지 인식)
- 만약 위치가 달라지면 @EnableJpaRepositories
스프링 데이터 JPA가 구현 클래스 대신 생성
- org.springframework.data.repository.Repository를 구현한 클래스는 스캔 대상
- MemberRepository 인터페이스가 동작한 이유
- SpringDataJpa에서 인터페이스를 보고 구현체를 만들어서 주입시킴
- 실체 출력해보기 (Proxy)
- meberRepository.getClass() -> class com.sun.proxy.$ProxyXXX
- MemberRepository 인터페이스가 동작한 이유
- @Repository 애노테이션 생략 가능
- 컴포넌트 스캔을 스프링 데이터 JPA가 자동으로 처리
- JPA 예외를 스프링 예외로 변환하는 과정도 자동으로 처리
공통 인터페이스 적용
- 스프링 데이터 JPA 기반 MemberRepository
// 첫 번째 매개변수 매핑할 entity class, 두 번째 매개변수 엔티티의 PK 자료형
public interface MemberRepository extends JpaRepository<Member, Long>{
}
- Generic
- T : 엔티티 타입
- ID : 식별자 타입(PK)
공통 인터페이스 분석 및 구성
공통 인터페이스 분석
- JpaRepository 인터페이스 : 공통 CRUD 제공
- 제네릭은 <엔티티 타입, 식별자 타입> 설정
JpaRepository 공통 기능 인터페이스
public interface JpaRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID>{
}
JpaRepository를 사용하는 인터페이스
public interface MemberRepository extends JpaRepository<Member, Long> {
}
공통 인터페이스 구성
주의 사항
- T findOne(ID) → Optional<T> findById(ID) 변경
- boolean exists(ID) → boolean existsById(ID) 변경
제네릭 타입
- T : 엔티티
- ID : 엔티티의 식별자 타입
- S : 엔티티와 그 자식 타입
주요 메서드
- save(S) : 새로운 엔티티는 저장하고 이미 있는 엔티티는 병합한다.
- delete(T) : 엔티티 하나를 삭제한다. 내부에서 EntityManager.remove()를 호출
- findById(ID) : 엔티티 하나를 조회한다. 내부에서 EntityManager.find() 호출
- getOne(ID) : 엔티티를 프록시로 조회한다. 내부에서 EntityManager.getReference() 호출
- findAll() : 모든 엔티티를 조회한다. 정렬(Sort)이나 페이징(Pageable) 조건을 파라미터로 제공할 수 있다.
getOne(ID)와 findById(ID)의 차이
- getOne(ID)는 지연 로딩, findById(ID)는 즉시 로딩
- getOne(ID)는 프록시 객체를 반환, findById(ID)는 Optional<T>로 반환
- getOne(ID)는실제로 필드에 접근하기 전에는 데이터베이스에 쿼리가 날라가지 않음
- findById(ID)는 바로 데이터베이스 쿼리가 발생
참고 :JpaRepository는 대부분의 공통 메서드를 제공한다.
'Spring > Spring Data Jpa' 카테고리의 다른 글
확장 기능 (사용자 정의 레포, Auditing, 도메인 클래스 컨버터, 페이징과 정렬) (2) | 2024.09.08 |
---|---|
쿼리 메소드 기능 (2) | 2024.09.07 |