Configuration

2024. 10. 19. 19:04Spring Boot/Spring Data JPA

Spring Data JPA를 설정하는 방법에는 두 가지가 있습니다:

  1. Annotation-based Configuration (Java configuration)
  2. 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