본문 바로가기

Study Information Technology

Spring Boot와 데이터베이스 마이그레이션

728x90
반응형

Spring Boot와 데이터베이스 마이그레이션

Overview
Spring Boot와 데이터베이스 마이그레이션은 애플리케이션의 데이터베이스 스키마를 효율적으로 관리하는 데 필수적인 과정입니다. 이 과정에서는 데이터베이스의 구조를 변경하거나 새로운 기능을 추가할 때, 데이터베이스를 일관되게 유지할 수 있도록 도와줍니다. 이를 위해 주로 Flyway 또는 Liquibase와 같은 마이그레이션 도구를 사용하며, 이 도구들은 Spring Boot와 원활하게 통합되어 데이터베이스의 버전 관리를 자동화합니다.

Spring Boot와 Flyway

Flyway는 데이터베이스 스키마 버전을 관리하는 데 널리 사용되는 도구입니다. Spring Boot와 Flyway를 통합하여 데이터베이스 마이그레이션을 자동화하는 방법을 살펴보겠습니다.

1. Flyway 설정

의존성 추가

먼저, Flyway를 Spring Boot 프로젝트에 통합하기 위해 build.gradle 또는 pom.xml 파일에 Flyway 의존성을 추가해야 합니다. Maven을 사용하는 경우 pom.xml 파일에 다음과 같이 추가합니다:

<dependency>
  <groupId>org.flywaydb</groupId>
  <artifactId>flyway-core</artifactId>
  <version>9.0.0</version> <!-- 최신 버전 확인 필요 -->
</dependency>

Gradle을 사용하는 경우 build.gradle 파일에 다음과 같이 추가합니다:

implementation 'org.flywaydb:flyway-core:9.0.0' // 최신 버전 확인 필요

기본 설정

Spring Boot는 기본적으로 Flyway를 자동으로 설정해주며, application.properties 또는 application.yml 파일에서 Flyway의 설정을 추가하거나 수정할 수 있습니다. 예를 들어, application.properties 파일에 다음과 같은 설정을 추가합니다:

spring.flyway.url=jdbc:mysql://localhost:3306/mydatabase
spring.flyway.user=myuser
spring.flyway.password=mypassword
spring.flyway.locations=classpath:db/migration

위 설정에서 spring.flyway.url은 데이터베이스의 URL을, spring.flyway.userspring.flyway.password는 데이터베이스 사용자 정보를 설정합니다. spring.flyway.locations은 마이그레이션 파일이 위치한 디렉토리를 지정합니다.

2. 마이그레이션 파일 작성

Flyway는 데이터베이스 마이그레이션을 SQL 스크립트나 Java 코드로 관리할 수 있습니다. 일반적으로 SQL 스크립트를 사용하며, src/main/resources/db/migration 디렉토리에 마이그레이션 파일을 생성합니다. 파일 이름은 V1__initial_schema.sql, V2__add_users_table.sql과 같이 버전과 설명을 포함해야 합니다.

예를 들어, V1__initial_schema.sql 파일에는 다음과 같은 SQL 코드가 포함될 수 있습니다:

CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
password VARCHAR(50) NOT NULL
);

그리고 V2__add_email_to_users.sql 파일에는 다음과 같은 코드가 포함될 수 있습니다:

ALTER TABLE users ADD email VARCHAR(100);

Flyway는 애플리케이션이 시작될 때마다 자동으로 마이그레이션 파일을 적용하여 데이터베이스 스키마를 최신 상태로 유지합니다.

3. Flyway 사용 시 에러 처리

Flyway 사용 시 에러가 발생할 수 있으며, 가장 일반적인 에러는 마이그레이션 파일의 문법 오류 또는 이전 마이그레이션이 실패한 경우입니다. 에러 메시지는 일반적으로 콘솔에 출력되며, 다음과 같은 형태일 수 있습니다:

org.flywaydb.core.api.FlywayException: Migration V2__add_email_to_users.sql failed
----------------------------------------------------
SQL State  : 42S21
Error Code : 1060
Message    : Duplicate column name 'email'

이 경우, email이라는 컬럼이 이미 존재하는데 다시 추가하려고 해서 발생한 문제입니다. 이 문제를 해결하려면, 마이그레이션 파일을 수정하거나 해당 마이그레이션을 롤백할 필요가 있습니다.

4. Flyway 명령어

Flyway는 커맨드라인에서도 사용할 수 있으며, 주요 명령어는 다음과 같습니다:

  • migrate: 새로운 마이그레이션 파일을 적용합니다.
  • clean: 데이터베이스를 초기 상태로 되돌립니다. (주의: 모든 데이터가 삭제됩니다)
  • info: 현재 데이터베이스의 마이그레이션 상태를 표시합니다.
  • baseline: 기존 데이터베이스를 Flyway의 시작 상태로 설정합니다.

예를 들어, 커맨드라인에서 마이그레이션을 적용하려면 다음과 같은 명령어를 사용할 수 있습니다:

flyway migrate

Spring Boot와 Liquibase

Liquibase는 또 다른 데이터베이스 마이그레이션 도구로, XML, YAML, JSON 또는 SQL 형식으로 마이그레이션 파일을 작성할 수 있습니다. Spring Boot와 Liquibase를 통합하여 데이터베이스 마이그레이션을 자동화하는 방법을 살펴보겠습니다.

1. Liquibase 설정

의존성 추가

Liquibase를 사용하기 위해 build.gradle 또는 pom.xml 파일에 Liquibase 의존성을 추가해야 합니다. Maven을 사용하는 경우 pom.xml 파일에 다음과 같이 추가합니다:

<dependency>
  <groupId>org.liquibase</groupId>
  <artifactId>liquibase-core</artifactId>
  <version>4.0.0</version> <!-- 최신 버전 확인 필요 -->
</dependency>

Gradle을 사용하는 경우 build.gradle 파일에 다음과 같이 추가합니다:

implementation 'org.liquibase:liquibase-core:4.0.0' // 최신 버전 확인 필요

기본 설정

Spring Boot는 기본적으로 Liquibase를 자동으로 설정해주며, application.properties 또는 application.yml 파일에서 Liquibase의 설정을 추가하거나 수정할 수 있습니다. 예를 들어, application.properties 파일에 다음과 같은 설정을 추가합니다:

spring.liquibase.url=jdbc:mysql://localhost:3306/mydatabase
spring.liquibase.user=myuser
spring.liquibase.password=mypassword
spring.liquibase.change-log=classpath:db/changelog/db.changelog-master.xml

위 설정에서 spring.liquibase.url은 데이터베이스의 URL을, spring.liquibase.userspring.liquibase.password는 데이터베이스 사용자 정보를 설정합니다. spring.liquibase.change-log는 Liquibase의 변경 로그 파일이 위치한 경로를 지정합니다.

2. 변경 로그 파일 작성

Liquibase는 변경 로그 파일을 사용하여 데이터베이스 스키마 변경 사항을 정의합니다. 이 파일은 XML, YAML, JSON 등의 형식으로 작성할 수 있으며, 일반적으로 src/main/resources/db/changelog 디렉토리에 위치합니다. 예를 들어, db.changelog-master.xml 파일에는 다음과 같은 내용이 포함될 수 있습니다:

<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
                   xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
                                       http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd">

  <changeSet id="1" author="author">
    <createTable tableName="users">
      <column name="id" type="int">
        <constraints primaryKey="true" nullable="false"/>
      </column>
      <column name="username" type="varchar(50)">
        <constraints nullable="false"/>
      </column>
      <column name="password" type="varchar(50)">
        <constraints nullable="false"/>
      </column>
    </createTable>
  </changeSet>

  <changeSet id="2" author="author">
    <addColumn tableName="users">
      <column name="email" type="varchar(100)"/>
    </addColumn>
  </changeSet>

</databaseChangeLog>

3. Liquibase 사용 시 에러 처리

Liquibase를 사용할 때도 에러가 발생할 수 있습니다. 가장 일반적인 에러는 XML 형식 오류 또는 마이그레이션 충돌입니다. 에러 메시지는 일반적으로 콘솔에 출력되며, 다음과 같은 형태일 수 있습니다:

liquibase.exception.ValidationFailedException: Validation Failed: 1 change sets check sum

이 경우, 변경 로그 파일의 형식이나 내용에 문제가 있을 수 있습니다. 에러 메시지를 확인하여 문제를 수정하고, 변경 로그 파일을 올바르게 작성했는지 확인해야 합니다.

4. Liquibase 명령어

Liquibase는 커맨드라인에서도 사용할 수 있으며, 주요 명령어는 다음과 같습니다:

  • update: 변경 로그 파일을 적용하여 데이터베이스를 업데이트합니다.
  • rollback: 이전 상태로 롤백합니다
728x90
반응형