JPA의 ddl-auto 옵션은 각각 어떤 동작을 하고 어떤 상황에서 사용해야 할까요?
ddl-auto 옵션은 스프링 부트 애플리케이션에서 Hibernate와 같은 JPA 구현체를 사용할 때 DB 스키마 관리를 제어하는 설정입니다.
옵션은 application.properties 또는 application.yml 파일에서 설정할 수 있으며, 다양한 값에 따라 데이터베이스 스키마에 대해 다른 동작을 수행합니다. ddl-auto 옵션에는 none, validate, update, create, create-drop 등이 존재합니다.
application.properties 또는 application.yml에서 설정하기
- application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase
spring.datasource.username=root
spring.datasource.password=1234
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
spring.jpa.hibernate.ddl-auto=update
- application.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydatabase
username: root
password: 1234
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
database-platform: org.hibernate.dialect.MySQL8Dialect
hibernate:
ddl-auto: update
Java 기반 설정(@Configuration 클래스 활용)
@Configuration
public class JpaConfig {
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
// Hibernate를 JPA 구현체로 설정하여 Spring Boot의 자동 설정 없이 직접 관리할 수 있도록 함.
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource);
// JPA 엔티티가 위치한 패키지를 설정하여 엔티티 자동 감지
em.setPackagesToScan("com.example.entity");
JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
Properties properties = new Properties();
properties.setProperty("hibernate.hbm2ddl.auto", "update"); // ddl-auto 설정
properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL8Dialect");
properties.setProperty("hibernate.show_sql", "true");
em.setJpaProperties(properties);
return em;
}
}
이 방식은 application.properties 또는 application.yml을 통한 설정보다 우선순위가 높습니다.
각 옵션에 대한 설명을 해주시겠어요? 🤔
- none: DB 스키마와 관련된 어떠한 작업도 수행하지 않습니다. 스키마를 수동으로 관리하고 싶을 때 유용하며, 프로덕션 환경에서 주로 사용됩니다.
- validate: 애플리케이션이 시작될 때, 엔티티 매핑이 데이터베이스 스키마와 일치하는지 검증하며 스키마 변경은 따로 수행하지 않습니다. 프로덕션 환경에서 엔티티와 스키마가 일치하는지 확인하고 싶을 때 사용합니다.
- update: 엔티티 매핑과 데이터베이스 스키마를 비교하여 필요한 경우 스키마를 업데이트합니다. 기존 데이터는 유지되지만, 새로운 엔티티나 변경된 엔티티 필드는 스키마에 반영됩니다. 해당 옵션은 엔티티에 변경이 발생할 때 자동으로 스키마를 업데이트하고 싶을 때 유용합니다. 프로덕션 환경에서는 예기치 않은 스키마 변경을 방지하기 위해 주의가 필요합니다.
- create: 애플리케이션이 시작될 때 기존 스키마를 삭제하고 새로 생성합니다. 데이터가 모두 삭제되며 엔티티 매핑을 기반으로 새로운 스키마가가 생성됩니다. 개발 초기에 빈 데이터베이스 스키마를 반복적으로 생성해야 할 때 유용합니다. 기존 데이터가 모두 삭제되므로 프로덕션 환경에서는 사용되지 않습니다.
- create-drop: create와 유사하지만, 애플리케이션이 종료될 때 스키마를 삭제한다는 점이 다릅니다. 해당 옵션은 테스트 환경에서 일시적인 데이터베이스 스키마가 필요한 경우 유용하며, 매 테스트 실행 시마다 깨끗한 데이터베이스 상태를 유지하고자 할 때 사용됩니다. 프로덕션 환경에서는 사용되지 않습니다.
프로덕션 환경에서 스키마 변경은 어떻게 해야하나요? 🤓
스키마 변경이 필요할 때는 적절한 데이터베이스 마이그레이션 도구(Flyway, Liquibase 등)를 사용하여 제어된 방식으로 스키마를 관리하거나, 사용자가 없는 새벽에 스키마 변경 작업을 수동으로 진행하는 것이 더욱 안전할 수 있습니다.
Start the conversation