Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- SpringBoot
- 김영한
- pointcut
- JDBC
- QueryDSL
- 인프런
- 자바
- 스프링 핵심 원리
- 알고리즘
- Thymeleaf
- kotlin
- jpa
- Servlet
- 스프링
- transaction
- 백준
- Exception
- http
- java
- 스프링 핵심 기능
- Proxy
- db
- 그리디
- AOP
- Android
- Spring Boot
- JPQL
- Greedy
- spring
- springdatajpa
Archives
- Today
- Total
개발자되기 프로젝트
공통 인터페이스 설정, 적용, 분석 본문
1. 공통 인터페이스 설정
- JavaConfig 설정- 스프링 부트 사용시 생략 가능(JpaRepository가 있는 pacakge 지정)
@Configuration
@EnableJpaRepositories(basePackages = "jpabook.jpashop.repository")
public class AppConfig {}
- 스프링 부트 사용시 @SpringBootApplication 위치를 지정(해당 패키지와 하위 패키지 인식)
- 만약 위치가 달라지면 @EnableJpaRepositories 필요
2. Spring Data JPA 동작 방식
- Spring이 JpaRepository를 상속받은 interface의 구현체를 만들어서 주입.
- org.springframework.data.repository.Repository 를 구현한 클래스는 스캔 대상
- 따라서 @Repository 생략 가능.
- MemberRepository 인터페이스가 동작한 이유
- 실제로 MemberRepository의 class를 출력해 보면 Proxy인 것을 확인할 수 있다.
- memberRepository.getClass() class com.sun.proxy.$ProxyXXX
- @Repository 애노테이션 생략 가능
- @Repository 기능.
- 컴포넌트 스캔을 스프링 데이터 JPA가 자동으로 처리
- JPA 예외를 스프링 예외로 변환하는 과정도 자동으로 처리
3. 공통 인터페이스 적용
SpringDataJPA를 활용한 테스트를 실행해보자
@Test
public void basicCRUD(){
Member member1 = new Member("member1");
Member member2 = new Member("member2");
memberRepository.save(member1);
memberRepository.save(member2);
Member findMember1 = memberRepository.findById(member1.getId()).get();
Member findMember2 = memberRepository.findById(member2.getId()).get();
//단건조회 검증
Assertions.assertThat(findMember1.getId()).isEqualTo(member1.getId());
Assertions.assertThat(findMember1.getUserName()).isEqualTo(member1.getUserName());
Assertions.assertThat(findMember2.getId()).isEqualTo(member2.getId());
Assertions.assertThat(findMember2.getUserName()).isEqualTo(member2.getUserName());
//리스트 조회 검증
List<Member> all = memberRepository.findAll();
Assertions.assertThat(all.size()).isEqualTo(2);
long count = memberRepository.count();
Assertions.assertThat(all.size()).isEqualTo(count);
//삭제
memberRepository.delete(member1);
memberRepository.delete(member2);
long deleteCount = memberRepository.count();
Assertions.assertThat(deleteCount).isEqualTo(0);
}
앞선 글에서 작성한 test와 동일하다. 단지 JPA에서 SpringDataJPA로 변경한것.
4. 공통 인터페이스 분석.
- JpaRepository.interface를 분석해보자.
- package org.springframework.data.jpa.repository;
- Springdata 프로젝트가 공통 프로젝트임
- 그 중 JPA에 특화된 프로젝트가 SpringdataJPA
- Springdata.Mongo 등 다른 프로젝트도 있음.
- PagingAndSortingRepository?? : 얘도 공통 repository
- 기본적으로 paging, sorting 기능 제공하는데, 공통인터페이스로 제공됨.
@NoRepositoryBean
public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
- PagingAndSortingRepository는 CrudRepository를 상속받는다.
NoRepositoryBean
public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> {
- 그리고 CrudRepository는 Repository를 상속받는다.
@NoRepositoryBean
public interface CrudRepository<T, ID> extends Repository<T, ID> {
- Repository
- General purpose is to hold type information as well as being able to discover interfaces
- that extend this one during classpath scanning for easy Spring bean creation.
- 즉 Repository 인터페이스는 해당 인터페이스를 상속받은 인터페이스는 스캔할 때 쉽게 찾을수 있도록함.
@Indexed
public interface Repository<T, ID> {
5. 주요 메서드
- save(S) : 새로운 엔티티는 저장하고 이미 있는 엔티티는 병합한다.
- delete(T) : 엔티티 하나를 삭제한다. 내부에서 EntityManager.remove() 호출
- findById(ID) : 엔티티 하나를 조회한다. 내부에서 EntityManager.find() 호출
- getOne(ID) : 엔티티를 프록시로 조회한다. 내부에서 EntityManager.getReference() 호출
- findAll(…) : 모든 엔티티를 조회한다. 정렬( Sort )이나 페이징( Pageable ) 조건을 파라미터로 제공.
6. GitHub : 210828 Common Repository
'인프런 > [인프런] Spring Data JPA' 카테고리의 다른 글
JPA NamedQuery (0) | 2021.08.28 |
---|---|
쿼리 메서드 (0) | 2021.08.28 |
공통 인터페이스 기능 : 순수 jpa기반 repository (0) | 2021.08.28 |
예제 도메인 모델과 동작 확인하기. (0) | 2021.08.27 |
세팅하기 (0) | 2021.08.27 |
Comments