스프링 데이터 JPA - 공통 인터페이스 기능

HOONEY·2022년 5월 27일
0

Java

목록 보기
15/20
post-thumbnail

김영한님의 실전! 스프링 데이터 JPA 정리

순수 JPA 기반 리포지토리 만들기

  • 순수한 JPA 기반 리포지토리를 만들자
  • 기본 CRUD
  1. 저장
  2. 변경 -> 변경감지 사용
  3. 삭제
  4. 전체 조회
  5. 단건 조회
  6. 카운트

참고: JPA에서 수정은 변경감지 기능을 사용하면 된다.
트랜잭션 안에서 엔티티를 조회한 다음에 데이터를 변경하면, 트랜잭션 종료 시점에 변경감지 기능이 작동해서 변경된 엔티티를 감지하고 UPDATE SQL을 실행한다.

공통 인터페이스 설정

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

  • 스프링 부트 사용 시 @SpringBootApplication 위치를 지정(해당 패키지와 하위 패키지 인식)
  • 만약 위치가 달라지면 @EnableJpaRepositories 필요
  • 스프링 데이터 JPA가 구현 클래스 대신 생성

  • org.springframework.data.repository.Repository를 구현한 클래스는 스캔 대상
    -> memberRepository.getClass() 결과 class com.sun.proxy.$ProxyXXX
  • @Repository 어노테이션 생략 가능
  1. 컴포넌트 스캔을 스프링 데이터 JPA가 자동으로 처리
  2. JPA 예외를 스프링 예외로 변환하는 과정도 자동으로 처리

공통 인터페이스 적용

  • 순수 JPA로 구현한 MemberJpaRepository 대신에 스프링 데이터가 JPA가 제공하는 공통 인터페이스 사용
  • 스프링 데이터 JPA 기반 MemberRepository

공통 인터페이스 분석

  • JpaRepository 인터페이스: 공통 CRUD 제공
  • 제네릭은 <엔티티 타입, 식별자 타입> 설정

공통 인터페이스 구성

  • 주의

  • T findOne(ID) -> Optional findById(ID) 변경
  • 제네릭 타입

  • T: 엔티티
  • ID: 엔티티의 식별자 타입
  • S: 엔티티와 그 자식 타입
  • 주요 메소드

  • save(S): 새로운 엔티티는 저장하고 이미 있는 엔티티는 병합한다.
  • delete(T): 엔티티 하나를 삭제한다. 내부에서 EntityManager.remove() 호출
  • findById(ID): 엔티티 하나를 조회한다. 내부에서 EntityManager.find() 호출
  • getOne(ID): 엔티티를 프록시로 조회한다. 내부에서 EntityManager.getReference() 호출
  • findAll(...): 모든 엔티티를 조회한다. 정렬이나 페이징 조건을 파라미터로 제공할 수 있다.

참고: JpaRepository는 대부분의 공통 메소드를 제공한다.

profile
기록하는 블로그

0개의 댓글