개발 이론/Spring

[Spring] flyway?? DB 마이그레이션??

dal_been 2023. 11. 13. 13:54
728x90

아 또 모르는 개념 나왔다. flyway?예? 이게 뭐죠..?? 뭐 db 마이그레이션 한다구요?에??

지금까지 내가 이 개념을 만났을때 반응이다. 자자 천천히 알아보자

 

일단 flyway에 대해서 간단히 말하자면

DB이력관리를 도와주는 라이브러리 라고 생각하면 된다.

 

우리가 자주 사용하는 git은 소스 코드의 이력을 관리한다. flyway도 마찬가지다. DB에 대한 이력관리 뿐만 아니라 마이그레이션, 테스트 코드 실행시에도 도움이 된다.

 

 

Migration??

 

일단 migration이 뭔가.??

 

간단하게 Migration이란 DB스키마에 발생한 변경사항을 DB에 적용하는 것이다. 운영환경, 개발환경, 로컬환경 등 다양한 환경에서 각자의 db를 갖고 있는데 모든 환경에서의 DB스키마를 맞추기 위함 인것이다.

 

근데 migration하면 뭐가 좋은데??

 

Database migrations are a great way to regain control of this mess.
They allow you to:
Recreate a database from scratch
Make it clear at all times what state a database is in
Migrate in a deterministic way from your current version of the database to a newer one

데이터베이스를 완전히 새롭운 상태로 만들 수 있다
데이터베이스의 상태가 어떤지 확인할 수 있다
업데이트 과정이 항상 동일한 순서와 방식으로 진행되어 언제나 똑같은 결과를 얻을 수 있다는 있다. 마이그레이션은 예측 가능하고 일관된 방식으로 이루어져 시스템이 예상치 못한 문제 없이 업데이트될 수 있도록 보장한다.

 

음 그냥 쉽게 얘기하자면 엔티티에 새로운 필드를 추가해야하는 상황이 왔다. 

그러면 아마 배포 서버 DB 에 직접 들어가서 테이블을 직접 수정해야할 것이다. 매번 일일히 이렇게 작업하는 것이 매우 귀찮고 실수를 하기도 좋다

 

여기서 flyway라는 툴이 로컬 db변경사항을 추가하는 것으로 배호 이후에 알아서 관리할 수 있게 해준다

다시 말해 개발 도중에 스키마가 변경되면 직접 배포 서버의 db에 들어가 스키마를 변경하지 않고 변경사항을 코드로 관리할 수 있게 해준다

 

 

그럼 정리하자면 스키마 변경사항을 적용해주고 그에 대한 이력관리도 가능하게 해주는게 flyway라고 할 수 있다

 

 

어떻게 사용하는가??

 

그럼 어떻게 사용해야하는가..??

Gradle기준으로 설명하겠다

https://documentation.red-gate.com/fd/quickstart-gradle-184127577.html

 

plugins {
    id "org.flywaydb.flyway" version "10.0.0"
}

//의존성 추가
dependencies {
    implementation('org.flywaydb:flyway-core:6.4.2')
}

 

 

application.proeprties

 

#data source 설정 / 본인 환경에 맞게 수정해주세요.
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/flyway
spring.datasource.username=test
spring.datasource.password=1234
spring.jpa.generate-ddl=false

#flyway 설정
spring.flyway.enabled=true
spring.flyway.user=test
spring.flyway.password=1234


#Spring boot 2 이상의 경우 아래 설정 추가
#flyway는 버전 정보를 flyway_shcema_history 라는 테이블에서 관리하는데 해당 테이블을 자동으로 생성해주는 옵션
spring.flyway.baselineOnMigrate = true

 

 

이후에 db스키마 구조를 flyway에 등록해야하기 때문에

resources/db/migration/V1__create books.sql 에 파일을 만든다(만약 경로를 변경하고 싶다면 spring.flyway.locations=classpath:/db/migration 을 사용하자)

 

# 초기 스케마를 정의
create table Books(
    id   bigint auto_increment,
    name varchar(255),
    primary key (id)
);

 

이후에 스프링 부트를 실행하면

로그에 flyway migrate관련 로그가 뜰 것이다

2023-11-13 12:09:42.233  INFO 2080 --- [    Test worker] o.f.core.internal.command.DbMigrate      : Current version of schema "PUBLIC": << Empty Schema >>
2023-11-13 12:09:42.235  INFO 2080 --- [    Test worker] o.f.core.internal.command.DbMigrate      : Migrating schema "PUBLIC" to version "1 - create books"

 

이후 테이블을 확인해보면 book 테이블과 flyway 마이그레이션을 관리하는 flyway_schema_history테이블이 생성될 것이다

 

근데 만약에 스키마 구조 변경 사항이 발생하면

resources/db/migration/V2__add price.sql 과 같이 다른 파일을 등록해주면된다

 

여기서 파일명에는 flyway규칙을 따라야한다

간단하게 "V{버전}__{설명}.sql"이다


주의할점은 버전은 올라가야한다. 또한 한번 마이그레이션을 한 sql파일은 절대 수정하면 안된다(에러발생)

 

어째든 변경된 스키마를 올리고 스프링부트를 재실행보면 flyway_schema_history에 히스토리로 저장된 것을 확인할 수 있다

 

 

 

 


참고

https://www.blog.ecsimsw.com/entry/Flyway%EB%A1%9C-DB-Migration

 

Flyway와 DB Migration / 우리 팀에서 Flyway를 사용하는 이유

Flyway 소개하기 DB Migration DB Migration의 필요를 모를 수 있다. 솔직히 나는 몰랐다. 배포 후 데이터를 관리해본 경험이 없었고, 유지 보수 중 스키마 구조가 바뀌는 상황에 어떻게 대처하는지 생각

www.blog.ecsimsw.com

https://documentation.red-gate.com/home

 

Home - Product Documentation

Events & Friends Meet us at an event, get sponsored, and join our Friends of Redgate

documentation.red-gate.com