Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
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
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

공통 인터페이스 설정, 적용, 분석 본문

인프런/[인프런] Spring Data JPA

공통 인터페이스 설정, 적용, 분석

Seung__ 2021. 8. 28. 09:38

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


 

GitHub - bsh6463/SpringDataJpa

Contribute to bsh6463/SpringDataJpa development by creating an account on GitHub.

github.com

 

'인프런 > [인프런] 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