AWS EC2에 Spring Boot 배포하는 전체 흐름: 초보자를 위한 서버 배포 입문
Spring Boot로 게시판, 회원가입, REST API 프로젝트를 만들었다면 다음 단계는 배포입니다. 로컬 PC에서만 실행되는 애플리케이션은 실제 서비스라고 보기 어렵습니다. 사용자가 브라우저나 앱에서 접속할 수 있도록 하려면 서버에 애플리케이션을 올려야 합니다.
이때 가장 많이 사용하는 방법 중 하나가 AWS EC2에 Spring Boot 애플리케이션을 배포하는 방식입니다.
처음 AWS를 접하면 EC2, 보안 그룹, 키 페어, Elastic IP, JAR, SSH, Nginx 같은 용어가 한꺼번에 나와서 어렵게 느껴질 수 있습니다. 하지만 전체 흐름을 먼저 이해하면 복잡하지 않습니다.
이번 글에서는 Spring Boot 프로젝트를 AWS EC2 서버에 배포하는 전체 과정을 입문자 관점에서 정리해 보겠습니다.
AWS EC2란?
EC2는 Elastic Compute Cloud의 줄임말입니다. 쉽게 말하면 AWS에서 제공하는 가상 서버입니다.
내가 직접 컴퓨터를 사서 서버실에 두지 않아도, AWS 콘솔에서 몇 번의 설정만으로 리눅스 서버를 만들 수 있습니다. 이 서버에 Java를 설치하고 Spring Boot 애플리케이션을 실행하면 외부 사용자가 접속할 수 있는 백엔드 서버가 됩니다.
예를 들어 로컬에서는 다음처럼 실행합니다.
java -jar app.jar
EC2에서도 원리는 같습니다.
다만 실행 위치가 내 PC가 아니라 AWS의 원격 서버라는 점만 다릅니다.
내 PC → Spring Boot 개발
AWS EC2 → Spring Boot 실행
사용자 → EC2 서버로 접속
전체 배포 흐름
Spring Boot 애플리케이션을 EC2에 배포하는 흐름은 다음과 같습니다.
1. Spring Boot 프로젝트 준비
2. JAR 파일 빌드
3. AWS EC2 인스턴스 생성
4. 보안 그룹 설정
5. SSH로 EC2 접속
6. Java 설치
7. JAR 파일 업로드
8. Spring Boot 실행
9. 포트 개방 후 접속 확인
10. 필요하면 Nginx와 도메인 연결
처음에는 이 흐름만 기억해도 충분합니다.
배포는 결국 “서버를 만들고, 서버에 Java를 설치하고, JAR 파일을 실행하는 과정”입니다.
1. Spring Boot 프로젝트 준비
먼저 배포할 Spring Boot 프로젝트가 있어야 합니다.
간단한 REST API 예제를 기준으로 보겠습니다.
@RestController
public class HealthController {
@GetMapping("/health")
public String health() {
return "OK";
}
}
이 API는 서버가 정상 실행 중인지 확인하는 용도로 사용할 수 있습니다.
로컬에서 실행한 뒤 다음 주소로 접속해 봅니다.
http://localhost:8080/health
응답이 다음처럼 나오면 정상입니다.
OK
배포 전에 반드시 로컬에서 먼저 정상 실행되는지 확인해야 합니다.
2. JAR 파일 빌드하기
Spring Boot 프로젝트는 보통 JAR 파일로 빌드해서 배포합니다.
Gradle을 사용한다면 다음 명령어를 실행합니다.
./gradlew clean build
Windows PowerShell에서는 다음처럼 실행할 수 있습니다.
.\gradlew clean build
빌드가 성공하면 보통 다음 경로에 JAR 파일이 생성됩니다.
build/libs/프로젝트명-0.0.1-SNAPSHOT.jar
예를 들어 파일명이 다음과 같을 수 있습니다.
myapp-0.0.1-SNAPSHOT.jar
이 JAR 파일을 EC2 서버로 옮긴 뒤 실행하면 됩니다.
3. AWS EC2 인스턴스 생성하기
이제 AWS에서 EC2 인스턴스를 생성합니다.
EC2 인스턴스를 만들 때 기본적으로 확인할 항목은 다음과 같습니다.
항목예시
| AMI | Ubuntu Server |
| 인스턴스 유형 | t2.micro 또는 t3.micro |
| 키 페어 | SSH 접속용 키 |
| 보안 그룹 | 접속 포트 설정 |
| 스토리지 | 기본값 또는 20GB 이상 |
입문자라면 Ubuntu Server를 선택하는 것이 무난합니다.
Spring Boot 배포 예제와 자료가 많고, Java 설치와 명령어 사용도 비교적 익숙한 편입니다.
4. 키 페어란?
EC2에 접속하려면 키 페어가 필요합니다.
키 페어는 쉽게 말해 원격 서버에 안전하게 접속하기 위한 열쇠입니다.
AWS에서 키 페어를 만들면 .pem 파일을 다운로드할 수 있습니다.
예를 들어 다음과 같은 파일입니다.
my-server-key.pem
이 파일은 반드시 안전하게 보관해야 합니다.
잃어버리면 EC2 서버에 SSH로 접속하기 어려워질 수 있습니다.
Linux나 macOS에서는 권한을 다음처럼 설정합니다.
chmod 400 my-server-key.pem
그리고 SSH 접속은 다음처럼 합니다.
ssh -i my-server-key.pem ubuntu@EC2_PUBLIC_IP
여기서 EC2_PUBLIC_IP는 EC2 인스턴스의 퍼블릭 IP 주소입니다.
ssh -i my-server-key.pem ubuntu@13.125.100.10
5. 보안 그룹 설정하기
EC2에서 가장 많이 실수하는 부분이 보안 그룹입니다.
보안 그룹은 EC2 서버로 들어오는 트래픽과 나가는 트래픽을 제어합니다. 쉽게 말하면 AWS 서버 앞에 있는 방화벽입니다.
Spring Boot 서버에 접속하려면 필요한 포트를 열어야 합니다.
포트용도
| 22 | SSH 접속 |
| 80 | HTTP 접속 |
| 443 | HTTPS 접속 |
| 8080 | Spring Boot 기본 포트 |
입문 단계에서는 다음처럼 설정할 수 있습니다.
유형포트소스
| SSH | 22 | 내 IP |
| Custom TCP | 8080 | 0.0.0.0/0 |
| HTTP | 80 | 0.0.0.0/0 |
다만 SSH 포트인 22번은 모든 IP에 열지 않는 것이 좋습니다.
아래 설정은 위험합니다.
SSH 22 0.0.0.0/0
가능하면 내 IP에서만 접속하도록 제한하는 것이 좋습니다.
SSH 22 내 IP
보안 그룹 설정을 잘못하면 서버는 정상 실행 중인데도 브라우저에서 접속이 안 될 수 있습니다.
6. EC2에 Java 설치하기
EC2에 접속했다면 Java를 설치해야 합니다.
Ubuntu 기준으로 패키지 목록을 먼저 업데이트합니다.
sudo apt update
Java 21을 설치하려면 다음처럼 실행할 수 있습니다.
sudo apt install openjdk-21-jdk -y
설치 후 Java 버전을 확인합니다.
java -version
정상적으로 설치되었다면 Java 버전 정보가 출력됩니다.
Spring Boot 3.x 이상 프로젝트라면 Java 17 이상이 필요합니다.
신규 프로젝트라면 Java 21 LTS를 선택하는 것이 무난합니다.
7. JAR 파일 업로드하기
이제 로컬 PC에서 만든 JAR 파일을 EC2로 업로드합니다.
대표적으로 scp 명령어를 사용할 수 있습니다.
scp -i my-server-key.pem build/libs/myapp-0.0.1-SNAPSHOT.jar ubuntu@EC2_PUBLIC_IP:/home/ubuntu/app.jar
예를 들어 다음처럼 사용할 수 있습니다.
scp -i my-server-key.pem build/libs/myapp-0.0.1-SNAPSHOT.jar ubuntu@13.125.100.10:/home/ubuntu/app.jar
업로드가 끝난 뒤 EC2에 접속해서 파일이 있는지 확인합니다.
ls -al
app.jar 파일이 보이면 정상입니다.
8. Spring Boot 실행하기
EC2에서 JAR 파일을 실행합니다.
java -jar app.jar
정상 실행되면 Spring Boot 로그가 출력됩니다.
Tomcat started on port 8080
Started Application
이제 브라우저에서 다음 주소로 접속합니다.
http://EC2_PUBLIC_IP:8080/health
예를 들어 다음과 같습니다.
http://13.125.100.10:8080/health
응답이 다음처럼 나오면 배포가 성공한 것입니다.
OK
9. 백그라운드 실행하기
그런데 단순히 java -jar app.jar로 실행하면 SSH 터미널을 종료했을 때 애플리케이션도 같이 종료될 수 있습니다.
그래서 백그라운드에서 실행해야 합니다.
가장 간단한 방법은 nohup을 사용하는 것입니다.
nohup java -jar app.jar > app.log 2>&1 &
실행 중인 프로세스를 확인합니다.
ps -ef | grep java
로그를 확인하려면 다음 명령어를 사용합니다.
tail -f app.log
서버를 중지하려면 프로세스 ID를 확인한 뒤 종료합니다.
kill -15 프로세스ID
예를 들어 다음과 같습니다.
kill -15 12345
10. application.yml 운영 설정 분리하기
실무에서는 로컬 환경과 운영 환경 설정이 다릅니다.
예를 들어 로컬에서는 H2 데이터베이스를 쓰고, 운영에서는 MariaDB나 RDS를 사용할 수 있습니다.
Spring Boot에서는 profile을 사용해 설정을 분리할 수 있습니다.
spring:
profiles:
active: prod
운영 설정 파일은 다음처럼 만들 수 있습니다.
spring:
datasource:
url: jdbc:mariadb://DB_HOST:3306/app_db
username: app_user
password: app_password
server:
port: 8080
운영 환경에서 실행할 때는 다음처럼 profile을 지정할 수 있습니다.
nohup java -jar app.jar --spring.profiles.active=prod > app.log 2>&1 &
이렇게 하면 운영 환경에 맞는 설정으로 애플리케이션을 실행할 수 있습니다.
11. 8080 포트 대신 80 포트로 접속하려면?
Spring Boot 기본 포트는 보통 8080입니다.
http://EC2_PUBLIC_IP:8080
하지만 실제 서비스에서는 보통 다음처럼 접속합니다.
http://example.com
사용자가 :8080을 직접 입력하는 방식은 좋지 않습니다.
이때 많이 사용하는 방식이 Nginx 리버스 프록시입니다.
사용자 → 80 포트 → Nginx → 8080 포트 → Spring Boot
Nginx를 설치합니다.
sudo apt install nginx -y
Nginx 설정 예시는 다음과 같습니다.
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
이 구조를 사용하면 사용자는 80 포트로 접속하고, 내부적으로는 Spring Boot의 8080 포트로 요청이 전달됩니다.
12. Elastic IP를 사용하는 이유
EC2 인스턴스의 퍼블릭 IP는 상황에 따라 바뀔 수 있습니다.
서버를 중지했다가 다시 시작하면 IP가 변경될 수 있기 때문에, 도메인을 연결해둔 경우 문제가 생길 수 있습니다.
이 문제를 줄이기 위해 Elastic IP를 사용할 수 있습니다.
Elastic IP는 AWS 계정에 할당해서 EC2 인스턴스에 연결할 수 있는 고정 퍼블릭 IP입니다.
Elastic IP → EC2 인스턴스 연결
도메인 DNS → Elastic IP 연결
사용자 → 도메인 접속
단, Elastic IP는 사용하지 않거나 연결하지 않은 상태로 방치하면 비용이 발생할 수 있습니다.
따라서 필요할 때만 만들고, 사용하지 않는 Elastic IP는 반드시 정리해야 합니다.
13. 실무에서는 배포를 어떻게 개선할까?
입문 단계에서는 직접 JAR 파일을 업로드하고 실행해도 됩니다.
하지만 실무에서는 배포를 자동화하는 경우가 많습니다.
예를 들어 다음과 같은 방식으로 발전할 수 있습니다.
단계방식
| 1단계 | 수동으로 JAR 업로드 후 실행 |
| 2단계 | Shell Script로 배포 자동화 |
| 3단계 | GitHub Actions로 CI/CD 구성 |
| 4단계 | Docker로 애플리케이션 컨테이너화 |
| 5단계 | ECS, EKS 같은 컨테이너 서비스 사용 |
처음부터 모든 것을 자동화하려고 하면 어렵습니다.
먼저 EC2에서 수동 배포 흐름을 이해하고, 이후 CI/CD와 Docker로 확장하는 것이 좋습니다.
자주 하는 실수
1. 보안 그룹에서 8080 포트를 열지 않음
Spring Boot는 정상 실행 중인데 브라우저에서 접속이 안 된다면 보안 그룹을 먼저 확인해야 합니다.
8080 포트 인바운드 허용 여부 확인
2. Java 버전이 맞지 않음
로컬에서는 Java 21로 빌드했는데 EC2에는 Java 11만 설치되어 있으면 실행 오류가 날 수 있습니다.
반드시 로컬 빌드 환경과 서버 실행 환경의 Java 버전을 확인해야 합니다.
java -version
3. SSH 키 파일 권한 문제
Linux나 macOS에서 .pem 파일 권한이 너무 열려 있으면 SSH 접속이 거부될 수 있습니다.
chmod 400 my-server-key.pem
4. 터미널 종료와 함께 애플리케이션도 종료됨
단순 실행은 터미널 종료 시 함께 종료될 수 있습니다.
java -jar app.jar
백그라운드 실행은 다음처럼 처리합니다.
nohup java -jar app.jar > app.log 2>&1 &
5. 운영 설정을 로컬 설정 그대로 사용함
로컬 DB 주소, 로컬 비밀번호, 테스트용 설정을 운영 서버에 그대로 올리면 문제가 생길 수 있습니다.
운영 환경에서는 profile을 분리해야 합니다.
--spring.profiles.active=prod
핵심 요약
AWS EC2에 Spring Boot를 배포하는 핵심 흐름은 다음과 같습니다.
- Spring Boot 프로젝트를 JAR 파일로 빌드합니다.
- AWS EC2 인스턴스를 생성합니다.
- 키 페어를 사용해 SSH로 접속합니다.
- 보안 그룹에서 필요한 포트를 엽니다.
- EC2에 Java를 설치합니다.
- JAR 파일을 서버에 업로드합니다.
- java -jar 또는 nohup으로 실행합니다.
- 브라우저에서 EC2_PUBLIC_IP:8080으로 접속해 확인합니다.
- 실제 서비스에서는 Nginx, 도메인, HTTPS까지 연결합니다.
- 이후에는 Shell Script, GitHub Actions, Docker로 배포 자동화를 확장할 수 있습니다.
마무리
AWS EC2 배포는 처음에는 어렵게 느껴질 수 있습니다. 하지만 구조를 단순하게 보면 핵심은 명확합니다.
EC2는 서버이고, Spring Boot는 JAR 파일로 실행되며, 보안 그룹은 외부 접속을 허용하는 문입니다.
처음부터 Docker, CI/CD, HTTPS, 무중단 배포까지 모두 하려고 하면 부담이 큽니다.
먼저 EC2에 직접 접속해서 Java를 설치하고, JAR 파일을 실행하는 기본 배포 흐름을 익히는 것이 좋습니다.
이 흐름을 이해하면 이후 Nginx, 도메인 연결, HTTPS 설정, GitHub Actions 자동 배포까지 훨씬 자연스럽게 확장할 수 있습니다.