flyway가 왜 필요할까?
ddl-auto도 쓰지 못하게 되는데..
[우테코 팀플 4차 스프린트 요구사항]

직접 운영 디비를 수정하면 어떤 문제가 생길까요?
drop 테이블을 막았더라도 다음과 같은 문제가 생길 수 있습니다.
여기 개발팀의 흔한 하루가 있습니다.
짱성 (사수): "아, member 테이블의 name 컬럼을 user_name으로 바꾸는 게 더 명확하겠어." 짱성이는 바로 운영 DB에 접속해 ALTER 쿼리를 실행합니다.
행성 (부사수): "name 컬럼을 사용하는 새로운 기능을 개발해야겠다"
결과는 어떨까요? 행성이가 만든 기능은 name 컬럼을 찾지 못해 장애를 일으킵니다.
이런 문제는 왜 발생할까요? 바로 모든 개발자가 운영 DB에 직접 쿼리를 날려 스키마를 수정하고, 그 변경 사항이 아무에게도 공유되지 않기 때문입니다. 모든 개발자는 언제, 누가, 무엇을 바꿨는지 알 수 없어 항상 최신 스키마를 외우고 다녀야 하는 불안한 상황에 놓입니다.
Flyway는 데이터베이스의 Git이라고 생각되더라고요.
만약 여러 개발자가 하나의 중요한 main.java 파일을 공유 폴더에 놓고 각자 수정한다고 상상해 보세요. 누가 최신 버전을 덮어쓸지 몰라 불안할 겁니다. 그래서 우리는 Git으로 버전을 관리하고, commit 메시지로 변경 사항을 기록하며, pull을 통해 모두가 최신 버전을 유지합니다.
Flyway는 데이터베이스 스키마를 위한 Git입니다.
깃에서 커밋으로 버전을 관리하는것처럼 flyway는 다음과 같이 버전을 관리합니다.
V1__create_member_table.sql
V2__rename_name_to_user_name.sql
V3__add_email_column.sql
버전을 통해 변경 순서를 보장하며,
어떤 스크립트가 언제, 누구에 의해 적용되었는지 flyway_schema_history 테이블에 모두 기록됩니다.
운영 DB에 직접 접속하는 대신, 새로운 버전의 SQL 마이그레이션 파일을 작성하여 Git에 올립니다. 그러면 모든 팀원과 모든 서버(개발, 운영)의 DB 스키마는 항상 동일한 최신 상태로 자동 동기화됩니다.
번거롭기는 하지만, 예기치 못한 운영서버의 문제를 막을 수 있습니다.
운영 서버에 ddl auto를 update하는것은 예기치 못한 에러를 발생시킬 수 있습니다.
아까 언급했지만, 운영 디비의 스키마가 모두 녹아져있는것이 문서화 관점에서 좋습니다.
현재 운영 디비의 스키마를 모두 파악할 수 있게 작성하는 것이 좋습니다. 로컬,dev에서는 데이터베이스를 날린뒤 실행하고, 이 때 V1 스크립트가 실행되는 경우가 있다면 로컬,dev에서 작업하기가 힘든 상황이 생깁니다.
flyway:
enabled: true
baseline-on-migrate: true # 마이그레이션 시 베이스라인이 없으면 자동으로 생성
baseline-version: "1" # V1을 베이스라인 버전으로 설정
baseline-description: "Initial schema baseline"
flyway는, 초기 1.0.0 릴리즈전까지는 도입하지 않는것이 낫다는 제 개인적인 의견입니다.
1.0.0 배포전에는, 기능을 빠르게 내면서 요구사항이 수정되는 것이 많은데
flyway를 먼저 도입해버린다면 빠른 개발 속도를 내지 못하기 때문입니다.
flyway는 DB 안정성을 챙기는 선택이며 이는 프로젝트 초기에는 필요하지 않을 수 있습니다.