[Spring] repository 의존성 주입 & SimpleJpaRepository 구현체

박성우·2023년 5월 8일
0

Spring

목록 보기
2/10

userRepository와 같은 데이터베이스에 데이터를 저장하기 위한 저장소 인터페이스를 생성하고 JpaRepository를 상속받기만 하면 save와 같은 메소드를 따로 구현하지 않고도 사용할 수 있는 이유에 대한 의문이 들었다.

우리가 일반적으로 Service 단에서 save 메소드를 사용하여 DB에 Entity를 저장하고 싶을 때 다음과 같이 사용한다.

@RequiredArgsConstructor를 통해 userRepository를 주입받고, 주입받은 userRepository를 통해 save 메소드만 호출해주면 알아서 저장이 된다.

그렇다면, @RequiredArgsConstructor를 통해서 무엇이 주입되고 save 메소드는 누가 구현하는 것일까?

@RequiredArgsConstructor에 의해 무엇을 주입하고 있는지 보면

SimpleJpaRepository라는 클래스의 Proxy 객체를 주입받고 있다고 한다.

SimpleJpaRepository가 JpaRepository와 무슨 연관 관계가 있는 지 보면

SimpleJpaRepository는 JpaRepositoryImplementation이라는 인터페이스를 구현하고 있고, JpaRepositoryImplementation 인터페이스는 결과적으로 우리가 userRepository를 생성할 때 상속받는 JpaRepository를 상속받고 있다.

또한, SimpleJpaRepository에서는 다음과 같이 save 메소드를 구현하고 있다.

즉, @RequiredArgsConstructor를 통해 userRepository에 주입받는 객체는 SimpleJpaRepository라는 JpaRepository 인터페이스를 구현하는 구현체를 상속받은 Proxy 객체이고, 이를 통해 우리는 save 메소드를 구현하지 않고도 사용할 수 있는 것이다. (save 메소드 자체는 CrudRepository 인터페이스에 선언되어있고 JpaRepository가 CrudRepository를 상속받는다.)

추가적으로 userRepository에 구현체를 주입받는 과정은

  1. @EnableJpaRepositories 어노테이션이 선언된 Configuration 클래스 내에서 JpaRepository 인터페이스를 상속받은 인터페이스들을 스캔하면서 자동으로 빈으로 등록
  2. Spring Data JPA가 SimpleJpaRepository 클래스를 상속받는 구현 클래스, 즉 SimpleJpaRepository 클래스를 Target으로 삼는 Proxy 객체를 동적으로 생성하고 빈으로 등록
  3. userService 클래스에서 userRepository 인터페이스를 주입받을 때, 스프링 DI에 의해 주입

이 되는 것으로 보이는데, 이 부분은 나중에 Proxy 객체 생성 및 빈의 생성주기와 함께 더 공부해볼 필요가 있어보인다.

profile
Backend Developer

0개의 댓글