데이터베이스 변경 로그 파일의 변경셋 태그 사용 가이드

  1. 변경셋(ChangeSet) 태그의 핵심 특성 <changeSet>는 하나의 데이터베이스 스키마 변경을 정의하는 단위로, id, author, 그리고 변경 로그 파일 경로를 통해 고유하게 식별됩니다. 실행 시점에는 이들 태그의 순서가 중요한데, 변경 로그 파일 내에서 등장한 순서대로 처리되며, id 값의 순서와는 무관합니다.

<changeSet>는 별도의 트랜잭션으로 처리되며, 성공적으로 완료되면 커밋되고, 오류 발생 시 롤백됩니다. 이를 통해 변경 사항의 일관성을 보장합니다.

  • runAlways="true": 기존에 실행된 적이 있어도 매번 재실행됩니다. 주로 테스트용 또는 반복적 작업에 사용.
  • runOnChange="true": 변경 내용이 변경되었을 때만 실행되며, DATABASECHANGELOG 테이블에 저장된 MD5SUM 값이 변하면 다시 실행됩니다. 하지만 동일한 idauthor를 유지하면서 내용이 변경되지 않으면, 이 속성은 효과가 없습니다. 특히 구조 변경 후 재확인이 필요한 경우 유용합니다.
  1. 자주 활용되는 변경셋 예시

테이블 생성

<changeSet author="dev_team" id="202405101000_USER_INFO_SCHEMA-1">
    <preConditions onFail="MARK_RAN">
        <not>
            <tableExists tableName="USER_INFO" />
        </not>
    </preConditions>
    <createTable tableName="USER_INFO">
        <column name="USER_ID" type="NUMBER(19)" nullable="false">
            <constraints primaryKey="true" />
        </column>
        <column name="STATUS" type="VARCHAR2(20)" />
        <column name="CREATED_AT" type="DATE" defaultValueSystem="SYSDATE" />
    </createTable>
</changeSet>

기본키 추가

<changeSet author="dev_team" id="202405101000_USER_INFO_SCHEMA-2">
    <preConditions onFail="MARK_RAN">
        <not>
            <primaryKeyExists tableName="USER_INFO" primaryKeyName="PK_USER_ID" />
        </not>
    </preConditions>
    <addPrimaryKey tableName="USER_INFO" columnNames="USER_ID" constraintName="PK_USER_ID" />
</changeSet>

컬럼 추가

<changeSet author="dev_team" id="202405101000_USER_INFO_SCHEMA-3">
    <preConditions onFail="MARK_RAN">
        <not>
            <columnExists tableName="USER_INFO" columnName="EMAIL" />
        </not>
    </preConditions>
    <addColumn tableName="USER_INFO">
        <column name="EMAIL" type="VARCHAR2(100)" remarks="사용자 이메일 주소" />
    </addColumn>
</changeSet>

컬럼 삭제

<changeSet author="dev_team" id="202405101000_USER_INFO_SCHEMA-4">
    <dropColumn tableName="USER_INFO" columnName="TEMP_VALUE" />
</changeSet>

데이터 업데이트

<changeSet author="dev_team" id="202405101000_USER_INFO_SCHEMA-5" dbms="oracle" failOnError="false">
    <sql splitStatements="false" stripComments="true">
        UPDATE USER_INFO SET EMAIL = UPPER(EMAIL) WHERE EMAIL IS NOT NULL;
    </sql>
</changeSet>

시퀀스 생성

<changeSet author="dev_team" id="202405101000_USER_INFO_SCHEMA-6">
    <preConditions onFail="MARK_RAN">
        <not>
            <sequenceExists sequenceName="SEQ_USER_ID" />
        </not>
    </preConditions>
    <createSequence 
        sequenceName="SEQ_USER_ID"
        startValue="1"
        incrementBy="1"
        maxValue="999999999999"
        minValue="1"
        cacheSize="20"
        cycle="false"
        ordered="false" />
</changeSet>

태그: liquibase database migration changelog changeSet schema evolution

6월 12일 00:34에 게시됨