사실 3년차가 되면, 적어도 내가 하는 일이 뭔지 정도는 알 것이라고 생각했는데 지금도 나는 내가 하는 일이 무엇인지 정확히 모르겠다.
어제 무엇을 먹었는지 기억도 못하는 휘발성 기억력으로 개발을 하던 나는 드디어 5년이 지난 지금에서야 개발 흔적을 남기려 한다.
첫 게시글로 무엇을 쓸까 고민하다가 며칠 전까지 회사에서 사용했던 개발 도구 "Liquibase"를 소개하려 한다.
지금 다니고 있는 회사는 지원하고 있는 DBMS 종류가 총 6가지가 되는데, 이를 개별로 관리를 하다보니 동일한 제품임에도 불구하고 DBMS 마다 인덱스나, 컬럼 타입 등의 일관성이 지켜지지 않는 문제점들이 발견되었다.
이를 개선하고자 "Liquibase" 도구를 도입하게 되었다. Liquibase는 데이터베이스 변경 이력 관리를 용이하게 해주는 도구로, 다양한 파일 형식(SQL, XML, YAML, JSON)을 지원한다.
유사 개발 도구인 "flyway"가 SQL 형식만 지원하는 것과 다르게 많은 형식을 지원하고 무엇보다, 데이터베이스에 구애받지 않는 언어로 작업이 가능하기 때문에 스키마 변경 사항을 다양한 데이터베이스 유형에 쉽게 적용할 수 있다.
간단히 말해서, Liquibase 문법에 맞는 파일을 작성해두면 해당 파일을 DBMS에 맞게 쿼리문으로 추출할 수도 있고, JDBC 드라이버와 연결 정보를 입력하여 직접 연결된 데이터베이스에서 실행시킬 수도 있다.
그렇다면 어떻게 사용하면 될까? 공식 문서의 내용을 토대로 실제 사용해본 경험상 기본적으로 알아야 하는 내용은 아래 세 가지 정도인 것 같다.
https://docs.liquibase.com/concepts/home.html
데이터베이스에 대한 모든 변경 사항을 순차적으로 나열한 파일로, SQL, XML, YAML, JSON 형식으로 작성할 수 있다. 작성된 파일은 소스 제어 도구(git, svn..)에 저장하여 데이터베이스 변경 이력으로 관리한다.
"Liquibase"의 기본 변경 단위로, 테이블을 생성하거나 기존 테이블에 컬럼을 추가하는 등 데이터베이스에서 수행할 작업을 지정한다. 쉽게 말해서, 트랜잭션 같은 개념이라고 생각하면 된다.
"Liquibase"로 데이터베이스를 업데이트하기 위해 사용하는 XML, YAML, JSON 형식의 데이터베이스 변경 구문이다. "Changeset" 당 하나의 "Change Type"을 지정하는 권장한다. 데이터베이스의 예기치 않은 상태로 문제가 발생했을 때, 실패한 부분에 대해서만 Rollback 하기 용이하기 때문이다.
아래는 "Change Type" 구문 작성에 필요한 속성 종류다.
Entities
Constraints
https://www.liquibase.org/get-started/quickstart
"Liquibase"에서는 모든 DBMS에 대하여 프로시저 생성 구문을 지원하지 않는다. 이럴 때는 sql 옵션을 사용하여 프로시저를 실행 하려는 DBMS 문법에 맞게 작성 하자.
https://docs.liquibase.com/change-types/create-procedure.html, https://docs.liquibase.com/change-types/sql.html?Highlight=sql
테이블의 특정 컬럼 값을 넘버링 하는 경우, 시퀀스를 사용한다. 그러나 시퀀스 미지원 DB(mysql, mariadb..)의 경우, addAutoIncrement 속성을 사용한다.
https://docs.liquibase.com/change-types/create-sequence.html?Highlight=create%20seq, https://docs.liquibase.com/change-types/add-auto-increment.html
단, mssql의 경우 addAutoIncrement 속성 미지원 대상이라 colum의 autoIncrement 속성을 이용해야 한다.
https://docs.liquibase.com/change-types/nested-tags/column.html
DBMS 별로 지원하는 컬럼 타입이 다르다. (ex: NUMBER, NUMERIC, int, INTEGER)
데이터의 저장 가능 범위를 고려하여 컬럼 타입을 통일 시키자.
참고로 mysql의 경우, 괄호 안에 숫자가 들어가는 int 타입은 존재하지 않는다. (ex: int(4)) 괄호 안에 숫자로 데이터 저장 가능 범위가 결정되는 것이 아니라 smallint, int, bigint와 같이 mysql에서 지원하는 넘버 타입에 따라 저장 가능 범위가 결정되기 때문이다.
공식 문서도 잘 나와있고, 직관적으로 사용하기 편리했다. 데이터베이스 버전 관리 도구를 찾고 있다면 "Liquibase"를 적극 추천한다.