Spring-Boot/실전! 스프링 데이터 JPA

2. 공통 인터페이스 기능

PHM 2023. 2. 17. 08:39

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

* 참조 : JPA에서 수정은 변경감지 기능을 사용하면 된다.

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

 

 

2. 공통 인터페이스 설정

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

@Configuration
@EnableJpaRepositories(basePakges = "jpabook.jpashop.repository")
public class AppConfig {}

- 스프링 부트 사용시 `@SpringBootApplication` 위치를 지정 ( 해당 패키지와 하위 패키지 인식)

- 만약 위치가 달라진다면 `@EnabledJpaRepositories` 필요

 

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

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

    ㆍMemberRepository 인터페이스가 동작한 이유

    ㆍ실제 출력해보기(Proxy)

    ㆍmemberRepository.getClass() → class com.sun.proxy.$ProxyXXX

- `@Repository` 애노테이션 생략가능

    ㆍ컴포넌트 스캔을 스프링 데이터 JPA가 자동으로 처리

    ㆍJPA 예외를 스프링 예외로 변환하는 과정도 자동으로 처리

 

3. 공통 인터페이스 적용

 

4. 공통 인터페이스 분석

- JpaRepository 인터페이스 : 공통 CRUD 제공

- 제네릭은 <엔티티 타입, 식별자 타입> 설정

 

* 공통 인터페이스 구성 *

- 스프링데이터

    ㆍ<<Interface>>Repository

    ㆍ<<Interface>>CrudReposityory

    ㆍ<<Interface>>PagingAndSortingRepository

- 스프링데이터 JPA

    ㆍ<<Interface>>JpaRepository

 

*주의*

- `T findOne(ID)` → `Optional<T> findById(ID)` 변경

 

*제네릭 타입*

- `T` : 엔티티

- `ID` : 엔티티의 식별자 타입

- `S` : 엔티티와 그 자식 타입

 

*주요 메서드*

- `save(S)` : 새로운 엔티티는 저장하고 이미 있는 엔티티는 병합한다.

- `delete(T)` : 엔티티 하나를 삭제한다. 내부에서 `EntitiyManager.remove()` 호출

- `findById(ID)` : 엔티티 하나를 조회한다. 내부에서 `EntitiyManager.find()` 호출

- `getOne(ID)` : 엔티티를 프록시로 조회한다. 내부에서 `EntityManager.getReference()` 호출

- `findAll(...)` : 모든 엔티티를 조회한다. 정렬(`Sort`)이나 페이징(`Pageable`) 조건을 파라미터로 제공할 수 있다.

 

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