AWS에 스프링 부트를 배포하는 네 가지 방법

한눈에 보기

EC2 수동 배포부터 배포 스크립트, CodeDeploy, 컨테이너까지 AWS에 스프링 부트를 배포하는 방식의 발전 단계를 정리한다. 각 방식의 원리와 무중단 배포 전략, 롤백까지 다룬다.

최종 업데이트 2026.09.17

AWS에 스프링 부트(Spring Boot) 애플리케이션을 배포하는 방식은 EC2에 직접 접속해 JAR 파일을 실행하는 수동 배포부터, 셸 스크립트 자동화, AWS CodeDeploy 같은 관리형 배포 서비스, 그리고 컨테이너 기반 배포까지 단계적으로 발전해 왔다. 각 방식은 자동화 수준과 무중단 배포 가능 여부, 운영 부담에서 차이가 나며, 팀 규모와 트래픽 특성에 맞는 방식을 선택하는 것이 중요하다. 면접에서는 특정 명령어보다 각 방식의 원리와 한계를 이해하고 있는지를 확인한다.

배포 과정의 큰 그림

스프링 부트 배포의 본질은 세 단계로 요약된다. 먼저 소스 코드를 빌드해 실행 가능한 JAR(Java Archive)라는 산출물을 만들고, 그 산출물을 서버로 옮긴 뒤, 기존 프로세스를 새 버전으로 교체한다. 스프링 부트는 내장 톰캣(Tomcat)을 포함한 실행 가능 JAR를 만들어 주기 때문에 별도의 웹 애플리케이션 서버를 설치할 필요 없이 java -jar 한 줄로 서비스를 띄울 수 있다. 어떤 배포 방식을 쓰든 이 세 단계는 동일하며, 차이는 누가 어떤 도구로 이 과정을 수행하느냐에 있다.

EC2 수동 배포와 그 한계

가장 원초적인 방식은 EC2(Elastic Compute Cloud) 인스턴스에 SSH(Secure Shell)로 접속해서 직접 배포하는 것이다. 서버에서 git pull로 코드를 받아 빌드하거나, 로컬에서 빌드한 JAR를 scp로 전송한 뒤 기존 프로세스를 종료하고 새 프로세스를 실행한다.

ssh -i mykey.pem ec2-user@서버주소
kill -15 $(pgrep -f myapp.jar)
nohup java -jar myapp.jar > app.log 2>&1 &

여기서 nohup은 SSH 세션이 끊겨도 프로세스가 살아 있게 하고, 2>&1은 표준 에러를 표준 출력과 같은 로그 파일로 합친다. 이 방식은 원리를 이해하기에는 좋지만 사람이 매번 같은 명령을 반복해야 하므로 실수가 생기기 쉽고, 프로세스를 죽이고 새로 띄우는 사이에 서비스가 중단되는 다운타임(downtime)이 반드시 발생한다.

배포 스크립트로 자동화하기

수동 배포의 반복 작업을 셸 스크립트 하나로 묶으면 배포가 명령 한 번으로 줄어든다. 전형적인 배포 스크립트는 저장소 갱신, 빌드, 기존 프로세스 종료, 새 프로세스 실행, 상태 확인 순서로 구성된다.

#!/bin/bash
REPO_DIR=/home/ec2-user/app
cd $REPO_DIR
git pull origin main
./gradlew clean bootJar

PID=$(pgrep -f myapp.jar)
if [ -n "$PID" ]; then
  kill -15 $PID
  sleep 5
fi

nohup java -jar build/libs/myapp.jar > app.log 2>&1 &
curl -s http://localhost:8080/actuator/health

여기서 kill -15는 강제 종료(SIGKILL)가 아니라 정상 종료(SIGTERM) 신호를 보내, 처리 중인 요청을 마무리할 기회를 준다. 마지막의 헬스 체크(health check)는 새 프로세스가 정상 기동했는지 확인하는 안전장치다. 스크립트 방식은 배포 절차를 코드로 고정한다는 점에서 큰 진전이지만, 여전히 서버 한 대 기준이고 배포 순간의 다운타임 문제는 해결하지 못한다.

CodeDeploy와 무중단 배포

AWS CodeDeploy는 배포 자동화를 관리형 서비스로 끌어올린 도구다. 빌드 산출물을 S3(Simple Storage Service)에 올려 두면, 각 EC2에 설치된 CodeDeploy 에이전트(agent)가 이를 내려받아 appspec.yml에 정의된 생명 주기 훅(lifecycle hook)에 따라 배포를 수행한다. 훅마다 스크립트를 연결해 애플리케이션 중지, 파일 교체, 재시작, 검증을 단계별로 실행할 수 있다.

무중단 배포는 크게 두 가지 전략으로 구현한다. 블루 그린(Blue Green) 배포는 새 버전을 별도 서버 그룹에 미리 띄워 검증한 뒤 로드 밸런서의 트래픽을 한 번에 전환하는 방식으로, 문제가 생기면 즉시 이전 그룹으로 되돌릴 수 있다. 롤링(Rolling) 배포는 여러 인스턴스를 일부씩 순차 교체하는 방식으로, 추가 서버 비용이 적은 대신 배포 중에 구버전과 신버전이 공존하므로 API 호환성을 신경 써야 한다. 서버가 한 대뿐이라면 8081, 8082처럼 포트를 번갈아 쓰면서 Nginx의 프록시 대상을 스위칭하는 간이 블루 그린 방식도 널리 쓰인다.

컨테이너 기반 배포

현대적인 방식은 애플리케이션을 도커(Docker) 이미지로 패키징해서 배포하는 것이다. JAR와 JVM(Java Virtual Machine), 운영체제 라이브러리까지 이미지 하나에 담기 때문에 서버에 자바를 설치할 필요가 없고, 어느 환경에서든 동일하게 동작한다. 빌드한 이미지는 ECR(Elastic Container Registry)에 푸시하고, 실행은 ECS(Elastic Container Service)나 EKS(Elastic Kubernetes Service) 같은 오케스트레이션 서비스에 맡긴다. 오케스트레이터가 컨테이너 개수 유지, 헬스 체크, 롤링 업데이트를 대신 처리해 주므로 무중단 배포가 기본값에 가까워진다.

방식자동화 수준무중단 배포적합한 상황
EC2 수동 배포없음불가학습, 일회성 실험
배포 스크립트절차 자동화추가 구성 필요소규모 단일 서버
CodeDeploy배포 파이프라인 관리형블루 그린, 롤링 지원EC2 다중 서버 운영
컨테이너(ECS, EKS)실행 환경까지 표준화기본 지원마이크로서비스, 대규모

CI(Continuous Integration) 도구와 결합하면 코드를 푸시하는 것만으로 빌드부터 배포까지 이어지는 파이프라인이 완성된다. 어떤 방식을 쓰든 배포 실패 시 이전 버전으로 되돌리는 롤백(rollback) 절차를 함께 설계해 두는 것이 실무의 핵심이다.

면접에서 이렇게 물어본다

  • EC2에 스프링 부트를 배포하는 과정을 처음부터 끝까지 설명해 보라. nohup을 쓰는 이유는 무엇인가.
  • 배포할 때 발생하는 다운타임을 없애려면 어떤 전략을 쓸 수 있는가. 블루 그린과 롤링 배포의 차이를 설명하라.
  • CodeDeploy의 동작 원리와 appspec.yml의 역할을 설명해 보라.
  • JAR 배포와 도커 이미지 배포의 차이는 무엇이고, 컨테이너를 쓰면 무엇이 좋아지는가.
  • 배포 직후 장애가 발생했다면 어떻게 롤백하겠는가.
DevOps / 인프라 문서 전체 보기

이 개념, 내 코드에서는 어떻게 물어볼까요

데브핏(DevFit)에 채용공고 URL을 붙여 넣고 레포지토리를 연결하면, 내가 쓴 커밋에서 예상 질문과 어필 포인트를 만듭니다. 하루 10회까지 무료입니다. 합불 판정이나 지원자 랭킹은 만들지 않고, 최종 판단은 사람이 합니다.

공고 넣고 시작하기