인터페이스 설정
JavaConfig 설정- 스프링 부트 사용시 생략 가능
@Configuration
@EnableJpaRepositories(basePackages = "jpabook.jpashop.repository")
public class AppConfig {}
- 스프링 부트 사용시 @SpringBootApplication 위치를 지정(해당 패키지와 하위 패키지 인식)
- 만약 위치가 달라지면 @EnableJpaRepositories 필요
스프링 데이터 JPA가 구현 클래스 대신 생성
org.springframework.data.repository.Repository. 를 구현한 클래스는 스캔 대상
- ItemRepository 인터페이스가 동작하는 이유이다.
- 애플리케이션 로딩 시점에 Spring Data JPA와 관련된 인터페이스를 가지고 있으면 구현 클래스를 만들어서 주입해줌.
- 구현된 클래스는 Proxy 클래스이다.
- 개발자가 직접 구현체를 만들지 않아도 된다.
@Repository 애노테이션 생략 가능
- 컴포넌트 스캔을 스프링 데이터 JPA가 자동으로 처리
- JPA 예외를 스프링 예외로 변환하는 과정도 자동으로 처리
인터페이스 적용
스프링 데이터 JPA 기반 MemberRepository
Generic
- T: 엔티티 타입
- ID: 식별자 타입(PK)
인터페이스 분석
JpaRepository 공통 기능 인터페이스
JpaRepository 를 사용하는 인터페이스
공통 인터페이스 구성
변경점
- T findOne(ID) ➔ Optional<T> findById(ID) 변경
- boolean exists(ID) ➔ boolean existsById(ID) 변경
제네릭 타입
- T : 엔티티
- ID : 엔티티의 식별자 타입
- S : 엔티티와 그 자식 타입
주요 메서드
- save(S) : 새로운 엔티티는 저장하고 이미 있는 엔티티는 병합한다.
- delete(T) : 엔티티 하나를 삭제한다. 내부에서 EntityManager.remove() 호출
- findById(ID) : 엔티티 하나를 조회한다. 내부에서 EntityManager.find() 호출
- getOne(ID) : 엔티티를 프록시로 조회한다. 내부에서 EntityManager.getReference() 호출
- findAll(…) : 모든 엔티티를 조회한다. 정렬( Sort )이나 페이징( Pageable ) 조건을 파라미터로 제공할 수 있다.
이렇듯 JpaRepository 는 대부분의 공통 메서드(기능)를 제공한다.
하지만 공통 기능이 아닌 커스텀 기능을 만드는 방법은 무엇일까? - (쿼리 메서드 기능)
'JPA' 카테고리의 다른 글
[Spring Data JPA] 쿼리 메서드 기능 (0) | 2024.11.11 |
---|---|
[JPA 사용법] JPQL (0) | 2024.10.30 |
[JPA 사용법] 값 타입 (0) | 2024.10.30 |
[JPA 사용법] 영속성 전이 CASCADE, 고아 객체 (0) | 2024.10.30 |
[JPA 사용법] 즉시 로딩과 지연 로딩 (0) | 2024.10.30 |