본문 바로가기

JPA

[Spring Data JPA] 공통 인터페이스 기능

인터페이스 설정

JavaConfig 설정- 스프링 부트 사용시 생략 가능

@Configuration
@EnableJpaRepositories(basePackages = "jpabook.jpashop.repository")
public class AppConfig {}
  • 스프링 부트 사용시 @SpringBootApplication 위치를 지정(해당 패키지와 하위 패키지 인식)
  • 만약 위치가 달라지면 @EnableJpaRepositories 필요

 

스프링 데이터 JPA가 구현 클래스 대신 생성

 

org.springframework.data.repository.Repository. 를 구현한 클래스는 스캔 대상

  • ItemRepository 인터페이스가 동작하는 이유이다.
  • 애플리케이션 로딩 시점에 Spring Data JPA와 관련된 인터페이스를 가지고 있으면 구현 클래스를 만들어서 주입해줌.
  • 구현된 클래스는 Proxy 클래스이다.
  • 개발자가 직접 구현체를 만들지 않아도 된다.

@Repository 애노테이션 생략 가능

  • 컴포넌트 스캔을 스프링 데이터 JPA가 자동으로 처리
  • JPA 예외를 스프링 예외로 변환하는 과정도 자동으로 처리

인터페이스 적용

스프링 데이터 JPA 기반 MemberRepository

 

Generic

  • T: 엔티티 타입
  • ID: 식별자 타입(PK)

인터페이스 분석

 

JpaRepository 공통 기능 인터페이스

 

JpaRepository 를 사용하는 인터페이스

 

 

공통 인터페이스 구성

 

변경점

  • 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 ) 조건을 파라미터로 제공할 수 있다.

이렇듯 JpaRepository 는 대부분의 공통 메서드(기능)를 제공한다.

하지만 공통 기능이 아닌 커스텀 기능을 만드는 방법은 무엇일까? - (쿼리 메서드 기능)