스프링 부트 3에서 데이터베이스 마이그레이션(Database Migration)은 애플리케이션의 데이터 구조를 변경하거나 업데이트하는 과정을 체계적으로 관리하는 중요한 작업입니다. 특히, 대규모 프로젝트에서 데이터베이스 스키마를 안전하고 효율적으로 변경하는 것은 성공적인 배포와 유지 보수의 핵심 요소입니다. 본 글에서는 데이터베이스 마이그레이션의 개념, 스프링 부트 3에서 사용하는 주요 도구 및 구현 예제를 중심으로 설명하겠습니다.
1. 데이터베이스 마이그레이션이란?
데이터베이스 마이그레이션은 데이터베이스의 구조(스키마)나 데이터를 변경하기 위한 일련의 프로세스를 의미합니다.
예를 들어, 다음과 같은 작업이 데이터베이스 마이그레이션에 해당합니다:
- 새로운 테이블 추가
- 기존 테이블의 컬럼 수정
- 불필요한 테이블이나 데이터 삭제
- 데이터베이스 간 데이터 이전
마이그레이션 도구를 사용하면 이러한 작업들을 효율적으로 관리하고 변경 이력을 기록할 수 있습니다.
2. 스프링 부트 3에서 데이터베이스 마이그레이션 도구
스프링 부트 3에서는 데이터베이스 마이그레이션을 위해 다양한 도구를 사용할 수 있습니다. 대표적인 도구로는 Flyway와 Liquibase가 있습니다.
2.1 Flyway
Flyway는 간단하면서 강력한 데이터베이스 마이그레이션 도구입니다. SQL 기반의 마이그레이션 스크립트를 작성해 데이터베이스 변경 작업을 수행합니다.
- 장점:
- 설정이 간단하며, SQL 파일만 작성하면 실행 가능
- 스프링 부트와 쉽게 통합
- 변경 이력 관리 용이
2.2 Liquibase
Liquibase는 XML, YAML, JSON 또는 SQL을 사용해 데이터베이스 변경 사항을 관리할 수 있는 도구입니다.
- 장점:
- 다양한 포맷 지원
- 데이터베이스 상태를 시각화하고 변경 이력을 추적 가능
- 특정 환경에 맞춘 변경 사항 관리 가능
3. 스프링 부트 3에서 Flyway 설정하기
Flyway를 사용해 데이터베이스 마이그레이션을 설정하는 기본적인 과정은 다음과 같습니다.
3.1 의존성 추가
먼저 build.gradle 또는 pom.xml에 Flyway 의존성을 추가합니다.
Gradle
dependencies {
implementation 'org.flywaydb:flyway-core'
}
3.2 마이그레이션 스크립트 작성
src/main/resources/db/migration 디렉토리에 SQL 파일을 생성합니다.
파일 이름은 V1__Description.sql 형식을 따릅니다.
-- V1__Create_users_table.sql
CREATE TABLE users (
id BIGINT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL
);
3.3 애플리케이션 설정
application.yml 또는 application.properties 파일에서 Flyway 설정을 추가합니다.
spring:
flyway:
enabled: true
locations: classpath:db/migration
3.4 애플리케이션 실행
애플리케이션을 실행하면 Flyway가 자동으로 마이그레이션을 수행합니다.
4. Liquibase를 활용한 마이그레이션 예제
Liquibase 설정도 Flyway와 유사하며, XML 기반 설정이 일반적입니다.
4.1 의존성 추가
dependencies {
implementation 'org.liquibase:liquibase-core'
}
4.2 변경 로그 작성
src/main/resources/db/changelog/db.changelog-master.xml 파일을 생성합니다.
4.3 애플리케이션 설정
spring:
liquibase:
enabled: true
change-log: classpath:db/changelog/db.changelog-master.xml
4.4 실행
Liquibase는 애플리케이션 실행 시 자동으로 변경 사항을 적용합니다.
5. 예제: 다양한 시나리오에서의 마이그레이션
5.1 새 테이블 추가
SQL 기반의 Flyway 스크립트를 통해 새로운 테이블을 추가합니다.
-- V2__Add_orders_table.sql
CREATE TABLE orders (
order_id BIGINT PRIMARY KEY,
user_id BIGINT NOT NULL,
amount DECIMAL(10, 2) NOT NULL,
order_date TIMESTAMP NOT NULL
);
5.2 컬럼 수정
Liquibase XML을 사용해 기존 테이블의 컬럼을 수정합니다.
<changeSet id="2" author="admin">
<addColumn tableName="users">
<column name="phone_number" type="VARCHAR(15)"/>
</addColumn>
</changeSet>
5.3 데이터 이전
특정 데이터베이스 간 데이터를 이전하는 예제입니다. Flyway를 활용해 데이터를 복사합니다.
-- V3__Migrate_data.sql
INSERT INTO new_table (id, name, value)
SELECT id, name, value
FROM old_table;
6. 스프링 부트 3에서 마이그레이션의 장점
- 자동화: 개발자가 수작업으로 데이터베이스를 관리하지 않아도 됨
- 변경 이력 관리: 변경 내역을 쉽게 추적 가능
- 환경 독립성: 동일한 설정으로 로컬, 스테이징, 프로덕션 환경에서 일관된 결과 보장
결론
스프링 부트 3에서 데이터베이스 마이그레이션은 Flyway와 Liquibase와 같은 도구를 활용해 효율적으로 구현할 수 있습니다. 프로젝트 규모나 요구사항에 따라 적합한 도구를 선택하고, 체계적인 설정을 통해 안전하고 빠르게 데이터베이스 변경 작업을 관리하세요.
'스프링 부트3' 카테고리의 다른 글
스프링 부트 3의 유닛 테스트 기법 (0) | 2024.12.06 |
---|---|
스프링 부트 3와 Flyway: 데이터베이스 마이그레이션을 위한 완벽한 조합 (1) | 2024.12.06 |
스프링 부트 3의 Reactive Programming (0) | 2024.12.06 |
스프링 부트 3에서 메일 발송 구현 (0) | 2024.12.06 |
CSRF 보호와 스프링 부트 3: 웹 애플리케이션 보안의 필수 요소 (0) | 2024.12.06 |