[SpringBoot] 데이터베이스 마이그레이션(Database Migration)

2022. 12. 22. 13:34JAVA/Spring

1. 데이터베이스 마이그레이션이란 무엇인가

데이터베이스 마이그레이션이란 데이터베이스 스키마의 버전을 관리하기 위한 하나의 방법(데이터 전환)입니다.

개발 시스템에는 데이터베이스 스키마가 변경되었지만, 운영시스템의 데이터베이스 스키마가 변경되지 않았을 경우 마이그레이션을 수행합니다. 작게는 프로젝트 상 테이블 생성 및 변경 작업부터, 하나의 애플리케이션 또는 시스템을 옮기는 것까지 마이그레이션입니다. 요구사항에 따라 애플리케이션과 스키마가 바뀌었지만 개발 과정에는 적용됬지만 운영환경에는 적용되지 않아 데이터베이스 전환 시 애를 먹는 경우가 있습니다. 데이터베이스 마이그레이션은 이러한 문제를 해결합니다.

 

데이터베이스 마이그레이션은 개별 SQL 파일을 MySQL 콘솔 등에서 직접 실행하지 않고 프레임워크의 특정 명령어를 통해 실행하고 이 결과를 별도의 테이블에 버전 관리를 하는 기법입니다.

 

2. 스프링부트 프로젝트에 MySQL 데이터베이스 마이그레이션 적용

2.1 의존성 추가

dependencies {
    implementation 'org.flywaydb:flyway-core'
    implementation 'org.flywaydb:flyway-mysql'

    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    compileOnly 'org.projectlombok:lombok'
    runtimeOnly 'com.mysql:mysql-connector-j'
    annotationProcessor 'org.projectlombok:lombok'
}

 

2.2 resource/db.migration 디렉토리 생성

 

2.3 마이그레이션 파일 생성

파일 이름은 "V1__init.sql"이라고 만듭니다.

 

마이그레이션 파일 이름 규칙은 다음과 같습니다.

  • V숫자__이름.sql
  • V는 반드시 대문자로.
  • 숫자는 순차적으로(타임스탬프 권장)
  • 숫자와 이름 사이에 언더바 두개
  • 이름은 가능한 서술적으로

 

2.4 프로젝트 데이터 소스 설정 및 jpa 설정

resource/application.properties

spring.datasource.hikari.maximum-pool-size=4
spring.datasource.url=jdbc:mysql://localhost:3306/springboot
spring.datasource.username=yonghwan
spring.datasource.password=pass

spring.jpa.hibernate.ddl-auto=validate
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.generate-ddl=false

데이터소스 url 및 username 속성들은 다를 수 있습니다.

 

2.5 데이터베이스에 저장할 테이블 클래스 정의

@Entity
@Getter
@Setter
@EqualsAndHashCode(of = {"id"})
public class Account {
    @Id @GeneratedValue
    private Long id;

    private String username;

    private String password;

    private boolean active;
}

 

2.5 V1__init.sql 파일에 sql 입력

drop table if exists account;
drop table if exists hibernate_sequence;
create table account (
                         id bigint not null,
                         password varchar(255),
                         username varchar(255),
                         primary key (id)
) engine=InnoDB;
create table hibernate_sequence (
    next_val bigint
) engine=InnoDB;

 

2.6 V2__add_active.sql 파일에 sql 입력

ALTER TABLE account ADD COLUMN active BOOLEAN;

 

2.7 도커를 이용하여 mysql container를 실행시킵니다.

$ - docker run -p 3306:3306 —name mysql_boot -e MYSQL_ROOT_PASSWORD=1 
-e MYSQL_DATABASE=springboot -e MYSQL_USER=yonghwan -e MYSQL_PASSWORD=pass -d mysql

 

2.8 애플리케이션을 실행하여 데이터베이스 마이그레이션 sql 파일이 실행되는지 확인합니다.

 

2.9 flyway_schema_history 테이블을 보면 데이터베이스 마이그레이션 히스토리 내역을 확인할 수 있습니다.

 

References

soruce code : https://github.com/yonghwankim-dev/springboot_practice/tree/main/db_migration_demo
[인프런] 스프링 부트 개념과 활용
https://life-with-coding.tistory.com/68