데이터베이스 마이그레이션(Database Migration)이란 개발 과정에서 발생하는 데이터베이스 스키마(테이블 구조, 제약조건 등)의 변경 사항을 체계적으로 관리하고 추적하는 프로세스입니다.
문제점:
ddl-auto 한계: create나 update 옵션은 개발 환경에서는 편리하지만, 실제 운영 환경에서는 데이터 유실의 위험이 크고, 정교한 스키마 변경(e.g., 컬럼 이름 변경)을 지원하지 않아 사용할 수 없습니다.Flyway: 이러한 문제를 해결하기 위한 대표적인 데이터베이스 마이그레이션 도구입니다.
V1__create_user_table.sql, V2__add_email_to_user.sql)flyway_schema_history 테이블: Flyway는 데이터베이스 내에 flyway_schema_history라는 메타데이터 테이블을 자동으로 생성합니다. 이 테이블에는 어떤 버전의 SQL 스크립트가 언제, 누구에 의해, 성공적으로 실행되었는지가 모두 기록됩니다.flyway_schema_history 테이블의 기록과 src/main/resources/db/migration 폴더에 있는 SQL 파일들을 비교합니다.build.gradle에 flyway-core와 flyway-mysql(사용하는 DB에 맞게) 의존성을 추가합니다.src/main/resources/db/migration 디렉토리 안에, 정해진 명명 규칙에 따라 SQL 파일을 작성합니다.application.yml 설정: Flyway를 활성화하고, 데이터베이스 접속 정보를 제공합니다.spring:
flyway:
enabled: true
# baseline-on-migrate: true # 기존에 데이터가 있는 DB에 Flyway를 처음 적용할 때 사용셸 스크립트는 운영체제의 셸(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!"
chmod +x deploy.sh./deploy.sh