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에 구현체를 주입받는 과정은
이 되는 것으로 보이는데, 이 부분은 나중에 Proxy 객체 생성 및 빈의 생성주기와 함께 더 공부해볼 필요가 있어보인다.