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

윤경·2021년 11월 5일
0

JPA

목록 보기
16/22
post-thumbnail

[1] 순수 JPA 기반 리포지토리 만들기

기본 CRUD

  • 저장
  • 변경 > 변경감지 사용(dirty check)
  • 삭제
  • 전체 조회
  • 단건 조회
  • 카운트

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

테스트 결과


[2] 공통 인터페이스 설정

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

org.springframework.data.repository.Repository를 구현한 클래스는 스캔 대상 ➡️ MemberRepository 인터페이스가 동작한 이유임

@Repotiroty 애노테이션 생략 가능

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

[3] 공통 인터페이스 적용

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

단축키

shift + fn + F6: 같은 이름 다 한꺼번에 바꾸기

순수 JPA기반 테스트에서 사용했던 코드를 스프링 데이터 JPA 리포지토리 기반 테스트로 변경해도 동일한 방식으로 동작함

➡️ MemberJpaRepositoryTest의 basicCRUD()를 MemberRepositoryTest에 그대로 적용시켜 돌렸을 때도 성공
미리 이름을 맞춰두었음


[4] 공통 인터페이스 분석

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

공통 인터페이스 구성

T findOne(ID)Optional<T> findById(ID) 변경

제네릭 타입

  • T: 엔티티
  • ID: 엔티티의 식별자 타입
  • S: 엔티티와 그 자식 타입

주요 메소드

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

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


profile
개발 바보 이사 중

0개의 댓글