이미 특정 버전 (상태)로 데이터베이스 서버가 운영 중인 상태에서 데이터베이스 이력 변경이 있는 경우 Flyway
와 같은 Database Migration 도구를 통해 관리할 수 있다. 이번 글에서는 DDL 중 ALTER
, CREATE
, DROP
을 활용해서 데이터베이스 마이그레이션 하는 것을 다룬다.
모든 코드는 GitHub 에서 확인할 수 있다.
Flyway
에서 제공하는 Versioned
, Repeatable
마이그레이션을 각각 이용해서 테이블 생성과 테이블에 넣을 시드 데이터를 확보했다. 각각의 마이그레이션 방식을 적용하려면 파일명을 컨벤션에 맞게 설정해야 한다. 각 타입의 앞 글자를 따서 Versioned
은 V
, Repeatable
은 R
로 시작한다. (이 둘의 차이 그리고 또 다른 타입의 마이그레이션 방식은 여기에서 확인할 수 있다)
테스트 환경을 세팅하는 과정에서 테이블 생성을 진행 했고, V1.0.0__init.sql
, R__init.sql
파일을 보면 DDL, DML을 확인 할 수 있다. 아래 그림은 테스트 환경 세팅 이후의 데이터베이스 상태다.
[ 그림 1 - Flyway 스미마 히스토리 테이블 ]
새로운 컬럼이 추가되는 경우에 대해서는 해당 컬럼에 대한 디폴트 값을 고려해야 한다. 예를 들어, 비즈니스 요구사항으로 “주기적으로(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
테이블을 확인하면 아래와 같이 위에서 생성한 컬럼과 기본 값이 적용된 것을 확인할 수 있다.
[ 그림 3 - Flyway 스키마 히스토리 테이블 ]
컬럼 타입을 바꾸기 위해서 위와 동일한 프로세스로 진행할 수 있다. 유저 테이블에서 유저네임 글자 수 제한을 늘리기 위해서 VARCHAR(50)
에서 VARCHAR(100)
으로 수정해보자.
ALTER TABLE user MODIFY COLUMN username varchar (100);
[ 그림 5 - Flyway 스키마 히스토리 테이블 ]
이번엔 비즈니스 요구사항이 변경 돼서 더 이상 필요가 없는 컬럼을 삭제하는 상황을 가정해보자. 유저 테이블에서 다시 password_change
컬럼을 삭제해보자.
ALTER TABLE user DROP COLUMN password_change;
[ 그림 7 - Flyway 스키마 히스토리 테이블 ]
마지막으로 더 이상 필요 없는 테이블을 삭제해보자.
DROP TABLE user;
[ 그림 9 - Flyway 스키마 히스토리 테이블 ]