이전 글에서 https://hyunolike.tistory.com/37
[프로젝트] 네이버 클라우드로 인프라 구축하기 (VPC, 서브넷, 로드밸런서)
Spring Boot 애플리케이션을 개발하고 나면 이제 실제 사용자가 접속할 수 있는 프로덕션 환경을 구축해야 합니다.저는 Naver Cloud Platform을 선택했고 Docker와 GitHub Actions를 활용해 자동 배포 파이프라
hyunolike.tistory.com
네이버 클라우드로 인프라 구축기를 작성했습니다.
상담 관리 플랫폼을 개발하면서 AWS 클라우드 환경에서 배포 자동화를 구축했습니다.
이 글에서는 AWS EC2 배포 자동화 과정과 함께 실제 프로덕션 환경에서 두 클라우드 플랫폼(네이버클라우드, AWS)을 사용하며 느낀 차이점을 공유합니다.

1. 왜 AWS EC2 + Docker Compose인가?
기술 스택 선택 이유
[AWS EC2를 선택한 이유]
결정적 이유. 기존 팀 내 AWS 클라우드 플랫폼 사용 중
- 프리티어: 12개월 무료로 학습 및 포트폴리오 구축 가능
- 확장성: 향후 RDS, S3, CloudFront 등 다양한 서비스 연동 가능
- 레퍼런스: 방대한 한글/영문 문서 및 커뮤니티 지원
[Docker Compose를 선택한 이유]
- 멀티 컨테이너 관리: Spring Boot + MySQL + Redis 통합 관리
- 환경 일관성: 로컬 개발 환경과 운영 환경 동일화
- 벤더 독립성: 다른 클라우드 플랫폼으로 쉽게 이전 가능
- Kubernetes 전 단계: 추후 확장 가능


2. GitHub Actions 워크플로우 구성
name: Deploy to AWS EC2
on:
push:
branches:
- main
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
# 1. 코드 체크아웃
- name: Checkout code
uses: actions/checkout@v3
# 2. JDK 17 설정
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'corretto'
cache: 'gradle'
# 3. Gradle 빌드
- name: Build with Gradle
run: |
chmod +x ./gradlew
./gradlew clean build -x test
# 4. Docker Hub 로그인
- name: Login to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
# 5. Docker 이미지 빌드 & 푸시
- name: Build and Push Docker image
run: |
docker build -t ${{ secrets.DOCKER_USERNAME }}/[프로젝트]-app:latest .
docker push ${{ secrets.DOCKER_USERNAME }}/[프로젝트]-app:latest
# 6. EC2 배포
- name: Deploy to EC2
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USER }}
key: ${{ secrets.EC2_SSH_KEY }}
script: |
cd ~/app
docker-compose -f docker-compose.prod.yml pull app
docker-compose -f docker-compose.prod.yml down
docker-compose -f docker-compose.prod.yml up -d
docker system prune -af
2.1. 핵심 포인트
Gradle 캐싱으로 빌드 시간 단축
cache: 'gradle' # 의존성 캐싱으로 빌드 시간 50% 단축
무중단 배포 준비
docker-compose pull app # 새 이미지 다운로드
docker-compose down # 기존 컨테이너 중지
docker-compose up -d # 새 컨테이너 시작
3. 네이버 클라우드 플랫폼 배포 경험과의 비교
AWS 배포 전 네이버 클라우드 플랫폼(NCP)에서 먼저 배포 경험이 있었습니다.
예상: "한글 지원하는 NCP가 더 쉽겠지?" 현실: "AWS가 훨씬 쉽네...?" 😮
VPC, Subnet 같은 네트워크 개념을 배우긴 했지만, 실제 서버 띄우는 건 AWS가 압도적으로 간단했습니다.
두 플랫폼을 모두 사용해본 입장에서 실질적인 차이점을 공유합니다.
3.1. 초기 진입 장벽 - 예상과 다른 결과
| 항목 | 네이버 클라우드 | AWS |
| 학습 곡선 | 중간 (한글이지만 개념 이해 필요) | 낮음 (직관적 원클릭 설정) |
| 설정 복잡도 | ★★★★☆ | ★★☆☆☆ |
| 서버 생성 속도 | 여러 단계 필요 | 거의 원클릭으로 즉시 생성 |
실제 경험 (예상과 정반대)
- NCP: VPC, Subnet, ACG, 공인 IP 등 수동으로 하나씩 생성 필요 → 30분 소요
- AWS: 인스턴스 시작 마법사에서 거의 자동으로 구성 → 5분 만에 완료
왜 AWS가 더 쉬웠나?
- 서브넷 자동 생성 (수동 설정 불필요)
- 보안 그룹 인스턴스 생성 시 동시 설정
- 퍼블릭 IP 자동 할당
- 키 페어 생성도 같은 화면에서 가능

3.2. 네트워크 및 보안 설정 복잡도
| 항목 | 네이버 클라우드 | AWS |
| VPC/Subnet | 수동 생성 필수 | 자동 생성 (기본 VPC 제공) |
| 방화벽 | ACG (별도 생성 후 적용) | Security Group (인스턴스 생성 시 설정) |
| 공인 IP | 별도 생성 후 서버에 할당 | 체크박스 하나로 자동 할당 |
| 설정 단계 | VPC → Subnet → ACG → Server → IP 연결 (5단계) | Launch Instance 한 화면에서 완료 (1단계) |
네이버 클라우드 설정 과정
1. VPC 생성
2. Subnet 생성 (Public/Private 구분)
3. ACG 생성 (22, 80, 443, 8080 포트 설정)
4. 서버 생성 (위에서 만든 VPC, Subnet, ACG 선택)
5. 공인 IP 생성 후 서버에 연결
AWS 설정 과정
1. EC2 인스턴스 시작 클릭
2. AMI 선택
3. 보안 그룹 규칙 입력 (SSH, HTTP, HTTPS 체크)
4. 퍼블릭 IP 자동 할당 활성화 체크
5. 시작!
왜 이런 차이가?
- NCP: 엔터프라이즈 네트워크 구성 방식 (명시적 설정 필요)
- AWS: 개발자 친화적 기본값 제공 (빠른 시작 우선)
3.3. 서버 스펙 및 가격
| 항목 | 네이버 클라우드 Compact | AWS EC2 t2.micro |
| vCPU | 2 core | 1 core |
| 메모리 | 4GB | 1GB |
| SSD | 50GB | 8GB (기본) |
| 월 비용 | ~₩15,000 | 프리티어 12개월 무료, 이후 ~$10 |
| 네트워크 | 1Gbps | Low to Moderate |

실제 사용 경험
네이버 클라우드 장점
- Compact 타입이 개발/테스트에 적절한 스펙
- 한국 리전 특화로 국내 서비스에 유리
- 트래픽 비용이 AWS보다 저렴
AWS 장점
- 프리티어 1년 무료로 학습/테스트 최적
- t2.micro로도 충분한 경우 많음 (Swap 설정 필수)
- 글로벌 리전 선택 가능
3.4. CI/CD 통합
| 항목 | 네이버 클라우드 | AWS |
| 네이티브 CI/CD | SourceCommit, SourceBuild | CodePipeline, CodeBuild |
| GitHub Actions 연동 | SSH 접속 방식 | SSH 또는 AWS CLI |
| 배포 자동화 | Jenkins 별도 설치 권장 | 다양한 옵션 (CodeDeploy 등) |
GitHub Actions 배포 방식 비교

- name: Deploy to NCP
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.NCP_HOST }}
username: root # 기본 사용자
password: ${{ secrets.NCP_PASSWORD }} # 비밀번호 또는 키

- name: Deploy to AWS EC2
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.EC2_HOST }}
username: ec2-user # AMI별 다름
key: ${{ secrets.EC2_SSH_KEY }} # 키 페어 필수
차이점
- NCP: root 계정 사용, 비밀번호 또는 SSH 키 선택 가능
- AWS: 키 페어 필수, AMI별로 기본 사용자명 다름 (Amazon Linux: ec2-user, Ubuntu: ubuntu)
3.5. 모니터링 및 로깅
|
항목
|
네이버 클라우드 | AWS |
| 기본 모니터링 | Cloud Insight | CloudWatch |
| 메트릭 수집 | 에이전트 설치 필요 | 기본 메트릭 자동 수집 |
| 로그 관리 | Cloud Log Analytics | CloudWatch Logs |
| 알림 설정 | Monitoring → 이벤트 룰 | CloudWatch Alarms |
| 무료 제공 | 제한적 | 5GB 로그, 1,000개 메트릭 무료 |
실제 사용 경험
- NCP: 직관적이지만 고급 분석 기능 부족
- AWS: 초기 설정 복잡하지만 강력한 분석 기능
3.6. 스토리지 및 백업
| 항목 | 네이버 클라우드 | AWS |
| 블록 스토리지 | Block Storage | EBS (Elastic Block Store) |
| 스냅샷 | 수동/자동 스냅샷 | EBS Snapshot |
| 객체 스토리지 | Object Storage | S3 |
| 백업 비용 | 저장 용량 기준 | 저장 용량 + 요청 횟수 |
백업 전략

# 서버 내 백업 스크립트
mysqldump -u user -p db > backup.sql
# NCP Object Storage로 업로드

# EBS 스냅샷 생성 (AWS CLI)
aws ec2 create-snapshot --volume-id vol-xxxxx
# 또는 서버 내 S3 업로드
aws s3 cp backup.sql s3://my-backup-bucket/
3.7. 개발자 경험 (DX) 종합 비교
AWS가 우수했던 점
1. 원클릭 배포: 복잡한 사전 설정 없이 바로 서버 생성
2. 자동화된 기본값: VPC, Subnet, IP 등 자동 구성
3. 통합 설정 화면: 한 화면에서 모든 설정 완료
4. 직관적인 워크플로우: "Launch Instance" 클릭 몇 번이면 끝
5. 프리티어: 12개월 무료로 부담 없이 학습
6. 방대한 레퍼런스: 거의 모든 에러 해결법이 구글에 존재
실제 체감
- "서버 하나 띄우는데 왜 이렇게 간단하지?" 😮
- 네이버 클라우드에서 고생한 게 무색할 정도로 쉬움
- 설정 자동화 덕분에 실수할 여지가 적음
네이버 클라우드의 장점
1. 한글 지원: 콘솔, 문서, 고객지원 모두 한글
2. 명시적 설정: 네트워크 구조를 명확히 이해하고 설정 가능
3. 국내 서비스: 한국 법인, 원화 결제, 세금계산서
4. 합리적 트래픽 비용: 대용량 트래픽 서비스에 유리
5. 네이버 생태계 연동: 네이버 페이, 네이버 로그인 등
실제 체감
- 한글 문서는 분명 편함
- 하지만 수동으로 설정할 게 너무 많음 😓
- VPC/Subnet 개념은 확실히 배우긴 했지만...
- "왜 이렇게 복잡하게 만들어놨지?" 싶었음
4. 배포 자동화 구축하며 배운 핵심 교훈
4.1. 인프라 코드화 (Infrastructure as Code)의 중요성
수동 설정은 휘발성이 높습니다. Docker Compose와 GitHub Actions로 모든 설정을 코드화하니
- 재현 가능한 환경 구축
- 버전 관리를 통한 변경 이력 추적
- 팀원 온보딩 시간 단축
4.2. 보안 설정의 우선순위
배포 자동화만큼 중요한 것이 보안입니다
- SSH는 특정 IP만 허용 (내 IP)
- DB 포트(3306), Redis 포트(6379)는 외부 차단
- 환경변수로 민감정보 분리 (.env, GitHub Secrets)
- 정기적인 보안 업데이트 (yum update)
4.3. 클라우드 벤더 종속성 최소화
Docker를 사용함으로써
- NCP에서 AWS로, AWS에서 GCP로 전환 용이
- 로컬 개발 환경과 운영 환경의 일관성
- 멀티 클라우드 전략 실현 가능

4.4. 모니터링과 로깅의 중요성
초기엔 "일단 돌아가면 OK"였지만, 실제 운영 환경에서는
- 로그 로테이션 설정 필수 (디스크 풀 방지)
- Health Check 엔드포인트 구현
- 리소스 사용량 모니터링 (CPU, 메모리)
5. 향후 개선 계획
5.1. Nginx 리버스 프록시 도입
현재: http://public ip
목표: https://api.kkebi.com
장점
- 포트 번호 숨김 (80/443만 노출)
- SSL/TLS 인증서 적용 용이
- 정적 파일 서빙 분리
- 로드 밸런싱 준비
5.2. Blue-Green 배포 전략
# docker-compose.blue.yml
services:
app-blue:
image: 프로젝트-app:v1.0.0
# docker-compose.green.yml
services:
app-green:
image: 프로젝트-app:v1.1.0
무중단 배포로 서비스 다운타임 제로화
5.3. Terraform으로 인프라 관리
resource "aws_instance" "프로젝트_server" {
ami = "ami-xxxxx"
instance_type = "t2.micro"
tags = {
Name = "프로젝트-Production"
}
}
인프라 버전 관리 및 재사용성 향상
6. 결론
AWS EC2에 Spring Boot 애플리케이션을 배포하면서 많은 시행착오를 겪었습니다.
Docker 이미지 선택부터 MySQL 인증 문제, GitHub Actions 설정까지
각각의 문제는 단순히 "해결"을 넘어 인프라에 대한 깊은 이해로 이어졌습니다.
이 프로젝트를 통해 얻은 것
- 실전 DevOps 경험: 책으로만 보던 CI/CD를 직접 구축
- 문제 해결 능력: 공식 문서 읽기, 에러 로그 분석, 구글링(+AI) 스킬 향상
- 클라우드 인프라 이해: AWS 서비스 구조와 보안 모델 학습
네이버 클라우드 경험과의 시너지
이전에 네이버 클라우드로 배포했던 경험이 AWS 배포에 도움이 되었습니다
- VPC, Subnet 같은 네트워크 개념 이해 (NCP에서 고생하며 배움)
- CI/CD 파이프라인 설계 경험
- Docker 기반 배포의 장점 체감
하지만 솔직히 말하면
- AWS는 이런 개념 몰라도 서버 띄우기 쉬움 😅
- NCP에서 수동으로 했던 설정들이 AWS에선 자동
- "아, 클라우드가 원래 이렇게 쉬운 거였구나" 느낌
어려운 걸 먼저 하니까 쉬운 게 더 쉽게 느껴짐. NCP로 네트워크 개념을 확실히 익힌 뒤 AWS를 하니 더 잘 이해됨.