Flyway로 데이터베이스 형상관리를 해보자

2024. 2. 13. 16:58Web/spring-boot

1. Flyway

  • 데이터베이스 마이그레이션 툴
  • 데이터베이스 변경사항 추적 및 업데이트나 롤백을 쉽게 할 수 있도록 도와주는 도구
  • 보통 운영환경, 개발환경, 로컬환경 에서 각자의 DB를 갖고있는데, 이 모든 환경에서 DB의 Schema를 맞추기 위함
  • 데이터베이스 Schema의 변경 이력이 남는 이점이 있고, 변경작업을 안전하게 할 수 있다.
  • 만약 코드 상 스키마 변경이 데이터베이스에 반영되지 않은 이슈를 예방할 수 있다.
  • 배포하는 순간 flyway가 스키마를 알아서 수정하여 준다.

2. 동작 방식

  • flyway 를 적용하게 되면 fly_way_schema_history 라는 테이블이 생성되게 됩니다.
  • 이 테이블은 데이터베이스의 상태를 추적하는 데 사용됩니다.
  • 마이그레이션은 버전 기준으로 정렬되고 순서대로 적용됩니다.

3. 동작 테스트

  • maven에 dependency 추가
		<dependency>
			<groupId>org.flywaydb</groupId>
			<artifactId>flyway-core</artifactId>
		</dependency>
  • application.yml 에 설정 추가 ( h2 DB사용 )
spring:
  h2:
    console:
      enabled: true
  datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:mem:flyway-sample;MODE=MYSQL
    username: root
    password: password

  jpa:
    hibernate:
      ddl-auto: validate  //이 옵션으로 flyway 정상동작 확인
    database-platform: org.hibernate.dialect.MySQL8Dialect
    defer-datasource-initialization: false
    properties:
      hibernate:
        show_sql: true
        format_sql: true

  flyway:
    enabled: true  //flyway 활성화
  • JPA entity 정의
@Entity
@Table(name = "member")
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String password;
    private String name;
    private String email;
}
  • dependency를 추가하여 주면 resource 폴더에 db/migration 폴더가 생성 됩니다.
  • 첫번째 DB 스크립트 작성
CREATE TABLE member (
    id BIGINT AUTO_INCREMENT,
    password VARCHAR(255),
    name VARCHAR(255),
    email VARCHAR(255),
    PRIMARY KEY (id)
)
  • 이렇게 해서 서버 동작 후 DB 확인

flyway_schema_history
히스토리 테이블 버전 ROW 생성

  • 이제 entity를 수정하고 재동작 해보겠습니다.
@Entity
@Table(name = "member")
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String password;
    private String name;
    private String email;
    private String phone; //필드 추가
}
Schema-validation: missing column [contact] in table [member]
  • ddl-auto 를 validate로 설정했기 때문에 실제 테이블에는 phone 컬럼이 존재하지 않기 때문에 스키마가 불일치 하여 에러가 발생했습니다.
  • 다음으로 테이블의 스키마와 엔티티가 일치하도록 스크립트를 추가하도록 합니다.
ALTER TABLE member ADD COLUMN phone varchar(255)
  • V1.1__add_phone.sql 이라는 스크립트를 db/migrantion 폴더에 추가하여줍니다.

history 테이블에 버전이 추가 된걸 확인

4. 마이그레이션 스크립트 명명 규칙

  • Flyway에서 기본적으로 스크립트 파일은 숫자가 작은버전부터 큰 순서대로 실행됩니다.
  • V{버전}__{디스크립션}.sql 형식으로 스크립트를 작성해 주면 됩니다.