[Flyway] Spring Boot는 어떻게 초기화 순서를 보장할까?DatabaseInitializationDependencyConfigurer 파헤치기

은서·2026년 1월 18일

Springboot - Flyway

목록 보기
4/7

저번 시간 내용

4장. @DependsOnDatabaseInitialization 애노테이션

  • 파일 위치
    spring-boot-3.0.4.jar
    org/springframework/boot/sql/init/dependency/DependsOnDatabaseInitialization.java
  • 프로젝트 내 실제 사용 예시

역할

  • 이 애노테이션이 붙은 Bean은 자동으로 Flyway 이후에 초기화됨
  • DatabaseInitializationDependencyConfigurer가 자동 감지
  • dependsOn이 자동으로 주입됨

5장. DatabaseInitializationDependencyConfigurer 동작 원리

시각적 다이어그램

6장. Bean Definition 검증

  • 파일 위치
    java/ssu/eatssu/global/config/BeanDependencyChecker.java
  • 실제로 dependsOn이 주입되었는지 확인

  • 출력:
    === EntityManagerFactory Bean 의존성 분석 ===
    dependsOn: [flywayInitializer]
    === FlywayInitializer Bean 의존성 분석 ===
    dependsOn: 없음

7장. LocalContainerEntityManagerFactoryBean 분석

  • 파일 위치
    spring-orm-6.0.6.jar (Spring Framework)
    org/springframework/orm/jpa/LocalContainerEntityManagerFactoryBean.java

주요 메서드

  • afterPropertiesSet() (355-373번 줄)

핵심 부분

  • Line 355: afterPropertiesSet() 시작 - InitializingBean 인터페이스 구현
  • Line 363: determinePersistenceUnitInfo() - JPA 영속성 유닛 정보 결정
  • Line 364-370: Hibernate 같은 JPA Vendor Adapter 설정
  • Line 372: super.afterPropertiesSet() 호출 → 실제 EntityManagerFactory 생성

AbstractEntityManagerFactoryBean의 afterPropertiesSet() 호출 시:

  • Hibernate 부트스트랩 시작
  • ddl-auto 전략 실행 (validate/update/create 등)
  • 스키마 검증 수행

8장. Hibernate 설정 (선택사항)

8-1. HibernateJpaAutoConfiguration

  • 파일 위치: spring-boot-autoconfigure-3.0.4-sources.jar
    org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.java

주요 애노테이션

  • @AutoConfiguration(after = DataSourceAutoConfiguration.class, before = TransactionAutoConfiguration.class)
  • @ConditionalOnClass({ LocalContainerEntityManagerFactoryBean.class, EntityManager.class, SessionImplementor.class })
  • @EnableConfigurationProperties(JpaProperties.class)
  • @Import(HibernateJpaConfiguration.class)
  • public class HibernateJpaAutoConfiguration {

특징:

  • 매우 간결한 마커 클래스
  • 실제 구현은 HibernateJpaConfiguration으로 위임

8-2. HibernateJpaConfiguration

  • 파일 위치:
    spring-boot-autoconfigure-3.0.4-sources.jar
    org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.java

클래스 선언

  • @Configuration(proxyBeanMethods = false)
  • @EnableConfigurationProperties(HibernateProperties.class)
  • @ConditionalOnSingleCandidate(DataSource.class)
  • class HibernateJpaConfiguration extends JpaBaseConfiguration {

주요 상수:

  • JTA_PLATFORM - 68번 줄
  • PROVIDER_DISABLES_AUTOCOMMIT - 70번 줄

주요 필드:

  • hibernateProperties - 79번 줄
  • defaultDdlAutoProvider - 81번 줄
  • poolMetadataProvider - 83번 줄
  • hibernatePropertiesCustomizers - 85번 줄

생성자:

  • 87-102번 줄 - 모든 의존성 주입

주요 메서드:

  • createJpaVendorAdapter() - 122-125번 줄 ⭐ HibernateJpaVendorAdapter 생성

  • getVendorProperties() - 127-133번 줄 ⭐ Hibernate 속성 반환

  • customizeVendorProperties() - 135-144번 줄 ⭐ JTA 플랫폼, 자동커밋 설정

  • configureJtaPlatform() - 146-157번 줄 - JTA 트랜잭션 매니저 설정

  • configureProviderDisablesAutocommit() - 159-163번 줄 - 자동커밋 비활성화

내부 클래스:

  • NamingStrategiesHibernatePropertiesCustomizer - 216-238번 줄

  • 물리/암시적 네이밍 전략 커스터마이징 (229-236번 줄)

9장. 실제 실행 로그 확인

  • 애플리케이션 실행 시 콘솔 로그를 캡쳐했습니다.

profile
개발자 대학생🌱

0개의 댓글