본문 바로가기
데이터베이스

[데이터베이스] Flyway란 무엇일까?

by 코딩하는경준 2022. 8. 6.

회사에서 회사 오기 전까지 공부해야되는 기술 스택중에
데이터베이스 마이그레이션 툴인 Flyway 에 대하여 공부를 하려 합니다.

 

예전에 토스 컨퍼런스인 SLASH-22 를 보다가 Flyway를 봤던 기억이 있는데

그냥 어렴풋이 '데이터베이스 마이그레이션 툴' 이구나~ 만 알고 넘겼었는데 이제 제가 직접 사용해야하니 딥하게 공부를 해야될것 같았습니다.

 

지금 와서 '데이터베이스 마이그레이션 툴' 이라는 단어를 보니

데이터베이스를 어떻게 마이그레이션 하는지도 머리속에서 상상이 안가서

구글링과 영상을 통하여 알게 되었습니다.

 

Flyway란 무엇일까요?

Flyway는 데이터베이스을 마이그레이션 할 수 있는 툴 입니다.

 

무슨 말인지 모르시겠다구요?

 

저도 처음에 봤을때는 무슨 말인지 몰랐습니다. 

 

제가 알고있는 마이그레이션이라는 단어는 nest.js 로 만들어진 서버를 springboot로 마이그레이션 한다~

즉, 어떤 것에서 어떤 것으로 변경한다 라는 의미로 알고있었습니다.

 

그래서 데이터베이스를 다른 데이터베이스로 옮기는 툴 인가? 로 생각도 했었습니다.

하지만, 그런 의미가 아니였더라구요.

 

저희는 쉽게 이해하기 위하여 데이터베이스 형상관리로 Flyway를 정의 해보겠습니다.

형상관리란 소프트웨어의 변경사항을 체계적으로 추적하고 통제 하는 의미를 지니고 있습니다.

형상관리의 예시로는 저희가 자주 사용하는 Git 이 있습니다.

 

Git은 저희의 코드의 변경사항을 체계적으로 관리하듯이

Flyway는 자바 진영의 데이터베이스의 변경사항을 체계적으로 관리할 수 있습니다.

 

실습하면서 알아봅시다.

언어는 코틀린으로 사용했고,

프레임워크는 Spring boot 2.7.2v 을 사용했습니다.

spring:

  datasource:
    url: jdbc:mysql://localhost:3306/flyway // mysql database url
    driver-class-name: com.mysql.cj.jdbc.Driver // mysql driver class name
    username: // 사용자 이름
    password: // 비밀 번호

  jpa:
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    properties:
      hibernate:
        show_sql: true
        format_sql: true
        hbm2ddl:
          auto: validate // 엔티티와 테이블이 정상 매핑되었는지만 확인하는 옵션

 

위는 저희가 자주 사용하는 jpa의 application.yml 설정 파일인데요,

만약 엔티티상의 변경점이 생겨서 테이블에 적용을 하고싶다면 저희는 어떻게 할까요?

 

spring.jpa.properties.hibernate.hbm2ddl.auto 의 설정값을 create 혹은 update로 주로 사용합니다.

 

create 일때에는 테이블을 drop을 한 후 새로 테이블을 만들고,

update 일때에는 테이블에서 컬럼을 새로 추가해줍니다. ( 하지만, 그전 변경점은 남아있죠. )

 

이런 점에 있어서 prod 환경에서는 두 옵션을 쓰기가 상당히 까다롭습니다. ( 사용해선 안됩니다. )

 

그런 점에 있어서 jpa 만의 한계가 있기에 flyway를 사용하는 겁니다.

 

프로젝트 세팅

다음과 같이 Member Entity를 생성해줍니다.

멤버를 저장하는 TestFlyWayApp 클래스 입니다.

멤버를 저장하는 컨트롤러 입니다.

위 코드들은 모두 기본 코드이니 자세한 설명은 생략하겠습니다.

 

본격적으로 flyway 사용 1

이제 본격적으로 flyway를 사용해볼건데요.

프로젝트의 resources/db/migration 경로에  V1__init.sql 파일을 만들어 주면서 아래와 같이 작성합니다.

( 따라하신다면 파일명과 경로를 똑같이 해야합니다. 참고로 언더바 두개입니다! )



여기서부터 본격적인 flyway가 사용이 됩니다.

우선 파일명부터 살펴보겠습니다.

 

파일명은 접두사+버전+__+설명+.sql(확장자) 로 이루워져 있습니다.

( 위 내용을 확인할 수 있는 공식 문서 : https://flywaydb.org/documentation/concepts/migrations#naming )

 

flyway가 파일명을 인식하여 버전을 확인하고 파일을 남김으로서 누가 어떻게 데이터베이스를 수정했는지

로깅의 역할까지 하는 1석2조의 역할을 하고 있습니다.

 

이런 상태로 Application을 Run 하면 DB 마이그레이션이 되었다는 문구의 로그가 뜨게 됩니다.

데이터베이스에서 show tables 명령어를 사용해보면

flyway_schema_history 와 member 테이블이 생성이 되어져있는것을 확인할 수 있습니다.

 

member 테이블을 조회해보면 id, name 컬럼만 있는것을 확인할 수 있습니다.

flyway_schema_history 를 조회해보면

flywqy 파일의 버전과 생성된 시간 등의 여러가지 정보를 자동으로 저장해줍니다.

 

본격적인 flyway 사용 2

다음은 엔티티의 변경점이 생겼을때 (컬럼의 생성 혹은 삭제)의 상황에서는 flyway를 어떻게 사용하는지 알아보겠습니다.

Member 엔티티에 age를 추가해줍니다.

그리고 Application 을 Run 해보면

이런 식으로 에러가 발생하는데요.

왜냐하면 데이터베이스의 컬럼의 변경점이 생겼지만 flyway 파일에는 기록이 되지 않아있어서 에러를 뱉는 것입니다.

 

오류를 해결하기 위해서는 sql 파일을 작성해야 합니다.

아까와 같은 경로인 resources/db/migration 경로 에 V2__add_age_in_member.sql 이라는 파일을 생성하여 아래 사진과 같이 코드를 작성하겠습니다.

그런 뒤 다시 Application을 Run 해보면 성공적으로 변경점이 적용이 되는 모습을 보실 수 있습니다.

 

flyway를 공부하며

친구들과 했던 Dotori 프로젝트에서 버전이 변경됨에따라(기능이 추가됨에 따라) 컬럼을 추가해야되는 상황이 있었는데,

그때 일일이 RDS에 접속해서 테이블 수정 하면서 수동으로 작업했던 기억이 있습니다.

 

그때는 flyway라는 기술이 있는지 조차 몰랐던 상황인데 이번에 공부를 하게 되면서 후배들에게 알려주면서 사용을 권할 수 있게 된것같습니다.

 

(이 글은 우아한테크코스 코기 님의 Flyway 강의, 블로그를 참고 했으며 제 글이 이해가 되지 않으시다면 

https://www.youtube.com/watch?v=pxDlj5jA9z4&t=617s , https://www.blog.ecsimsw.com/ 유튜브, 블로그를 참조해두었으니 한번씩 확인해보시는걸 추천합니다! )

 

 

'데이터베이스' 카테고리의 다른 글

[데이터베이스] 트랜잭션 이란?  (0) 2022.04.02

댓글