Spring

[SpringBoot] flyway와 DB migration 해야하는 이유

Big Iron 2023. 9. 23. 20:59

DB migration

DB migration이 뭔지 몰랐다. 찾아보면 서로 다른 db의 데이터를 합치거나 다른 db로 이동하기 위함 이라곤 하는데, 쉽게 이해하자면 github에서 커밋을 추적하며 형상관리 하는 것을 db에서도 동일한 작업을 하는 것이다.



이전에 겪었던 문제들

초반에 프로젝트 설계를 했더라도 기능이 추가/삭제될 경우가 있는데, 그럴 때마다 필요에 따라 Entity를 수정하고 DB에 쿼리를 날려 수정/삭제를 했었다.

사소한 실수로 SQLSyntaxErrorException: Unknown column 에러가 발생했고 대부분의 이유는 Entity만 수정하고 쿼리는 실행하지 않은 경우로 사소한 실수를 줄일 수 있는 방법이 필요했다.


그 이외에도 여러 개발자가 협업하는 과정에서 github의 코드 형상관리와 비슷하게 db를 파일로 관리할 수 있는 방법이 있었고 일관된 구조를 유지할 수 있었다.



flyway

프로젝트 내부에 쿼리를 실행하는 파일을 만들어 db버전을 관리하는 것이며 완성된 구조는 아래와 같다.

  • resources/db/migration -> 스키마 생성 쿼리
  • resources/db/data -> 데이터 삽입 쿼리

image



아래는 예시 데이터이다.

V0.0__insert_all_table.sql 파일 내부에는 더미데이터, 초기데이터를 삽입하는 쿼리를 작성했다.

INSERT INTO `users` (`age`, `gender`, `kakao_email`, `kakao_id`, `nickname`, `role`)
VALUES
    ('25', 'Male', 'johnd@kakao.com', 0, 'JohnD', 'User'),
    ('30', 'Female', 'alices@kakao.com', 1, 'AliceS', 'User'),
    ('28', 'Male', 'bobj@kakao.com', 2, 'BobJ', 'User'),
    ('32', 'Female', 'charlieb@kakao.com', 3, 'CharlieB', 'User'),
    ('27', 'Male', 'evew@kakao.com', 4, 'EveW', 'User'),
    ('29', 'Female', 'frankb@kakao.com', 5, 'FrankB', 'User');

V1.0__create_users_table.sql 파일 내부에는 테이블 생성 쿼리 작성.

CREATE TABLE `users` (
                         `id` bigint NOT NULL AUTO_INCREMENT,
                         `age` varchar(255) DEFAULT NULL,
                         `gender` varchar(255) DEFAULT NULL,
                         `kakao_email` varchar(255) DEFAULT NULL,
                         `kakao_id` bigint DEFAULT NULL,
                         `nickname` varchar(255) DEFAULT NULL,
                         `role` varchar(255) NOT NULL,
                         PRIMARY KEY (`id`)
)

이처럼 각 테이블, 쿼리를 실행하는 파일을 따로 만들거나 상황에 맞게 하나의 파일에 작성해주면 된다.


flyway 사용 방법

  • 아래의 예시는 db연동을 완료했다는 가정으로 flyway 설정만 진행
  1. gradle 의존성 설정

     // db에 맞는 버전을 설치하거나 최신 버전을 설치하면 된다.
     implementation'org.flywaydb:flyway-core:6.4.2'
  2. yml파일 - 스키마 생성(create) 경로 resources/db/migration 설정

     spring:
           flyway:
             baseline-on-migrate: true # 첫 번째 마이그레이션을 기준 버전으로 설정
             locations: classpath:db/migration # 마이그레이션 SQL 파일 위치 -> resources/db/migration이다. (기본값) 
             enabled: true # Flyway 활성화 (기본값 true로 작성하지 않아도 된다.)
     ---
    
     baseline-on-migrate: true를 설정하지 않은 경우, 테이블이 이미 존재하는 경우 생성되지 않습니다.
     baseline-on-migrate: true를 설정한 경우, 생성한 파일의 테이블은 항상 생성됩니다.
    
     baseline-on-migrate: true 설정은 아래와 같은 상황에 설정한다.
         1. 데이터베이스에 이미 존재하는 스키마를 변경해야 하는 경우
         2. 데이터베이스의 스키마를 변경할 때마다 기준 버전을 유지해야 하는 경우
  3. 초기 데이터 저장용 쿼리(insert) resources/db/data 경로에 저장
    locations 설정을 수정하여 data와 migration의 경로를 한번에 지정할 수 있지만 이 예시에서 data 경로는 직접 생성한다.

  4. 제대로 완료 했다면 프로젝트 실행시 flyway_schema_history 테이블이 생성된 것을 볼 수 있다.


발생한 에러

db와 flyway 버전과 관련된 에러를 접한 기억이 있는데 아쉽게도 해당 이미지는 저장해두지 못했다.

나의 경우 리눅스 homebrew로 mysql을 설치했었는데 따로 버전을 지정하지 않아 mysql8.1.0 버전이 설치되었다. gradle에 flyway 최신 버전으로 의존성 설정해도 계속 버전 관련 이슈가 발생했고 mysql 버전을 8.0.29나 8.0.32, 8.0.34 등을 설치하면 해결되는 문제였다.

'Spring' 카테고리의 다른 글

[Spring] EC2에 Prometheus & Grafana 적용  (0) 2023.07.18
Http, Https 프로토콜  (0) 2023.07.11
Spring - MVC 패턴  (0) 2023.03.08
Spring - 입문  (0) 2023.02.24