Skip to content

Repository

⚠️ Spring Data 라이브러리를 직접 구현하며 얻은 지식들을 정리한 문서이므로, 내용 상에 오류가 있을 수도 있습니다.

Spring Data를 사용하면 인터페이스만 정의하는 것으로 Repository를 사용할 수 있다. 해당 문서에서는 어떻게Repository가 빈으로 생성되는 지에 대해 다룬다.

Proxy Repository

사용자가 정의한 인터페이스가 빈으로 등록되는 원리는 Proxy에 있다. Repository에 대한 기본 구현을 BaseClass로 하여 추가적인 사용자 정의 로직을 담은 Proxy Repository를 만드는 것이다.

  • 일반적으로 각 Spring Data 구현체 별 BaseClassSimpleXXXRepository라는 이름으로 구현된다.
  • Query Methods로 정의한 로직은 동적 생성되어 프록시 객체에 담긴다.
  • 따라서 생성되는 프록시 객체는 기본 구현 + 사용자 정의 로직을 수행할 수 있다.

RepositoryFactory

RepositoryFactory는 이러한 Proxy Repository의 생성을 담당하며, 추상 클래스인 RepositoryFactorySupport로 구현된다.

public <T> T getRepository(Class<T> repositoryInterface, RepositoryFragments fragments)

RepositoryFactorySupport#getRepository 메서드는 Repository 인터페이스를 전달받고 Repository 구현을 반환한다. 내부적으로 프록시 객체를 생성하는 로직이 담겨 있다.

RepositoryFactoryBean

다만 일반적으로 RepositoryFactory직접 사용하지 않는다. 대신 스프링에서는 RepsitoryFactoryBean라는 클래스가 초기화되는 시점(afterPropertiesSet)에 RepositoryFactory#getRepository를 호출하도록 제공하고 있다.

이렇게 사용하는 이유에 대해서는 공식 문서에서 찾아볼 수 있는데, FactoryBean 인터페이스를 제공하면 Spring configuration을 통한 Repository 설정이 쉽기 때문이다. RepositoryFactoryBean 또한 마찬가지로 구현은 추상 클래스인 RepositoryFactoryBeanSupport를 사용한다.

Spring Data KeyValue를 사용한 구현체의 경우 별도 구현 없이 제공되는 구현을 사용해도 된다.
- KeyValueRepositoryFactory
- KeyValueRepositoryFactoryBean


Last update : 8 novembre 2023
Created : 8 novembre 2023