TIL - 20251122

juni·2025년 11월 21일

TIL

목록 보기
185/317

1122 Spring Boot: DB 마이그레이션(Flyway)과 배포 자동화(Shell Script)


✅ 1. 데이터베이스 마이그레이션과 Flyway

  • 데이터베이스 마이그레이션(Database Migration)이란 개발 과정에서 발생하는 데이터베이스 스키마(테이블 구조, 제약조건 등)의 변경 사항을 체계적으로 관리하고 추적하는 프로세스입니다.

  • 문제점:

    • JPA의 ddl-auto 한계: createupdate 옵션은 개발 환경에서는 편리하지만, 실제 운영 환경에서는 데이터 유실의 위험이 크고, 정교한 스키마 변경(e.g., 컬럼 이름 변경)을 지원하지 않아 사용할 수 없습니다.
    • 수동 관리의 어려움: 여러 개발자가 각자 SQL 스크립트를 수동으로 관리하고 실행하면, 어떤 스크립트가 어떤 순서로 실행되었는지 추적하기 어렵고, 개발 환경과 운영 환경의 DB 스키마가 불일치하게 될 위험이 매우 큽니다.
  • Flyway: 이러한 문제를 해결하기 위한 대표적인 데이터베이스 마이그레이션 도구입니다.

➕ Flyway의 동작 원리

  1. SQL 스크립트 기반: Flyway는 SQL 파일을 기반으로 마이그레이션을 수행합니다. 개발자는 스키마 변경이 필요할 때마다 새로운 SQL 파일을 작성합니다.
  2. 버전 관리: 각 SQL 파일은 정해진 명명 규칙에 따라 버전 번호를 가집니다. (e.g., V1__create_user_table.sql, V2__add_email_to_user.sql)
  3. flyway_schema_history 테이블: Flyway는 데이터베이스 내에 flyway_schema_history라는 메타데이터 테이블을 자동으로 생성합니다. 이 테이블에는 어떤 버전의 SQL 스크립트가 언제, 누구에 의해, 성공적으로 실행되었는지가 모두 기록됩니다.
  4. 자동 마이그레이션: 애플리케이션이 시작될 때, Flyway는 flyway_schema_history 테이블의 기록과 src/main/resources/db/migration 폴더에 있는 SQL 파일들을 비교합니다.
    • 아직 실행되지 않은 새로운 버전의 SQL 스크립트가 있다면, Flyway는 버전 순서대로 해당 스크립트들을 자동으로 실행하고, 그 결과를 히스토리 테이블에 기록합니다.

➕ Spring Boot와 Flyway 연동

  1. 의존성 추가: build.gradleflyway-coreflyway-mysql(사용하는 DB에 맞게) 의존성을 추가합니다.
  2. SQL 파일 작성: src/main/resources/db/migration 디렉토리 안에, 정해진 명명 규칙에 따라 SQL 파일을 작성합니다.
  3. application.yml 설정: Flyway를 활성화하고, 데이터베이스 접속 정보를 제공합니다.
    spring:
      flyway:
        enabled: true
        # baseline-on-migrate: true # 기존에 데이터가 있는 DB에 Flyway를 처음 적용할 때 사용
  • 장점:
    • DB 스키마 변경 이력을 코드로 명확하게 관리할 수 있습니다.
    • 어떤 환경(로컬, 개발, 운영)에서든 항상 동일하고 일관된 DB 스키마 상태를 보장할 수 있습니다.
    • CI/CD 파이프라인에 통합하여 배포 시 DB 마이그레이션을 자동화할 수 있습니다.

✅ 2. 셸 스크립트 (Shell Script)를 이용한 배포 자동화

  • 셸 스크립트는 운영체제의 셸(Shell)에서 실행할 수 있는 명령어들의 나열을 텍스트 파일로 작성한 것입니다. 이를 통해 반복적인 서버 관리 및 배포 작업을 자동화할 수 있습니다.

  • 문제점: 매번 배포할 때마다 EC2 서버에 접속해서 git pull, ./gradlew build, docker build, docker run 등의 명령어들을 순서대로 수동으로 입력하는 것은 번거롭고, 실수가 발생하기 쉽습니다.

  • 해결책: 이 명령어들을 하나의 셸 스크립트 파일(.sh)로 작성해두고, 필요할 때 이 스크립트 파일 하나만 실행하여 전체 배포 과정을 자동화합니다.

➕ 간단한 배포 스크립트 예시 (deploy.sh)

#!/bin/bash

# 1. Git 리포지토리에서 최신 코드 가져오기
echo "Pulling latest source code..."
git pull origin main

# 2. Gradle을 사용하여 프로젝트 빌드
echo "Building the project with Gradle..."
./gradlew build

# 3. 기존에 실행 중이던 Docker 컨테이너 중지 및 제거
echo "Stopping and removing old container..."
docker stop my-spring-app || true  # 컨테이너가 없어도 오류 없이 진행
docker rm my-spring-app || true

# 4. 새로운 Docker 이미지 빌드
echo "Building new Docker image..."
docker build -t my-spring-app:latest .

# 5. 새로운 Docker 컨테이너 실행
echo "Running new Docker container..."
docker run -d -p 8080:8080 --name my-spring-app my-spring-app:latest

echo "Deployment completed successfully!"

➕ 스크립트 실행

  1. 실행 권한 부여: 스크립트 파일을 처음 만들었을 때는 실행 권한이 없으므로, 권한을 부여해야 합니다.
    chmod +x deploy.sh
  2. 스크립트 실행:
    ./deploy.sh
  • CI/CD와의 연계: GitHub Actions와 같은 CI/CD 도구의 배포(CD) 단계에서는, SSH를 통해 배포 서버에 접속한 후, 최종적으로 이러한 배포 셸 스크립트를 실행하는 방식으로 자동 배포 파이프라인을 완성하는 경우가 많습니다.

📌 요약

  • Flyway는 SQL 스크립트와 버전 관리를 통해 데이터베이스 스키마 변경을 체계적이고 자동화된 방식으로 관리하는 필수적인 DB 마이그레이션 도구입니다.
  • 셸 스크립트는 반복적인 서버 명령어들을 하나의 파일로 묶어 자동화하는 방법으로, 수동 배포 과정에서 발생하는 실수를 줄이고 효율성을 높여줍니다.
  • Flyway로 DB 스키마를 관리하고, 셸 스크립트로 애플리케이션 배포를 자동화함으로써, "코드로서의 인프라(Infrastructure as Code)"에 한 걸음 더 다가갈 수 있으며, 안정적이고 예측 가능한 배포 환경을 구축할 수 있습니다.

0개의 댓글