이번 파트에서는 AWS EC2와 RDS를 활용하여 Spring Boot 백엔드를 배포하는 전체 과정을 다룹니다.
이 파트를 보기 전에 네트워크 용어가 어려우실 수 있습니다. 해서 이 영상을 추천합니다.
- 애플코딩 진격의 네트워크 -
전체 아키텍처
┌─────────────────────────────────────────────────────────────┐
│ AWS Cloud │
│ │
│ ┌─────────────┐ ┌─────────────────────────────┐ │
│ │ Client │ │ VPC │ │
│ │ (Postman, │ │ │ │
│ │ Web, App) │ │ ┌─────────┐ ┌─────────┐ │ │
│ └──────┬──────┘ │ │ EC2 │──▶│ RDS │ │ │
│ │ │ │ (Spring │ │(Postgre │ │ │
│ │ :8080 │ │ Boot) │ │ SQL) │ │ │
│ ▼ │ └─────────┘ └─────────┘ │ │
│ ┌─────────────┐ │ 퍼블릭 IP 프라이빗 IP │ │
│ │ 보안 그룹 │ │ 54.180.x.x 172.31.x.x │ │
│ │ (8080 허용) │ └─────────────────────────────┘ │
│ └─────────────┘ │
└─────────────────────────────────────────────────────────────┘
핵심 포인트:
- EC2는 퍼블릭 IP로 외부 요청을 받음
- RDS는 프라이빗 IP로 VPC 내부에서만 접근 가능 (보안 강화)
- EC2와 RDS는 같은 VPC 내에서 프라이빗 IP로 통신
1단계: RDS PostgreSQL 생성
AWS 콘솔 → RDS → 데이터베이스 생성
| 항목 | 설정값 |
| 엔진 | PostgreSQL |
| 템플릿 | 프리 티어 |
| DB 인스턴스 식별자 | (직접 설정) |
| 마스터 사용자 이름 | postgres |
| 마스터 암호 | (직접 설정) |
| DB 인스턴스 클래스 | db.t3.micro |
| 스토리지 | 20GB |
| 퍼블릭 액세스 | 아니오 (보안상 중요!) |
| 초기 데이터베이스 이름 | (직접 설정) |
생성 완료 후 엔드포인트를 확인합니다:
modu-webtoon-db.xxxxx.ap-northeast-2.rds.amazonaws.com
왜 퍼블릭 액세스를 비활성화하나요?
데이터베이스는 민감한 정보를 담고 있어 외부에서 직접 접근하면 보안 위험이 큽니다. VPC 내부의 EC2를 통해서만 접근하도록 설정하면 훨씬 안전합니다.
2단계: EC2 인스턴스 생성
애플리케이션을 실행할 EC2 인스턴스를 생성합니다.
AWS 콘솔 → EC2 → 인스턴스 시작
| 항목 | 설정값 |
| AMI | Amazon Linux 2023 |
| 인스턴스 유형 | t2.micro (프리 티어) |
| 키 페어 | pem 파일 새로 생성 <- 지금은 로컬 PC에 저장 |
| 네트워크 | 기본 VPC |
| 퍼블릭 IP 자동 할당 | 활성화 |
3단계: 보안 그룹 설정
보안 그룹은 AWS의 방화벽 역할을 합니다. 적절한 포트만 열어야 합니다.
EC2 보안 그룹 (인바운드 규칙)
| 유형 | 포트 | 소스 | 용도 |
| SSH | 22 | 내 IP (내가 위치한 장소) | SSH 접속 |
| 사용자 지정 TCP | 8080 | 0.0.0.0/0 | Spring Boot API |
RDS 보안 그룹 (인바운드 규칙)
| 유형 | 포트 | 소스 | 용도 |
| PostgreSQL | 5432 | EC2 Private IP | EC2에서 RDS 접근 |
핵심: RDS는 EC2의 프라이빗 IP만 허용합니다. 이렇게 하면 외부에서 직접 DB에 접근할 수 없습니다.
4단계: EC2에 Java 설치
EC2에 접속하여 Java를 설치합니다.
# EC2 접속
ssh -i ~/modu-webtoon.pem ec2-user@54.180.125.227
# Java 17 설치
sudo yum install -y java-17-amazon-corretto
# 설치 확인
java -version
출력 예시:
openjdk version "17.0.17" 2025-10-21 LTS
5단계: 애플리케이션 빌드 및 배포
5-1. 로컬에서 JAR 빌드
cd ~/modu-webtoon-backend
./gradlew clean build -x test
빌드 결과물: `build/libs/modu-webtoon-backend-0.0.1-SNAPSHOT.jar`
5-2. JAR 파일을 EC2로 전송
scp -i ~/modu-webtoon.pem \
build/libs/modu-webtoon-backend-0.0.1-SNAPSHOT.jar \
ec2-user@54.180.125.227:~/
5-3. EC2에서 파일 확인
ls -lh ~/*.jar
# -rw-r--r--. 1 ec2-user ec2-user 60M Dec 17 01:15 modu-webtoon-backend-0.0.1-SNAPSHOT.jar
6단계: 애플리케이션 실행
EC2에서 환경 변수를 설정하고 애플리케이션을 실행합니다.
# 환경 변수 설정
export DB_URL="jdbc:postgresql://modu-webtoon-db.xxxxx.ap-northeast-2.rds.amazonaws.com:5432/moduwebtoon"
export DB_USERNAME="postgres"
export DB_PASSWORD="실제비밀번호"
export JWT_SECRET="my-super-secret-key-must-be-at-least-32-characters"
# 애플리케이션 실행
java -jar ~/modu-webtoon-backend-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
성공 로그:
2025-12-17T01:20:09.610Z INFO --- Tomcat started on port 8080 (http) with context path '/'
2025-12-17T01:20:09.642Z INFO --- Started ModuWebtoonBackendApplication in 17.61 seconds
로컬 개발 환경에서 RDS 연결하기 (SSH 터널링)
개발 중에는 로컬에서 RDS에 직접 접근해야 할 때가 있습니다. 하지만 RDS는 퍼블릭 액세스가 비활성화되어 있어 직접 연결이 불가능합니다.
이때 SSH 터널링을 사용하면 EC2를 경유하여 RDS에 접근할 수 있습니다.
SSH 터널링이란?
내 PC (인터넷)
│
│ 퍼블릭 IP로 SSH 접속
▼
EC2 Bastion Host
├── 퍼블릭 IP (외부용)
└── 프라이빗 IP (내부용)
│
│ 프라이빗 IP로 연결
▼
RDS (172.31.x.x - VPC 내부만 접근 가능)
쉽게 말해, EC2를 다리(터널)로 사용하여 로컬에서 RDS에 접근하는 방식입니다.
터널링 명령어
ssh -i ~/modu-webtoon.pem \
-L 5432:modu-webtoon-db.xxxxx.ap-northeast-2.rds.amazonaws.com:5432 \
ec2-user@54.180.xxx.xxx(퍼블릭IP)
| 옵션 | 설명 |
| `-i [키파일]` | SSH 키 파일 경로 |
| `-L 5432:RDS:5432` | 로컬 5432 포트를 RDS 5432 포트로 터널링 |
| `ec2-user@IP` | Bastion Host(EC2) 접속 |
이 명령어를 실행하면 로컬의 5432 포트가 RDS의 5432 포트로 연결됩니다.
로컬 환경 변수 설정
터널링 터미널은 그대로 유지한 채, 새 터미널에서 `.env` 파일을 설정합니다.
export DB_URL="jdbc:postgresql://localhost:5432/moduwebtoon?sslmode=require"
export DB_USERNAME="postgres"
export DB_PASSWORD="실제비밀번호"
export JWT_SECRET="my-super-secret-key-must-be-at-least-32-characters"
주의: `localhost:5432`로 설정합니다. 터널링을 통해 이 요청이 RDS로 전달됩니다.
이렇게 할시 DB에 안전하게 접근이 가능합니다.
'AI에서 살아남기(to. Android Developer) > 1인 프로젝트' 카테고리의 다른 글
| (모두의 웹툰) Part7 : 인프라 구축기 [ver 2] (0) | 2025.12.19 |
|---|---|
| (모두의 웹툰) Part 6: API 설계 (0) | 2025.12.17 |
| (모두의 웹툰) Part 3: 핵심 기능 정의 (0) | 2025.12.17 |
| (모두의 웹툰) Part 1: 시작하며 - 왜 1인 개발을 시작하는가 (0) | 2025.12.17 |