개발/Spring

Liquibase로 DB 변경 이력 관리하기

hanks 2025. 6. 2. 23:25

✅ Liquibase란?

Liquibase는 DB 구조(스키마) 변경을 코드처럼 관리하고 적용하는 도구입니다. SQL이나 YAML/XML 파일로 변경 내역을 기록하고, 이를 수동 또는 자동으로 DB에 적용할 수 있게 해줍니다.


🔁 전통적인 방식 vs Liquibase

방식 설명
전통적인 방식 DB 콘솔에서 직접 SQL 실행 → 관리가 어려움
Liquibase 방식 SQL 파일로 작성 + 변경 이력 추적 + 자동 적용 가능

📂 디렉터리 구조 예시

src/
└── main/
    └── resources/
        └── db/
            └── changelog/
                ├── changelog-index.yaml        ← 마스터 changelog
                └── changes/
                    ├── 001-create-user.sql
                    ├── 002-add-role-column.sql
                    └── 003-insert-seed-data.sql

🧩 changelog-index.yaml 설정

databaseChangeLog:
  - includeAll:
      path: /changes
      relativeToChangelogFile: true
      runOnChange: true
항목 설명
includeAll 지정된 폴더 내 모든 changelog 파일 포함
path 포함할 파일 경로 (상대 경로)
relativeToChangelogFile 기준 경로를 현재 파일 기준으로 설정
runOnChange 파일 변경 시 재적용 허용 (주의 필요)

📝 SQL 파일 작성 예시 (001-create-user.sql)

-- changeset kyungsoo:001
CREATE TABLE users (
  id BIGINT PRIMARY KEY,
  username VARCHAR(50),
  password VARCHAR(100)
);

-- changeset 작성자:ID 주석은 반드시 필요합니다.


🛠️ 적용 방법 (Gradle 기준)

./gradlew update
  • changelog-index.yaml을 읽고, /changes 폴더 내 적용되지 않은 SQL만 순차적으로 실행합니다.

🔄 변경 사항 반영 흐름

  1. changelog-index.yaml로 includeAll 설정
  2. /changes에 SQL 또는 YAML 파일 추가
  3. 파일 내 -- changeset 주석 포함
  4. ./gradlew update 실행
  5. databasechangelog 테이블에 이력 저장됨

⚠️ 운영 시 주의사항

  • runOnChange: true파일 내용이 바뀌면 재적용됨 → 운영에서는 주의!
  • 이미 적용된 SQL은 databasechangelog 테이블 기준으로 재실행되지 않음
  • 항상 001-, 002- 등의 접두어로 순서를 유지하는 것이 안전

✅ 한 줄 요약

DB를 직접 변경하지 말고, changelog 파일로 작성하고 Liquibase로 추적/적용하자!