Configuration
2024. 10. 19. 19:04ㆍSpring Boot/Spring Data JPA
Spring Data JPA를 설정하는 방법에는 두 가지가 있습니다:
- Annotation-based Configuration (Java configuration)
- Spring Namespace (XML configuration)
여기서는 첫 번째인 Annotation-based Configuration을 설명합니다.
Annotation-based Configuration (JavaConfig)
Spring Data JPA 리포지토리 지원은 JavaConfig 또는 XML 네임스페이스를 사용하여 활성화할 수 있습니다. 아래는 JavaConfig를 사용하는 예시입니다:
@Configuration
@EnableJpaRepositories
@EnableTransactionManagement
class ApplicationConfig {
@Bean
public DataSource dataSource() {
EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
return builder.setType(EmbeddedDatabaseType.HSQL).build();
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setGenerateDdl(true);
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(vendorAdapter);
factory.setPackagesToScan("com.acme.domain");
factory.setDataSource(dataSource());
return factory;
}
@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
JpaTransactionManager txManager = new JpaTransactionManager();
txManager.setEntityManagerFactory(entityManagerFactory);
return txManager;
}
}
설명:
- Embedded HSQL 데이터베이스 설정:
EmbeddedDatabaseBuilder
API를 사용하여 HSQL 데이터베이스를 내장 형태로 설정합니다. - EntityManagerFactory 설정:
LocalContainerEntityManagerFactoryBean
을 통해 Hibernate를 JPA의 persistence provider로 설정하고,factory.setPackagesToScan("com.acme.domain")
를 사용해 도메인 엔티티가 위치한 패키지를 스캔합니다. - JpaTransactionManager 설정:
JpaTransactionManager
를 사용하여 트랜잭션 관리를 설정합니다. - @EnableJpaRepositories: Spring Data JPA 리포지토리 활성화는 이 어노테이션을 통해 수행되며, 별도로 지정하지 않으면 현재 설정 클래스가 위치한 패키지를 기본값으로 사용하여 리포지토리를 찾습니다.
중요한 점:
- LocalContainerEntityManagerFactoryBean을 직접 생성해야 합니다. 이는 단순히
EntityManagerFactory
를 생성하는 것뿐만 아니라 예외 변환 메커니즘에도 참여하기 때문입니다.
Bootstrap Mode (부트스트랩 모드)
Spring Data JPA 리포지토리는 기본적으로 Spring 빈으로 등록되며 싱글톤 범위이고 초기화 시점에 즉시 생성됩니다. 이는 JPA EntityManager
와 상호작용하여 검증 및 메타데이터 분석을 진행합니다. Spring Framework는 JPA EntityManagerFactory
를 백그라운드 스레드에서 초기화할 수 있는 기능을 제공하는데, 이 초기화 과정은 Spring 애플리케이션의 시작 시 상당한 시간을 소모하기 때문입니다.
이를 효과적으로 사용하려면 JPA 리포지토리가 가능한 늦게 초기화되도록 설정하는 것이 좋습니다. Spring Data JPA 2.1부터는 부트스트랩 모드를 설정할 수 있으며, 이는 @EnableJpaRepositories
어노테이션이나 XML 네임스페이스를 통해 구성할 수 있습니다. 부트스트랩 모드는 다음과 같은 값들을 가질 수 있습니다:
- DEFAULT (기본값): 리포지토리는 즉시 초기화됩니다. 만약 리포지토리가
@Lazy
어노테이션으로 선언되지 않으면 기본적으로 eager initialization이 발생합니다. 즉, 클라이언트 빈에서 리포지토리 인스턴스를 필요로 하면 해당 리포지토리는 즉시 초기화됩니다. - LAZY: 모든 리포지토리 빈이 암묵적으로 지연 초기화됩니다. 이는 클라이언트 빈에 리포지토리 인스턴스가 단순히 필드에 저장될 때, 해당 리포지토리는 초기화되지 않으며, 첫 번째 상호작용 시에만 초기화 및 검증이 이루어집니다.
- DEFERRED: 기본적으로 LAZY와 동일하지만, 리포지토리 초기화가
ContextRefreshedEvent
에 응답하여 트리거됩니다. 이는 애플리케이션이 완전히 시작되기 전에 리포지토리가 검증되도록 합니다.
추천 사항:
- 비동기 JPA 부트스트랩을 사용하지 않을 경우: 기본 부트스트랩 모드(DEFAULT)를 유지하는 것이 좋습니다.
- 비동기 JPA 부트스트랩을 사용할 경우: DEFERRED 모드가 합리적인 기본값입니다. 이 설정은
EntityManagerFactory
설정이 시간이 걸리더라도 Spring Data JPA 부트스트랩이 그 과정을 기다리도록 하며, 모든 애플리케이션 구성 요소가 초기화된 후에도 리포지토리가 제대로 검증되도록 보장합니다. - 테스트 시나리오 및 로컬 개발에서: LAZY 모드는 테스트나 로컬 개발 환경에서 적절한 선택입니다. 모든 리포지토리가 제대로 부트스트랩되는지 확인할 필요가 없거나 특정 애플리케이션 부분만을 사용하는 경우, 리포지토리 검증은 초기화 시간을 불필요하게 증가시킬 수 있습니다.
'Spring Boot > Spring Data JPA' 카테고리의 다른 글
Defining Query Methods (0) | 2024.10.19 |
---|---|
Persisting Entities (0) | 2024.10.19 |
Defining Repository Interfaces (0) | 2024.10.19 |
Core concepts (0) | 2024.10.19 |
Getting Started (0) | 2024.10.19 |