본문 바로가기
AI에서 살아남기(to. Android Developer)/1인 프로젝트

(모두의 웹툰) Part7 : 인프라 구축기 [잘못되었던 방식]

by 개발자 인민군 2025. 12. 17.

이번 파트에서는 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에 안전하게 접근이 가능합니다.