[Flyway] Spring Boot는 어떻게 초기화 순서를 보장할까?DatabaseInitializationDependencyConfigurer 파헤치기
저번 시간 내용
4장. @DependsOnDatabaseInitialization 애노테이션
- 파일 위치
spring-boot-3.0.4.jar
org/springframework/boot/sql/init/dependency/DependsOnDatabaseInitialization.java
- 프로젝트 내 실제 사용 예시

역할
- 이 애노테이션이 붙은 Bean은 자동으로 Flyway 이후에 초기화됨
- DatabaseInitializationDependencyConfigurer가 자동 감지
- dependsOn이 자동으로 주입됨
시각적 다이어그램

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번 줄
생성자:

주요 메서드:
- 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장. 실제 실행 로그 확인

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