Search
Duplicate

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

날짜
2022/05/03 07:46
상태
실전! 스프링 데이터 JPA
속성 1
Spring
JAVA
JPA
JPA-DATA
JPQL
담당자
목차

공통 인터페이스 기능

순수 JPA 기반 리포지토리 만들기
스프링 데이터 JPA 공통 인터페이스 소개
스프링 데이터 JPA 공통 인터페이스 활용

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

순수한 JPA 기반 리포지토리를 만들자
기본 CRUD
저장
변경 → 변경감지 사용
삭제
전체 조회
단건 조회
카운트
참고: JPA에서 수정은 변경감지 기능을 사용하면 된다.
트랜잭션 안에서 엔티티를 조회한 다음에 데이터를 변경하면, 트랜잭션 종료 시점에 변경감지 기능이 작동해서 변경된 엔티티를 감지하고 UPDATE SQL을 실행한다.
순수 JPA 기반 리포지토리 - 회원
Code
순수 JPA 기반 리포지토리 - 팀
Code
회원 리포지토리와 거의 동일하다.
순수 JPA기반 리포지토리 테스트
Code
기본 CRUD를 검증한다.

공통 인터페이스 설정

javaConfig 설정 - 스프링 부트 사용시 생략 가능
@Configuration @EnableJpaRepositories(basePackages = "jpabook.jpashop.repository") public class AppConfig {}
Java
복사
스프링 부트 사용시 @SpringBootApplication 위치를 지정(해당 패키지와 하위 패키지 인식)
만약 위치가 달라지면 @EnableJpaRepositories 필요
스프링 데이터 JPA가 구현 클래스 대신 생성
org.springframework.data.repository.Repository를 구현한 클래스는 스캔 대상
MemberRepository 인터페이스가 동작한 이유
실제 출력해보면 Proxy가 노출
memberRepository.getClass() → class com.sun.proxy.$ProxyXXX
@Repository 애노테이션 생량 가능
컴포넌트 스캔을 스프링 데이터 JPA가 자동으로 처리
JPA예외를 스프링 예외로 변환하는 과정도 자동으로 처리

공통 인터페이스 적용

순수 JPA로 구현한 MemberJpaRepository 대신에 스프링 데이터 JPA가 제공하는 공통 인터페이스 사용
스프링 데이터 JPA 기반 MemberRepository
public interface MemberRepository extends JpaRepository<Member, Long> { }
Java
복사
MemberRepository 테스트
Code
기존 순수 JPA 기반 테스트에서 사용했던 코드를 그대로 스프링 데이터 JPA 리포지토리 기반 테스트로 변경해도 동일한 방식으로 동작
TeamRepository 생성
Code
TeamRepository는 테스트 생략
Generic
T: 엔티티 타입
ID: 식별자 타입(PK)

공통 인터페이스 분석

JpaRepository 인터페이스: 공통 CRUD 제공
제네릭은 <엔티티 타입, 식별자 타입> 설정
*JpaRepository 공통 기능 인터페이스*
public interface JpaRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID> { ... }
Java
복사
*JpaRepository를 사용하는 인터페이스*
public interface MemberRepository extends JpaRepository<Member, Long> { }
Java
복사
공통 인터페이스 구성
주의
T findOne(ID)Optional<T> findById(ID) 변경
제네릭 타입
T: 엔티티
ID : 엔티티의 식별자 타입
s: 엔티티와 그 자식 타입
주요메서드
save(s): 새로운 엔티티는 저장하고 이미 있는 엔티티는 병합한다.
delete(T): 엔티티 하나를 삭제한다. 내부에서 EntityManager.remove() 호출
findById(ID): 엔티티 하나를 조회한다. 내부에서 EntityManager.find() 호출
getOne(ID): 엔티티를 프록시로 조회한다. 내부에에서 EntityManager.getReference() 호출
findAll(_): 모든 엔티티를 조회한다. 정렬(Sort)나 페이징(Pageable) 조건을 파라미터로 제공할 수 있다.
참고: JpaRepository는 대부분의 공통 메서드를 제공한다.