#Day54

D0-$ANG ₩0N·2026년 1월 18일
post-thumbnail

Spring Boot 자동 배포 정리 (Velog)

1. 개요

Spring Boot 자동 배포는 코드 변경 시 빌드부터 서버 반영까지의 과정을 자동화하는 것이다.
주요 목표는 다음과 같다.

  • 수동 빌드/업로드 제거
  • 배포 실수 감소
  • 빠른 롤백 및 안정적 운영

일반적인 구성은 다음과 같다.

  • GitHub (소스 코드 관리)
  • CI 도구 (GitHub Actions)
  • 서버 (AWS EC2)
  • 실행 방식 (Jar + systemd 또는 Docker)

2. 기본 아키텍처 흐름

  1. 로컬에서 코드 작성 후 GitHub에 push
  2. GitHub Actions가 자동으로 실행
  3. 프로젝트 빌드 (Gradle 또는 Maven)
  4. 빌드 결과물(Jar 또는 Docker Image) 생성
  5. EC2 서버로 전송
  6. 서버에서 애플리케이션 재시작

3. 서버 사전 준비

3.1 EC2 환경

  • OS: Ubuntu 20.04 이상
  • Java 17 이상 설치
  • Git, unzip 설치
sudo apt update
sudo apt install -y openjdk-17-jdk git unzip

3.2 애플리케이션 디렉토리

/home/ubuntu/app

Jar 파일 또는 Docker 컨테이너는 이 경로에서 관리


4. Spring Boot 빌드 설정

4.1 Gradle 기준

./gradlew clean build

빌드 결과물 위치

build/libs/app.jar

테스트를 생략하고 싶다면

./gradlew build -x test

5. GitHub Actions CI 설정

5.1 workflow 파일 생성

경로

.github/workflows/deploy.yml

5.2 기본 CI 스크립트 예시

name: Spring Boot CI/CD

on:
  push:
    branches: [ "main" ]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Set up JDK
        uses: actions/setup-java@v4
        with:
          java-version: '17'
          distribution: 'temurin'

      - name: Build
        run: ./gradlew clean build -x test

6. EC2 배포 자동화 (scp 방식)

6.1 GitHub Secrets 설정

Repository Settings > Secrets > Actions

  • EC2_HOST
  • EC2_USER
  • EC2_KEY (private key)

6.2 배포 스크립트 추가

      - name: Deploy to EC2
        uses: appleboy/scp-action@v0.1.7
        with:
          host: ${{ secrets.EC2_HOST }}
          username: ${{ secrets.EC2_USER }}
          key: ${{ secrets.EC2_KEY }}
          source: "build/libs/*.jar"
          target: "/home/ubuntu/app"

7. 서버 실행 자동화

7.1 실행 스크립트

#!/bin/bash

pkill -f app.jar
nohup java -jar /home/ubuntu/app/app.jar > app.log 2>&1 &

7.2 GitHub Actions에서 원격 실행

      - name: Restart App
        uses: appleboy/ssh-action@v1.0.3
        with:
          host: ${{ secrets.EC2_HOST }}
          username: ${{ secrets.EC2_USER }}
          key: ${{ secrets.EC2_KEY }}
          script: |
            bash /home/ubuntu/app/run.sh

8. systemd 기반 운영 (권장)

8.1 서비스 파일

/etc/systemd/system/spring-app.service
[Unit]
Description=Spring Boot Application
After=network.target

[Service]
User=ubuntu
ExecStart=/usr/bin/java -jar /home/ubuntu/app/app.jar
SuccessExitStatus=143
Restart=always

[Install]
WantedBy=multi-user.target

8.2 서비스 제어

sudo systemctl daemon-reload
sudo systemctl start spring-app
sudo systemctl enable spring-app

9. 자동 배포 시 주의사항

  • application.yml 환경 변수는 서버에서 관리
  • DB 비밀번호는 GitHub Secrets 사용
  • 로그 로테이션 설정 필요
  • 배포 실패 시 롤백 전략 고려

10. 정리

Spring Boot 자동 배포의 핵심은 다음 세 가지다.

  • CI: 빌드 자동화 (GitHub Actions)
  • CD: 서버 반영 자동화 (scp/ssh 또는 Docker)
  • 운영: systemd 또는 컨테이너 기반 관리

이 구조를 익히면 개인 프로젝트부터 실서비스까지 동일한 방식으로 확장 가능하다.

profile
Change Up

0개의 댓글