Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save taekwon-dev/fff1ff976dc380670f4a89147b9deec0 to your computer and use it in GitHub Desktop.
Save taekwon-dev/fff1ff976dc380670f4a89147b9deec0 to your computer and use it in GitHub Desktop.

Spring Boot + Flyway DB Migration (MySQL DDL)

이미 특정 버전 (상태)로 데이터베이스 서버가 운영 중인 상태에서 데이터베이스 이력 변경이 있는 경우 Flyway 와 같은 Database Migration 도구를 통해 관리할 수 있다. 이번 글에서는 DDL 중 ALTER , CREATE , DROP 을 활용해서 데이터베이스 마이그레이션 하는 것을 다룬다.


| 테스트 환경

모든 코드는 GitHub 에서 확인할 수 있다.

Flyway 에서 제공하는 Versioned , Repeatable 마이그레이션을 각각 이용해서 테이블 생성과 테이블에 넣을 시드 데이터를 확보했다. 각각의 마이그레이션 방식을 적용하려면 파일명을 컨벤션에 맞게 설정해야 한다. 각 타입의 앞 글자를 따서 VersionedV , RepeatableR 로 시작한다. (이 둘의 차이 그리고 또 다른 타입의 마이그레이션 방식은 여기에서 확인할 수 있다)

테스트 환경을 세팅하는 과정에서 테이블 생성을 진행 했고, V1.0.0__init.sql , R__init.sql 파일을 보면 DDL, DML을 확인 할 수 있다. 아래 그림은 테스트 환경 세팅 이후의 데이터베이스 상태다.

image [ 그림 1 - Flyway 스미마 히스토리 테이블 ]

image [ 그림 2 - 유저 테이블 시드 데이터 ]


| ALTER ADD COLUMN

새로운 컬럼이 추가되는 경우에 대해서는 해당 컬럼에 대한 디폴트 값을 고려해야 한다. 예를 들어, 비즈니스 요구사항으로 “주기적으로(3개월) 유저에게 비밀번호 변경을 유도할 수 있는 기능” 이 추가 됐다고 가정 했을 때, 현재 유저 테이블에 해당 요구사항을 처리할 별도의 컬럼이 없으므로 비밀번호 변경 대상 여부 컬럼 추가가 필요한 상황이다.

Versioned 마이그레이션 방식을 통해서 V1.0.1__addcol_user.sql 파일을 /db/migration 디렉토리에 생성한다. 그리고 해당 파일에 아래 DDL을 입력하면 된다.

ALTER TABLE user ADD COLUMN password_change TINYINT(1) DEFAULT FALSE;

이 상태로 다시 도커 컴포즈를 통해서 서비스를 띄우고, MySQL 컨테이너에 접근해서 flyway_schema_history 테이블과 user 테이블을 확인하면 아래와 같이 위에서 생성한 컬럼과 기본 값이 적용된 것을 확인할 수 있다.

image [ 그림 3 - Flyway 스키마 히스토리 테이블 ]

image [ 그림 4 - 유저 테이블 ]

| ALTER MODIFY COLUMN

컬럼 타입을 바꾸기 위해서 위와 동일한 프로세스로 진행할 수 있다. 유저 테이블에서 유저네임 글자 수 제한을 늘리기 위해서 VARCHAR(50) 에서 VARCHAR(100) 으로 수정해보자.

ALTER TABLE user MODIFY COLUMN username varchar (100);

image [ 그림 5 - Flyway 스키마 히스토리 테이블 ]

image [ 그림 6 - 유저 테이블 DESC ]

| ALTER DROP COLUMN

이번엔 비즈니스 요구사항이 변경 돼서 더 이상 필요가 없는 컬럼을 삭제하는 상황을 가정해보자. 유저 테이블에서 다시 password_change 컬럼을 삭제해보자.

ALTER TABLE user DROP COLUMN password_change;

image [ 그림 7 - Flyway 스키마 히스토리 테이블 ]

image [ 그림 8 - 유저 테이블 DESC ]

| DROP TABLE

마지막으로 더 이상 필요 없는 테이블을 삭제해보자.

DROP TABLE user;

image [ 그림 9 - Flyway 스키마 히스토리 테이블 ]

image [ 그림 10 - 테이블 목록 조회 ]


| Reference

Flyway Migrations

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment