Summary: JPA Repository 생성은 spring-data-jpa를 사용하면 인터페이스로 선언해서 사용할 수 있다. 하지만 메서드들은 직접 구현하지 않아도 된다. 대신 SimpleJpaRepository에 구현되어 있다. JpaRepositoryFactory 클래스가 개발자가 정의한 인터페이스를 참조하여 JpaRepository를 대신 구현하며, RepositoryFactorySupport를 확장하여 getRepository를 상속 받는다. 최종적으로 Bean으로 생성되는 CountryRepository는 Proxy Repository 인스턴스이며, SimpleJpaRepository가 뒤에서 JpaRepository 인터페이스의 실 구현체를 제공한다.
spring-data-jpa에는 JPARepository를 생성하는 JpaRepositoryFactory 클래스가 존재하는데 개발자가 정의한 CountryRepository 인터페이스를 참조하여 JpaRepository를 대신 구현하는 역할을 한다. (View Highlight)
CountryRepository 인터페이스는 자체는 사실 껍데기에 불과하다. spring-data-jpa에는 JPARepository를 생성하는 JpaRepositoryFactory 클래스가 존재하는데 개발자가 정의한 CountryRepository 인터페이스를 참조하여 JpaRepository를 대신 구현하는 역할을 한다. (View Highlight)
RepositoryFactorySupport를 확장하여 다양한 spring-data-XXX에서 Repository를 생성한다. RepositoryFactorySupport에는 getRepository라는 Repository 인스턴스를 생성하는 메서드가 기본으로 정의돼 있다. (View Highlight)
이 메서드는 Repository 인터페이스를 구현한 Proxy를 생성한다. JpaRepositoryFactory는 부모 클래스의 메서드인 getRepository를 상속 받는다. (View Highlight)
Note: JpaRepository로 생성이 될 경우 프록시 패턴에서 실행하는 구현체를 SimpleJpaRepository 객체로 반환
Proxy 인스턴스의 target이 TargetRepository였구나! 즉 Proxy로 생성된 Repository 인스턴스의 target 인스턴스가 SimpleJpaRepository의 인스턴스였다는걸 알게 됐다. 그렇다면 SimpleJpaRepository가 뒤에서 JpaRepository 인터페이스의 실 구현체를 제공한다는 의미이다. (View Highlight)
최종적으로 Bean으로 생성되는 CountryRepository는 Proxy 인스턴스이다(Proxy Repository).