스프링데이터 JPA는 어떻게 동작할까?


스프링 데이터 JPA에서 DB와 데이터를 주고받는 Repository 인터페이스가 있습니다.

여기서 신기한점은 이 리포지토리는 따로 애노테이션을 통해 Dependency Injection이 되는것도 아닌 것 같고, 구현체 정의를 한적도 없는데

JpaRepository를 상속받기만하면 해당 타입의 객체도 만들어지고 해당 타입의 빈(bean)도 등록이 됩니다.

과연 스프링데이터JPA에서 인터페이스 타입의 인스턴스는 누가 만들어주는 것일까?

JpaRepository 역시 인터페이스이고 사용하게 되는 기능(메서드)들도 정의만 되어있는데 실제로 동작을 하는걸 볼 수 있습니다.

Proxy

⇒ 핵심은 리플렉션 패키지 내부에 있는 프록시(proxy)클래스 입니다.

스프링데이터JPA에서는 스프링 AOP를 쓰고있고, 스프링AOP가 프록시의 코드를 조금 더 추상화 한 (ProxyFactory)를 제공하는데, 이 프록시 팩토리가 자바의 다이나믹프록시를 좀 더 추상화 해 놓은 스프링 AOP의 핵심 클래스입니다.

스프링 데이터 JPA는 RepositoryFactorySupport에서 사용합니다.

ProxyFactory result = new ProxyFactory();
result.setTarget(target);
result.setInterfaces(repositoryInterface, Repository.class, TransactionalProxy.class);

⇒ RepositoryFactorySupport 내부의 코드로 프록시 객체를 만들어주는 부분입니다. 여기서 만들어주는 프록시 객체가 빈으로 등록이 되서

프로젝트 내부에 @Autowired 등등으로 선언된 곳에 주입됩니다.


프록시 패턴