golang-migrate란?

2025. 3. 16. 20:41·툴, 프레임워크, 기술

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를 함께 활용하는 방법에 대해 소개하도록 하겠다.

저작자표시 동일조건 (새창열림)
'툴, 프레임워크, 기술' 카테고리의 다른 글
  • Go언어를 쓸 때 DB 스키마와 코드를 연동하는 가장 쉬운 방법: golang-migrate + sqlc
  • golang에서 사용 경험이 좋았던 패키지들
  • Modbus란? - 심화편
  • Modbus란? - 기본편
박정현
박정현
Go언어에 대한 전반적인 것을 다룹니다.
  • 박정현
    Simple & Clear
    박정현
  • 전체
    오늘
    어제
    • 분류 전체보기 (39)
      • 프로그래밍 언어 (13)
      • 툴, 프레임워크, 기술 (6)
      • 소프트웨어 공학 (13)
      • 회고 (5)
      • 서평 (2)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    가교 패턴
    design pattern
    db
    동시성 프로그래밍
    문법
    서평
    회고
    Solid
    modbus
    코딩챌린지
    커맨드라인
    golang
    생성 패턴
    TDD
    go언어
    OOP
    객체지향 프로그래밍
    chan chan
    go test
    모드버스
    sqlc
    DIP
    Deep Copy
    codingchallenge
    프로토콜
    깊은 복사
    워커 풀 패턴
    테스트 주도 개발
    디자인 패턴
    go-migrate
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
박정현
golang-migrate란?
상단으로

티스토리툴바