[Spring Data JPA] 1. 공통 인터페이스

HJ·2024년 2월 29일
0

Spring Data JPA

목록 보기
1/4
post-thumbnail

김영한 님의 실전! 스프링 데이터 JPA 강의를 보고 작성한 내용입니다.


1. 공통 인터페이스

1-1. 인터페이스

public interface MemberRepository extends JpaRepository<Member, Long> { }

Spring Data JPA 를 사용할 때는 위처럼 JpaRepository 인터페이스를 상속받는 인터페이스를 만들어 사용합니다. 이 인터페이스를 사용하면 이전에 JPA 를 이용한 구현체가 하던 작업들을 수행할 수 있습니다.

인터페이스만 만들고, 구현체는 만들지 않았는데 테스트 코드에서 MemberRepository 를 주입 받고, 출력해보면 아래처럼 결과가 나오게 됩니다.

memberRepository = class jdk.proxy3.$Proxy122

구현체를 만들지 않았는데 프록시 객체가 출력됩니다. 이것은 Spring Data JPA 가 인터페이스를 보고 구현 클래스를 만들어서 넣어준 것입니다.


이를 그림으로 보면 위와 같은데 애플리케이션 로딩 시점에 Spring Data JPA 관련 인터페이스를 가지고 있으면 구현 클래스를 만들게 됩니다.

@Repository 은 컴포넌트 스캔의 대상이 되도록 하고, JPA 예외를 스프링 예외로 변환해주는데 Spring Data JPA 가 컴포넌트 스캔까지 자동으로 처리해주기 때문에 @Repository 를 생략할 수 있고, 예외 변환도 자동으로 처리해줍니다.


1-2. 인터페이스 분석

package org.springframework.data.jpa.repository;

@NoRepositoryBean
public interface JpaRepository<T, ID> extends ListCrudRepository<T, ID>, 
                                            ListPagingAndSortingRepository<T, ID>, 
                                            QueryByExampleExecutor<T> {
    ...
}

Repositroy 인터페이스를 생성할 때 상속 받는 JpaRepository 를 살펴보면 위와 같습니다. T 는 엔티티 타입을 의미하고, ID 는 식별자 타입을 의미합니다.

패키지를 보면 springframework.data.jpa 인 것을 볼 수 있는데 Spring data 프로젝트는 기본적으로 공통의 CRUD 를 제공하는데 그 중에서 JPA 특화된 기능들이 있는 곳이 JpaRepository 입니다.

JpaRepository 가 상속 받는 ListPagingAndSortingRepository 를 보면 springframework.data.repository 패키지에 속해있는 것을 확인할 수 있는데 paging 과 sorting 은 어떤 RDB 에서도 제공하는 기본 기능이기 때문에 공통 인터페이스가 제공됩니다.

또 ListCrudRepository 를 들어가보면 CrudRepository 를 상속 받는 것을 확인할 수 있는데 바로 여기에 save(), findById(), count() 와 같은 기본 CRUD 메서드들이 존재합니다.

delete(), findById() 같은 메서드들은 내부에서 EntityManager.remove(), EntityManger.find() 와 같은 메서드들을 호출해서 삭제, 조회 기능을 제공해줍니다.

profile
공부한 내용을 정리해서 기록하고 다시 보기 위한 공간

0개의 댓글