-
Flyway로 데이터베이스 마이그레이션 해보자 (이론편)Spring Boot/DB 2022. 7. 14. 19:43
Flyway란 무엇인가?
Open Source Database Migration Tool
- DB 형상 관리 (소프트웨어 변경사항 체계적으로 추적 통제하는 것)
Git 처럼 데이터베이스의 History를 관리 해주는 도구이다.
데이터베이스에 직접 DDL을 입력하는게 아니라 SQL File로 데이터베이스를 변경/생성/삭제하며 관리할 수 있다.
즉, DB에 직접 접근하는게 아니라 코드에서 관리할 수 있음.
더나아가 누가, 언제, 어떤 테이블에 어떤 작업을 했는지 기록이 남는다. (퇴사자가 무엇을 했는지 확인 가능)
상상해보자.. 개발하다가 테이블 변경할 일이 생겼다. 그리고 DBA가 없는 회사다.
데이터베이스에 들어가서 ALTER TABLE..... 어쩌고 작성하는데 몇만건의 데이터가 있는 DB라면..? 너무 무섭다.
형상관리 도구를 사용한다면 무서움이 덜할 것이다.
DB 마이그레이션 도구로 Flyway 말고는 Liquibase가 있다.
Flyway 사용 방법
- Spring에서 설정
- dependency 추가
<dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jdbc</artifactId> </dependency>
- application.properties 파일 설정
#### Flyway Properties spring.flyway.enabled=true spring.flyway.locations=classpath:db/migration
- resource/db/migration 폴더를 생성한다.
- migration 폴더 안에 SQL 파일을 생성해서 SQL 문을 작성한다.
- 이때 파일명은 Flyway에서 지정한 규칙을 따른다.
- V1__{이름}.sql
- V1.2__{이름}.sql
- V2__{이름}.sql
- 버전의 숫자의 순서대로 실행된다.
- 이때 DB에 한번 적용된 SQL 파일은 절때로 변경하지 않는다. -> 바꾸면 checksum mismatch Error가 발생하는데 해결 방법이 매우 복잡하다.
- V3까지 실행하고 V2.1을 만들어 적용하면 적용 안됨. 파일명의 버전 숫자는 오름차순 따름
- 공식 사이트 네이밍 규칙
- 이때 파일명은 Flyway에서 지정한 규칙을 따른다.
- V1__파일의 내용은 이런식일 것
결과
DB가 연결된 상태로 프로젝트를 빌드하면 아래와 같은 테이블이 자동으로 생성되고, 테이블에 코드에서 작성한 SQL 파일 정보가 기록된다. 그리고 SQL 파일에 작성한 Schema DDL이 실행된다.
- Flyway_schema_history
- SQL 버전 파일이 기록된다. 작성자, 생성일자, checksum(변경 검증), 파일명 등을 확인할 수 있다.
기타 옵션, 부가기능들이 꽤 있는데
밑에 공식 문서가 너무 잘되어 있어서 필요할때 찾아보면 될듯 함
출처
https://github.com/amigoscode/jdbc
https://www.youtube.com/watch?v=pxDlj5jA9z4
반응형'Spring Boot > DB' 카테고리의 다른 글
[M1 Mac] Mysql 명령어 정리 (+ docker로 설치) (0) 2023.06.27 [SQL] Or 와 In 조건 뭐가 더 좋을까? SELECT OR vs IN, which is better performance. (0) 2022.07.15 [Mybatis 시리즈 2] DataSouce와 DBCP (DataBase Connection Pool) (0) 2022.04.14 [Mybatis 시리즈 1] 동작 원리와 스프링에서 어떻게 사용될까? (0) 2022.04.14 DB 연결 시, 특정 객체만 close() 하는 이유 (0) 2022.01.11 - Spring에서 설정