ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2. 공통 인터페이스 기능
    Spring-Boot/실전! 스프링 데이터 JPA 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` 는 대부분의 공통 메서드를 제공한다.

    댓글

Designed by Tistory.