Spring/Spring Data Jpa

Spring Data Jpa 공통 인터페이스 설정, 적용 및 분석

taey 2024. 9. 5. 17:40

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
  • @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는 대부분의 공통 메서드를 제공한다.