Miracle Morning, LHWN

13. DDL-AUTO 와 Flyway 본문

IT 기술/[JAVA] Spring Boot

13. DDL-AUTO 와 Flyway

Lee Hye Won 2021. 5. 22. 11:56
DDL (Data Definition Language)

데이터 정의 언어이다.

컴퓨터 사용자 또는 응용 프로그램 소프트웨어가 컴퓨터의 데이터를 정의하는 컴퓨터 언어 또는 컴퓨터 언어 요소이다.

 

  • CREATE : 새로운 데이터베이스 관계 (테이블), VIEW, 인덱스, 저장 프로시저를 만든다.
  • DROP : 이미 존재하는 데이터베이스 관계 (테이블), VIEW, 인덱스, 저장 프로시저를 제거한다.
  • ALTER : 이미 존재하는 데이터베이스 개체에 대한 변경, RENAME 의 역할을 한다.
  • TRUNCATE : 관계 (테이블) 에서 데이터를 돌이킬 수 없는 제거이다.

 

ddl-auto

Spring Boot 는 ddl-auto 라는 이름으로 DDL 모드 (DB 초기화 전략) 를 정의한다. 

JPA 데이터베이스는 Embedded Database (H2, HSQL, Derby) 를 사용할 때만 자동으로 생성 가능하다.

 

SpringBoot 속성 파일 내 아래와 같이 ddl-auto 타입을 선언하여 사용한다.

spring.jpa.hibernate.ddl-auto=create-drop

 

# DDL 모드 종류

  • none : 사용하지 않는다.
  • update : 변경된 스키마가 존재할 경우 적용한다.
  • validate : 변경된 스키마가 존재하는지 확인한다.
  • create : 시작할 때마다 스키마를 생성한다.
  • create-drop : SessionFactory 가 시작될 때 drop 및 생성을 실행하고, SessionFactory 가 종료될 때 drop 을 실행한다.
{
  "name": "spring.jpa.hibernate.ddl-auto",
  "values": [
    {
      "value": "none",
      "description": "Disable DDL handling"
    },
    {
      "value": "validate",
      "description": "Validate the schema, make no changes to the database"
    },
    {
      "value": "update",
      "description": "Update the schema if necessary"
    },
    {
      "value": "create",
      "description": "Create the schema and destroy previous data"
    },
    {
      "value": "create-drop",
      "description": "Create and then destroy the schema at the end of the session"
    },
  ]
}

 

데이터베이스 마이그레이션 (DataBase Migration)

스키마 마이그레이션은 (데이터베이스 마이그레이션, 데이터베이스 변경 관리) 은 관계형 데이터베이스 스키마에 대한 증분,

가역적 변경 및 버전 제어를 의미한다.

 

스키마 마이그레이션은 해당 데이터베이스의 스키마를 최신 또는 이전 버전으로 업데이트하거나 되돌릴 필요가 있을 때마다 데이터베이스에서 수행된다. 

 

# 마이그레이션 관리가 필요한 이유?

만일 하나의 프로젝트에서 DB 스키마가 변경된 이력을 확인할 수 없다면

  1. 여러 작업자 간 동일한 데이터베이스 환경을 구성하기 어렵다.
  2. DB 스키마에 문제가 발생했을 때 해결이 어렵다.
  3. Entity 객체의 변화에 DB 스키마가 바로 반영되기 때문에 실수로 인해 데이터 손실이 발생할 수 있다.

 

Flyway

SpringBoot 에서 데이터베이스 스키마의 변경이력을 관리하는 기능을 제공하는 라이브러리이며, 데이터베이스를 위한 버전 컨트롤 시스템이다.

 

 # 스키마를 관리하기 위한 7가지 기능

  1. Migrate
    • 스키마를 최신 버전으로 마이그레이션한다. (갱신한다.)
    • 스키마 기록 테이블을 자동으로 생성해준다. (history 확인 용도)
    • Flyway 워크 플로우의 핵심 기능이다.
    • 파일 시스템 또는 클래스 경로를 스캔한 후 데이터베이스에 적용된 마이그레이션과 비교를 수행한다.
    • 만일, 차이가 존재할 경우 데이터베이스 마이그레이션을 수행한다.
    • Migrate 는 데이터베이스 ↔ 코드의 기대치(코드로 구현해놓은 스키마 파일) 사이의 비호환성을 피하기 위해 어플리케이션 시작 시 실행하는 것을 추천한다.  
  2. Clean
    • 구성된 스키마의 모든 개체를 삭제한다.
    • 개발 및 테스트 시 큰 도움이 된다.
    • 구성된 스키마를 완전히 삭제하여 효과적으로 새롭게 시작할 수 있다.
    • 모든 개체 (테이블, 뷰, 프로시저 등) 가 삭제되므로 Production 에서 사용하면 안된다.
  3. Info
    • 모든 마이그레이션에 대한 세부 정보 및 상태 정보를 출력한다.
    • 마이그레이션의 현재 상태를 상세히 확인 가능하다.
  4. Validate
    • 사용 가능한 마이그레이션에 대해 유효성 검사를 실행한다.
    • 로컬에 사용된 마이그레이션이 데이터베이스에 적용된 마이그레이션과 일치하는지 확인한다.
    • 우발적인 변경을 감지하여 스키마를 재생성하는 등의 오류를 방지하는데 유용하다.
  5. Undo
    • 가장 최근에 적용된 버전 마이그레이션의 실행을 취소한다.
  6. Baseline
    • 기존 데이터베이스의 기준을 설정한다.
    • Baseline 은 특정 버전에서 기준선을 지정하여 기존 데이터베이스에 Flyway 를 도입하기 위한 것이다.
    • 기준 버전을 포함한 모든 마이그레이션을 무시하여 최신 마이그레이션을 적용하게 된다.
  7. Repair
    • 스키마 기록 테이블을 복구한다.
    • 실패한 마이그레이션 항목을 제거한다. (DDL 트랜잭션을 지원하지 않는 데이터베이스에만 해당한다.)
    • 적용된 마이그레이션의 체크섬, 설명 및 유형을 사용 가능한 마이그레이션 중 하나와 재정렬한다.
    • 누락된 모든 마이그레이션을 삭제됨으로 표시한다.

 

Flyway 사용해보기

 

# SQL 방식

  1. Naming
    • Prefix : V, U, R
    •  
    • Version : 점 또는 _ 사용 가능하며, 숫자로 표기
    • Separator : __ (two underscorec)
    • Description : Underscores
    • Suffix : .sql

https://fastcampus.co.kr/courses/204729/clips/

 

2. Flyway 가 마이그레이션 파일들을 찾는 규칙

  • locations 프로퍼티에 명시된 하나 이상의 디렉토리에서 sql 기반 마이그레이션을 검색
  • 접두사가 없거나, classpath: 접두사가 있으면 Java classpath 를 타겟으로 한다.

https://fastcampus.co.kr/courses/204729/clips/

  • 접두사가 있으면 파일 시스템 (filesystem) 을 타겟으로 한다.

https://fastcampus.co.kr/courses/204729/clips/

  • naming 규칙을 준수하는 한 명시된 locations 를 기준으로 새로운 sql 마이그레이션을 Flyway 가 자동으로 선택한다.

 

# Java 방식 

: Java 기반 마이그레이션은 SQL 을 사용하여 쉽게 표현할 수 없는 BLOB & CLOB 변경이나 고급 대량 데이터 변경 (재계산, 고급 형식 변경 등) 에 매우 적합하다.

 

※ BLOB : Binary Large Object. 이진 대형 객체로 이미지/동영상/MP3 등이 있다.
※ CLOB : Character Large Object. 문자 대형 객체로 Oracle Server 는 CLOB <> VARCHAR2 사이에 암시적 변환을 수행한다.

 

1. Naming

  • JavaMigration 인터페이스를 반드시 구현해야 한다.
  • 대개 BaseJavaMigration 구현체를 상속하여 Flyway 가 자동으로 Version 과 Description 을 추출할 수 있도록 한다.

 

  • Prefix : V, U, R
  • Version : _
  • Separator : __ (two underscores)
  • Description : Underscores

https://fastcampus.co.kr/courses/204729/clips/

2. Flyway 가 마이그레이션 파일들을 찾는 규칙

  • locations 프로퍼티에 명시된 하나 이상의 디렉토리에서 Java 기반 마이그레이션을 검색한다.

https://fastcampus.co.kr/courses/204729/clips/

  • 새로운 Java 마이그레이션은 런타임 시 클래스 경로 스캔을 통해 자동으로 검색된다.
  • 스캔은 재귀적으로 동작하여 지정된 하위 패키지의 Java 마이그레이션도 선택된다.

 

출처 : https://fastcampus.co.kr/courses/204729/clips/

 

Comments