-
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` 는 대부분의 공통 메서드를 제공한다.
'Spring-Boot > 실전! 스프링 데이터 JPA' 카테고리의 다른 글
6. 나머지 기능들 (0) 2023.02.24 5. 스프링 데이터 JPA 분석 (0) 2023.02.23 4. 확장 기능 (0) 2023.02.23 3. 쿼리 메소드 기능 (0) 2023.02.22 1. 프로젝트 환경 설정 & 2. 예제 도메인 모델과 동작 확인 (0) 2023.02.15