Spring/Spring Boot

[Spring Boot]스프링 부트에서 ddl-auto 사용 방법

JoonYong 2024. 6. 3. 21:28

스프링 부트에서 ddl-auto 설정은 애플리케이션의 JPA(Hibernate)와 관련된 데이터베이스 스키마 관리 방식을 제어하는 중요한 설정입니다. 이 블로그 게시글에서는 ddl-auto 옵션을 사용하여 스키마 관리 작업을 어떻게 수행할 수 있는지 설명하겠습니다.

1. DDL-AUTO 옵션이란?

ddl-auto 옵션은 JPA 구현체인 Hibernate가 애플리케이션 시작 시 데이터베이스 스키마를 어떻게 처리할지를 결정합니다. 가능한 값들은 다음과 같습니다:

  • none: Hibernate가 스키마 관리 작업을 수행하지 않습니다.
  • validate: Hibernate가 엔티티와 데이터베이스 스키마를 검증하지만, 변경하지 않습니다.
  • update: Hibernate가 엔티티와 데이터베이스 스키마를 비교하여 필요한 변경을 적용합니다.
  • create: Hibernate가 애플리케이션 시작 시 기존 스키마를 삭제하고 새로 생성합니다.
  • create-drop: Hibernate가 create와 동일하게 동작하지만, 애플리케이션 종료 시 스키마를 삭제합니다.

2. 설정 방법

ddl-auto 설정은 application.yml 또는 application.properties 파일에서 설정할 수 있습니다. 여기서는 application.yml 파일을 사용하여 설정하는 예를 보여드리겠습니다.

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/your_database
    username: your_username
    password: your_password
  jpa:
    hibernate:
      ddl-auto: update
    properties:
      hibernate:
        show_sql: true
        format_sql: true

위 설정 예제에서는 ddl-auto를 update로 설정하여 Hibernate가 애플리케이션 시작 시 스키마를 업데이트하도록 합니다.

3. 각 옵션의 사용 사례

  • none:
    • 데이터베이스 스키마가 외부에서 관리되고 애플리케이션이 스키마를 변경해서는 안 되는 경우에 사용합니다.
  • validate:
    • 개발 및 테스트 환경에서 엔티티와 데이터베이스 스키마가 일치하는지 확인하고 싶을 때 사용합니다. 일치하지 않으면 애플리케이션 시작이 실패합니다.
  • update:
    • 개발 환경에서 엔티티 변경 사항을 데이터베이스에 자동으로 반영하고 싶을 때 사용합니다. 하지만 운영 환경에서는 사용하지 않는 것이 좋습니다.
  • create:
    • 테스트를 위한 데이터베이스 초기화가 필요할 때 사용합니다. 모든 데이터가 삭제되고 새로운 스키마가 생성되므로 중요한 데이터를 다루는 환경에서는 주의해야 합니다.
  • create-drop:
    • 일회성 테스트 환경에서 유용합니다. 테스트 후 스키마가 자동으로 삭제되므로 깔끔한 테스트 환경을 유지할 수 있습니다.

4. 예제 코드

다음은 ddl-auto 옵션을 create로 설정하고 초기 데이터를 삽입하는 예제입니다.

spring:
  datasource:
    url: jdbc:h2:mem:testdb
    driver-class-name: org.h2.Driver
    username: sa
    password:
  jpa:
    hibernate:
      ddl-auto: create
    properties:
      hibernate:
        show_sql: true
        format_sql: true

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    // Getters and setters
}

@Component
class DataLoader implements CommandLineRunner {

    @Autowired
    private UserRepository userRepository;

    @Override
    public void run(String... args) throws Exception {
        userRepository.save(new User("Alice"));
        userRepository.save(new User("Bob"));
    }
}

interface UserRepository extends JpaRepository<User, Long> {}

위 예제에서 애플리케이션이 시작될 때 User 엔티티에 대한 테이블이 생성되고, DataLoader 클래스가 실행되어 초기 데이터가 삽입됩니다.

5. 마무리

스프링 부트에서 ddl-auto 설정을 통해 데이터베이스 스키마 관리를 쉽게 할 수 있습니다. 개발, 테스트, 운영 환경에 맞는 적절한 설정을 사용하여 안정적인 애플리케이션을 개발할 수 있습니다.