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
  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

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

티스토리툴바