EnableJpaRepositories
EnableJpaRepositories
에서 JpaRepository를 위한 설정을 구성한다.
- 주요 설정
- basePackages: JpaRepository를 스캔할 기준 패키지
- repositoryImplementationPostfix: Custom Repository 구현의 Postfix, 기본 값은 Impl
- entityManagerFactoryRef: 엔티티 매니저 팩토리 이름, 기본 값은 entityManagerFactory
- transactionManagerRef: 트랜젝션 메니저 이름, 기본 값은 transactionManager
JpaRepositoriesRegistrar
를 임포트한다.
ImportBeanDefinitionRegistrar를 구현한 클래스로 @Configuration 클래스의 애노테이션 정보를 기반으로 추가적인 빈을 등록한다.
JpaRepositoriesRegistrar
registerBeanDefinitions
메서드 안에서 RepositoryConfigurationDelegate
를 생성하고 registerRepositoriesIn
에 JpaRepositoriesRegistrar
의 extension
과 registry
를 전달하여 JpaRepository를 등록한다.
@Override
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry,
BeanNameGenerator generator) {
// ...
RepositoryConfigurationExtension extension = getExtension();
// ...
RepositoryConfigurationDelegate delegate = new RepositoryConfigurationDelegate(configurationSource, resourceLoader,
environment);
delegate.registerRepositoriesIn(registry, extension);
}
RepositoryConfigurationDelegate
registerRepositoriesIn
메서드에서 RepositoryConfigurationDelegate
로 전달된 extension
의getRepositoryConfigurations
메서드를 통해 RepositoryConfigurationSource
를 조회한다.RepositoryConfigurationSource
를 기반으로 Repository 빈을 생성하여 registry
에 등록한다.
public List<BeanComponentDefinition> registerRepositoriesIn(BeanDefinitionRegistry registry,
RepositoryConfigurationExtension extension) {
// ...
Collection<RepositoryConfiguration<RepositoryConfigurationSource>> configurations = extension
.getRepositoryConfigurations(configurationSource, resourceLoader, inMultiStoreMode);
// Repository 빈 정의
List<BeanComponentDefinition> definitions = new ArrayList<>();
Map<String, RepositoryConfiguration<?>> configurationsByRepositoryName = new HashMap<>(configurations.size());
Map<String, RepositoryConfigurationAdapter<?>> metadataByRepositoryBeanName = new HashMap<>(configurations.size());
for (RepositoryConfiguration<? extends RepositoryConfigurationSource> configuration : configurations) {
// configuration을 기반으로 등록한 Repository 빈 정의를 구성한다.
registry.registerBeanDefinition(beanName, beanDefinition);
definitions.add(new BeanComponentDefinition(beanDefinition, beanName));
}
// ...
return definitions;
}
JpaRepositoryConfigExtension
extension
에서는 EnableJpaRepositories
에서 설정한 값을 기반으로 configSource.getCandidates(loader)
를 통해 후보를 조회한다.
이후 조회한 후보를 기반으로 생성한 RepositoryConfigurationSource
를 반환한다.
public <T extends RepositoryConfigurationSource> Collection<RepositoryConfiguration<T>> getRepositoryConfigurations(
T configSource, ResourceLoader loader, boolean strictMatchesOnly) {
// ...
Set<RepositoryConfiguration<T>> result = new HashSet<>();
for (BeanDefinition candidate : configSource.getCandidates(loader)) {
RepositoryConfiguration<T> configuration = getRepositoryConfiguration(candidate, configSource);
Class<?> repositoryInterface = loadRepositoryInterface(configuration,
getConfigurationInspectionClassLoader(loader));
if (repositoryInterface == null) {
result.add(configuration);
continue;
}
RepositoryMetadata metadata = AbstractRepositoryMetadata.getMetadata(repositoryInterface);
boolean qualifiedForImplementation = !strictMatchesOnly || configSource.usesExplicitFilters()
|| isStrictRepositoryCandidate(metadata);
if (qualifiedForImplementation && useRepositoryConfiguration(metadata)) {
result.add(configuration);
}
}
return result;
}
'스프링' 카테고리의 다른 글
Parallel Test Execution (0) | 2025.03.13 |
---|---|
Spring Modulith Scenario (0) | 2025.03.10 |
BeanPostProcessor (1) | 2025.01.16 |
@Async 정리 (1) | 2025.01.02 |
이벤트 리스너 정리 (0) | 2025.01.02 |
EnableJpaRepositories
EnableJpaRepositories
에서 JpaRepository를 위한 설정을 구성한다.
- 주요 설정
- basePackages: JpaRepository를 스캔할 기준 패키지
- repositoryImplementationPostfix: Custom Repository 구현의 Postfix, 기본 값은 Impl
- entityManagerFactoryRef: 엔티티 매니저 팩토리 이름, 기본 값은 entityManagerFactory
- transactionManagerRef: 트랜젝션 메니저 이름, 기본 값은 transactionManager
JpaRepositoriesRegistrar
를 임포트한다.
ImportBeanDefinitionRegistrar를 구현한 클래스로 @Configuration 클래스의 애노테이션 정보를 기반으로 추가적인 빈을 등록한다.
JpaRepositoriesRegistrar
registerBeanDefinitions
메서드 안에서 RepositoryConfigurationDelegate
를 생성하고 registerRepositoriesIn
에 JpaRepositoriesRegistrar
의 extension
과 registry
를 전달하여 JpaRepository를 등록한다.
@Override
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry,
BeanNameGenerator generator) {
// ...
RepositoryConfigurationExtension extension = getExtension();
// ...
RepositoryConfigurationDelegate delegate = new RepositoryConfigurationDelegate(configurationSource, resourceLoader,
environment);
delegate.registerRepositoriesIn(registry, extension);
}
RepositoryConfigurationDelegate
registerRepositoriesIn
메서드에서 RepositoryConfigurationDelegate
로 전달된 extension
의getRepositoryConfigurations
메서드를 통해 RepositoryConfigurationSource
를 조회한다.RepositoryConfigurationSource
를 기반으로 Repository 빈을 생성하여 registry
에 등록한다.
public List<BeanComponentDefinition> registerRepositoriesIn(BeanDefinitionRegistry registry,
RepositoryConfigurationExtension extension) {
// ...
Collection<RepositoryConfiguration<RepositoryConfigurationSource>> configurations = extension
.getRepositoryConfigurations(configurationSource, resourceLoader, inMultiStoreMode);
// Repository 빈 정의
List<BeanComponentDefinition> definitions = new ArrayList<>();
Map<String, RepositoryConfiguration<?>> configurationsByRepositoryName = new HashMap<>(configurations.size());
Map<String, RepositoryConfigurationAdapter<?>> metadataByRepositoryBeanName = new HashMap<>(configurations.size());
for (RepositoryConfiguration<? extends RepositoryConfigurationSource> configuration : configurations) {
// configuration을 기반으로 등록한 Repository 빈 정의를 구성한다.
registry.registerBeanDefinition(beanName, beanDefinition);
definitions.add(new BeanComponentDefinition(beanDefinition, beanName));
}
// ...
return definitions;
}
JpaRepositoryConfigExtension
extension
에서는 EnableJpaRepositories
에서 설정한 값을 기반으로 configSource.getCandidates(loader)
를 통해 후보를 조회한다.
이후 조회한 후보를 기반으로 생성한 RepositoryConfigurationSource
를 반환한다.
public <T extends RepositoryConfigurationSource> Collection<RepositoryConfiguration<T>> getRepositoryConfigurations(
T configSource, ResourceLoader loader, boolean strictMatchesOnly) {
// ...
Set<RepositoryConfiguration<T>> result = new HashSet<>();
for (BeanDefinition candidate : configSource.getCandidates(loader)) {
RepositoryConfiguration<T> configuration = getRepositoryConfiguration(candidate, configSource);
Class<?> repositoryInterface = loadRepositoryInterface(configuration,
getConfigurationInspectionClassLoader(loader));
if (repositoryInterface == null) {
result.add(configuration);
continue;
}
RepositoryMetadata metadata = AbstractRepositoryMetadata.getMetadata(repositoryInterface);
boolean qualifiedForImplementation = !strictMatchesOnly || configSource.usesExplicitFilters()
|| isStrictRepositoryCandidate(metadata);
if (qualifiedForImplementation && useRepositoryConfiguration(metadata)) {
result.add(configuration);
}
}
return result;
}
'스프링' 카테고리의 다른 글
Parallel Test Execution (0) | 2025.03.13 |
---|---|
Spring Modulith Scenario (0) | 2025.03.10 |
BeanPostProcessor (1) | 2025.01.16 |
@Async 정리 (1) | 2025.01.02 |
이벤트 리스너 정리 (0) | 2025.01.02 |