DB 스키마를 관리하는 것은 매우 중요하지만 귀찮은 부분이 있다. 특히 변경 히스토리를 관리하는 부분과 변경 사항을 코드에 반영하는 부분은 작업량이 많을 뿐만 아니라 실수의 여지가 많다. 다행히도 golang에서는 이 문제를 golang-migrate를 통해 해결할 수 있다. 이번 글에서는 이 golang-migrate에 대해 소개하고자 한다.
마이그레이션
들어가기에 앞서서 여기서 말하는 마이그레이션, DB 마이그레이션에 대한 정의를 확실히 하고자 한다. DB 마이그레이션은 상황에 따라 여러가지 의미로 쓰인다. 주로는 DB 종류 변경 작업을 의미하고 그 외에 DB 스키마 버전 및 변경 이력 관리, 코드 내의 객체를 DB 테이블로 변환하는 작업 등으로 쓰인다. 이번 글에서의 마이그레이션은 DB 스키마 버전 관리를 지칭한다.
golang-migrate
golang-migrate는 golang으로 작성된 데이터베이스 마이그레이션 도구로 데이터베이스 마이그레이션을 지원하는 CLI 툴 및 라이브러리이다. 이후에 설명할 sqlc에서 지원하는 postgresql, mysql, sqlite는 물론 mongoDB, cochraochDB와 같이 많이 쓰이는 DB를 지원한다.
설치
공식 페이지를 참조해서 설치하면 된다.
마이그레이션 파일 생성
migrate create -ext sql -dir {마이그레이션 파일 경로} -seq {설명}
그러면 입력한 마이그레이션 파일 경로에 다음과 같이 파일 두개가 생성된다.
000001_{설명}_up.sql
000001_{설명}_down.sql
파일 이름은 {순서}_{설명}_{up/down}.sql 형식으로 생성되며 마이그레이션 파일 생성 커맨드를 입력할 때마다 순서가 1씩 증가한다.
마이그레이션 파일 수정
위의 생성된 파일을 순서대로 다음과 같이 수정해보자
-- 000001_{설명}_up.sql
CREATE TABLE users (
id BIGSERIAL PRIMARY KEY,
email VARCHAR NOT NULL,
name VARCHAR NOT NULL,
created_at TIMESTAMP DEFAULT now()
);
-- 000001_{설명}_down.sql
DROP TABLE users;
해당 예시는 user 테이블을 추가한 버전을 넣은 것이다. 해당 버전으로 업데이트 하면 user 테이블이 생성되고 해당 버전을 롤백하면 user 테이블이 삭제되도록 구성했다.
마이그레이션
migrate -source {마이그레이션 저장 폴더} -database {DB 주소} {up/down} [N]
migrate up하는 경우 현재에서 N만큼(없으면 가장 최신으로) 업데이트를, migrate down하는 경우 현재에서 N만큼 롤백을 진행한다.
마치며
이번 글에서는 golang-migrate를 통한 마이그레이션에 대해서 알아보았다. 해당 툴 자체만으로도 충분히 유용하지만 사실 이전 글에서 소개한 sqlc와 함께 쓸 때 훨씬 유용하게 쓰일 수 있다. 다음 글에서는 이 sqlc와 golang-migrate를 함께 활용하는 방법에 대해 소개하도록 하겠다.