Spring/Spring Data JPA

[Spring Data JPA] 2-1. Configuration

noahkim_ 2023. 10. 18. 01:53

1. Annotation-based Configuration

  • JPA를 사용하기 위한 주요 구성 요소를 정의합니다.
  • DataSource, EntityManagerFactory, TransactionManager
@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;
    }
}

 

@EnableJpaRepositories

  • Spring Data Repository들을 스캔하여 활성화합니다. (basePackage: 스캔할 패키지 정의)
  • Repository 인터페이스에 대한 구현체를 프록시 형태로 제공합니다.

 

EntityManagerFactory

  • EntityManager 인스턴스들을 생성하고 관리하는 역할을 합니다.

 

LocalContainerEntityManagerFactoryBean
  • Spring과 JPA와의 통합에 사용됨
  • EntityManagerFactory 설정 및 관리
  • Spring의 예외 변환 매커니즘과 통합
    • JPA 예외가 Spring의 DataAccessException로 변환 (일관된 예외 처리 가능)

 

EntityManagerFactory
  • JPA 구현 생성 인터페이스입니다.
  • JPA Provider 지원
    • Hibernate: 세션 생성 및 관리

 

JpaTransactionManager

  • JPA 트랜잭션 관리
  • EntityManager 통합

 

2. Bootstrap Mode

  • Spring Data JPA의 Repository 초기화를 어떻게 처리할 것인지에 대한 정의

 

Setting

bootstrapMode (@EnableJpaRepositories attribute)
  • DEFAULT (기본값):  즉시 초기화 (애플리케이션 컨텍스트 시작 시점)
  • LAZY:  지연 초기화 (프록시 생성)
  • DEFERRED:  ContextRefreshedEvent에 응답하여 리포지토리 초기화 (애플리케이션 컨텍스트 초기화 종료 시점)

 

DEFAULT

  • Spring의 기본 빈(bean)으로 등록 (싱글턴 범위)
  • 검증 및 메타데이터 분석을 진행합니다. (JPA EntityManager와 상호 작용을 통해)

 

DEFERRED

지연 초기화 (ContextRefreshedEvent)
  • JPA EntityManagerFactory의 백그라운드 초기화 후 JPA Repository가 초기화 됨
  • Repository는 EntityManagerFactory를 의존
  • EntityManagerFactory가 완전히 초기화된 후 리포지토리가 초기화됨 (늦게 초기화 되도록)

 

JPA EntityManagerFactory의 백그라운드 초기화
  • JPA EntityManagerFactory의 초기화는 무거운 작업 (DDL, DataSource, JPA Provider 분석 등)
  • 백그라운드에서 동작 (멀티스레딩으로 처리하여 시작시간 최적화)

 

 

 

출처