Skip to content

pposong/cloud

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

15 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

☁️ ν΄λΌμš°λ“œ μ•„ν‚€ν…μ²˜ 섀계 & 배포 과제


πŸ“Œ ν”„λ‘œμ νŠΈ μ†Œκ°œ

Spring Boot 기반의 νŒ€μ› 정보 관리 APIμž…λ‹ˆλ‹€. AWS ν΄λΌμš°λ“œ ν™˜κ²½μ—μ„œ VPC λ„€νŠΈμ›Œν¬ ꡬ성, RDS DB 연동, S3 파일 μ €μž₯, ALB + ASG ꡬ성, GitHub Actionsλ₯Ό ν†΅ν•œ CI/CD μžλ™ν™”κΉŒμ§€ λ‹¨κ³„λ³„λ‘œ κ΅¬μΆ•ν–ˆμŠ΅λ‹ˆλ‹€.


πŸ›  기술 μŠ€νƒ

λΆ„λ₯˜ 기술
Language Java 17
Framework Spring Boot 4.0.3
ORM Spring Data JPA / Hibernate
DB MySQL (AWS RDS), H2 (local)
Infra AWS VPC, EC2, RDS, S3, ALB, ASG, CloudFront
CI/CD GitHub Actions, Docker, Docker Hub
Config AWS Parameter Store
Monitoring Spring Actuator
Build Gradle

πŸ—‚οΈ ν”„λ‘œμ νŠΈ ꡬ쑰

src/
β”œβ”€β”€ main/
β”‚   β”œβ”€β”€ java/com/cloud/
β”‚   β”‚   β”œβ”€β”€ CloudApplication.java
β”‚   β”‚   └── member/
β”‚   β”‚       β”œβ”€β”€ controller/    MemberController.java
β”‚   β”‚       β”œβ”€β”€ service/       MemberService.java, S3Service.java
β”‚   β”‚       β”œβ”€β”€ repository/    MemberRepository.java
β”‚   β”‚       β”œβ”€β”€ entity/        Member.java
β”‚   β”‚       β”œβ”€β”€ dto/           MemberRequest.java, MemberResponse.java
β”‚   β”‚       └── exception/     GlobalExceptionHandler.java
β”‚   └── resources/
β”‚       β”œβ”€β”€ application.properties         # 곡톡 μ„€μ •
β”‚       β”œβ”€β”€ application-local.properties   # 둜컬 (H2)
β”‚       └── application-prod.properties    # 운영 (MySQL + Parameter Store)
β”œβ”€β”€ Dockerfile
└── .github/workflows/deploy.yml

βœ… κ΅¬ν˜„ 단계별 κΈ°λŠ₯

LV 0 - AWS Budget μ„€μ • πŸ’°

μš”κΈˆ 폭탄 λ°©μ§€λ₯Ό μœ„ν•œ λΉ„μš© μ•Œλ¦Ό μ„€μ •

  • AWS Budgetsμ—μ„œ μ›” μ˜ˆμ‚° $100 μ„€μ •
  • μ˜ˆμ‚°μ˜ 80% 도달 μ‹œ 이메일 μ•Œλ¦Ό μˆ˜μ‹  μ„€μ •

πŸ“Έ Budget μ„€μ • ν™”λ©΄ μŠ€ν¬λ¦°μƒ· 2026-03-13 120803


LV 1 - λ„€νŠΈμ›Œν¬ ꡬ좕 및 핡심 κΈ°λŠ₯ 배포 🌐

VPC 섀계뢀터 EC2 배포, ν—¬μŠ€μ²΄ν¬κΉŒμ§€

인프라

  • VPC 생성 및 Public / Private Subnet 뢄리
  • Public Subnet에 EC2 μΈμŠ€ν„΄μŠ€ 생성

API κΈ°λŠ₯

Method URL μ„€λͺ…
POST /api/members νŒ€μ› 정보(이름, λ‚˜μ΄, MBTI) μ €μž₯
GET /api/members/{id} νŒ€μ› 정보 쑰회

운영 μ„€μ •

  • Spring Profile 뢄리: local(H2) / prod(MySQL)
  • INFO 레벨 API μš”μ²­ 둜그: [API - LOG] ...
  • ERROR 레벨 μ˜ˆμ™Έ 처리 + μŠ€νƒνŠΈλ ˆμ΄μŠ€ λ‘œκΉ…
  • Spring Actuator ν—¬μŠ€μ²΄ν¬ λ…ΈμΆœ
GET /actuator/health
{"status": "UP"}

πŸ–₯️ EC2 퍼블릭 IP: 13.125.129.84


LV 2 - DB 뢄리 및 λ³΄μ•ˆ μ—°κ²° πŸ”

RDS 뢄리 + λ³΄μ•ˆ κ·Έλ£Ή 체이닝 + Parameter Store

인프라

  • Public Subnet에 MySQL RDS 생성 (둜컬 접속 ν…ŒμŠ€νŠΈ κ°€λŠ₯)
  • λ³΄μ•ˆ κ·Έλ£Ή 체이닝: RDS Inbound에 IP 직접 ν—ˆμš© λŒ€μ‹  EC2 λ³΄μ•ˆ κ·Έλ£Ή ID만 ν—ˆμš©

μ„€μ •

  • AWS Parameter Store에 DB 접속 정보 μ €μž₯ (url, username, password, team-name)
  • μ•± μ‹€ν–‰ μ‹œ Parameter Store κ°’ μžλ™ μ£Όμž…

Actuator Info ν™•μž₯

GET /actuator/info
{"app": {"team-name": "Team2"}}

πŸ“ Actuator Info URL: https://pposong.kr/actuator/info

πŸ“Έ RDS λ³΄μ•ˆ κ·Έλ£Ή μΈλ°”μš΄λ“œ κ·œμΉ™ ν™”λ©΄ μŠ€ν¬λ¦°μƒ· 2026-03-13 122014


LV 3 - ν”„λ‘œν•„ 사진 κΈ°λŠ₯ μΆ”κ°€ & κΆŒν•œ 관리 πŸ–ΌοΈ

S3 + IAM Role + Presigned URL

인프라

  • S3 버킷 생성 (퍼블릭 μ•‘μ„ΈμŠ€ 차단 ON)
  • IAM Role 생성 β†’ EC2에 μ—°κ²° (Access Key μ½”λ“œ 미포함)

API κΈ°λŠ₯

Method URL μ„€λͺ…
POST /api/members/{id}/profile-image ν”„λ‘œν•„ 사진 S3 μ—…λ‘œλ“œ
GET /api/members/{id}/profile-image Presigned URL λ°˜ν™˜ (μœ νš¨κΈ°κ°„ 7일)

πŸ”— Presigned URL:

https://camp-health-pposong-files.s3.ap-northeast-2.amazonaws.com/profiles/6aaf57ff-fa0d-412b-b99f-cfee8c0f966b_2.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIASSDNAZWDS5S4ADTL%2F20260313%2Fap-northeast-2%2Fs3%2Faws4_request&X-Amz-Date=20260313T014914Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Security-Token=IQoJb3JpZ2luX2VjELr%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaDmFwLW5vcnRoZWFzdC0yIkYwRAIgGwyBGbQCpyRNZmG%2F3zN5E%2F6ysrLwoWCao5hkTFZOsN0CIACV7g%2B2oYt83sJudRzNTkz2rUafx0haVxQKKvU3g7JRKtQFCIP%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEQABoMMTc2MzIyMzAxMzE5Igzm17YtM4H69uBs0RIqqAWif5pNGmtroPNqqtTZyZ27YGSV9JFM8B%2BVPq2LzCv1BelPaCfBbyD18jTvjsPHB4ca3qRCnPJA5zo8mQKZ1Pb4rQf68HAZq%2BtmgvpvIoorWvB1XL5wXYHFq%2BOUehXb55Pdp8JFnHfLDz7YgsUJ5wS2LoamEDyGcsNFkEMRX62R%2FjBZVlnVT7eoRRal4qA5UD1f66DvvysZCs%2FCLO1CDBm3%2F24gRcW9gASDbY3CfwGOYr529vDGOoqrfZXV1VYl2XXhMCiT%2Fz2QoJpypKZQW9O7zbh9oDUA81aBPAPegoQrJNFZZ6N8M2ZErQAuanJpZnUoRrbHUrZ4RzixD5rHZeE5y1ApRJBgPDY9lFxT064T1UWYFvUUuF6mzqeuUoC%2BySyro9N0NNtAtKUlGR8DyqArGWbaRj2qxNneS%2BEcw95LXASUDRzZR%2F3WnXpArxGiSuoy119WP2jeW9PZL%2FZPNPmP0Cx1uLJm8nSs0zAZMuOUuaX7Cf4PV07sSTz4l7K%2FMFyFERok2OuyIFxNmTlpzSVgMEnvDyepTFs5zqhAS05%2BDhX9qc2%2FUpPm7McoZQJjFAn8qV5RcCEwG63xVRxGavwe10hecRu0EhpZBjzlAXC4KoHhEUmRGKA%2BGhvLIUjz1T1Khx8w9WlL7eBJivMEZqNo20Rd%2FEiolpeythQ8Kc6urJhbFNy6ZtBmjeKvJPXIQjmM4H52RahOWSAjP1lKoFSlhC2jQsTAJ%2FJ7hJ%2BeX%2FGFuD1Or45KnTexIG7WOnKnBqKGoHSaY8POsT9wCr4KF0ZXirp8acMi7f6VyK40o8lMpiFwQ8%2Bojn0Mt3ZIQzZRlo3%2B2mNDsTvHyOTyo44MC0sPUNd%2BQBgsAQlAtIhS6B3w5V1k3jz%2BUhGA5L2v22aKiCQHu6y1QzQ8SzD70c3NBjqyAVAfqvT6ZNdhSx3w85fGz%2BHw%2F%2BsdZn5xNf79Xclhq3ng0uOZYO2r7gAkTHJSXohoxQS%2FO8EnA%2F8i6%2FMe7EkK5ihFRDazPDEQLPi%2FL7jvZrvxCDXAmpy1mT6y%2BrpNXV91xY3l9MWA2iGy7RX5Fb3q7bzfrx9%2Bl4Z5h8sRCbES68vjo9MX2z%2FWnKIO42nA38VSuhs8ZPHrLQXt1U26N%2B1gM9JXdpR6%2BL5%2BaZDOaZNsPRtr9Dk%3D&X-Amz-Signature=9507ffffb33d68403a0826c4f35b870edfdf3d6be671879a4f18fd3e2ea85f62

⏰ 만료 μ‹œκ°„: 2026λ…„ 3μ›” 20일 μŠ€ν¬λ¦°μƒ· 2026-03-13 123909


LV 4 - Docker & CI/CD νŒŒμ΄ν”„λΌμΈ 🐳

Dockerfile μž‘μ„± + GitHub Actions μžλ™ 배포

Docker

  • Dockerfile μž‘μ„± (Amazon Corretto 17 기반)
  • app.jar λΉŒλ“œ ν›„ 이미지화

GitHub Actions (deploy.yml)

  1. main 브랜치 Push μ‹œ μžλ™ 트리거
  2. Gradle λΉŒλ“œ (bootJar)
  3. Docker 이미지 λΉŒλ“œ β†’ Docker Hub Push
  4. AWS 자격증λͺ… μ„€μ •
  5. ASG Instance Refresh둜 EC2 μžλ™ 재배포

πŸ“Έ GitHub Actions 성곡 ν™”λ©΄ μŠ€ν¬λ¦°μƒ· 2026-03-13 123005

πŸ“Έ EC2 sudo docker ps μ‹€ν–‰ ν™”λ©΄ μŠ€ν¬λ¦°μƒ· 2026-03-13 124311


LV 5 - κ³ κ°€μš©μ„± μ•„ν‚€ν…μ²˜ & HTTPS 도메인 μ—°κ²° πŸ—οΈ

NAT Gateway + ALB + ASG + ACM

인프라 λ³€κ²½

  • NAT Gateway 생성 (Public Subnet) β†’ Private Subnet λΌμš°νŒ… μ„€μ •
  • RDS & EC2 β†’ Private Subnet으둜 이전 (둜컬 직접 접속 λΆˆκ°€)

도메인 & λ³΄μ•ˆ

  • Cloudflareμ—μ„œ 도메인 μ—°κ²°
  • ACMμ—μ„œ SSL μΈμ¦μ„œ λ°œκΈ‰

λ‘œλ“œ λ°ΈλŸ°μ„œ & μ˜€ν†  μŠ€μΌ€μΌλ§

  • ALB 생성: HTTPS(443) λ¦¬μŠ€λ„ˆ + μΈμ¦μ„œ 적용, HTTP β†’ HTTPS λ¦¬λ‹€μ΄λ ‰νŠΈ
  • Launch Template μž‘μ„± β†’ Auto Scaling Group 생성
  • Cloudflare CNAME β†’ ALB DNS μ—°κ²°

🌍 HTTPS 도메인: https://pposong.kr

πŸ“Έ Target Group Healthy μƒνƒœ ν™”λ©΄ μŠ€ν¬λ¦°μƒ· 2026-03-13 124422


LV 6 - CloudFront CDN 적용 🌏

S3 + CloudFront둜 κΈ€λ‘œλ²Œ 이미지 배포

ꡬ성

  • S3 버킷을 Origin으둜 CloudFront 배포 생성
  • Presigned URL β†’ CloudFront 도메인 URL λ°©μ‹μœΌλ‘œ λ³€κ²½

πŸ”— CloudFront 이미지 URL: https://d1v1uch0vgh0vj.cloudfront.net/profiles/6aaf57ff-fa0d-412b-b99f-cfee8c0f966b_2.jpg


πŸš€ API λͺ…μ„Έ

Method URL μ„€λͺ… μƒνƒœμ½”λ“œ
POST /api/members νŒ€μ› 등둝 201
GET /api/members/{id} νŒ€μ› 쑰회 200
POST /api/members/{id}/profile-image ν”„λ‘œν•„ 사진 μ—…λ‘œλ“œ 200
GET /api/members/{id}/profile-image ν”„λ‘œν•„ 이미지 URL 쑰회 200
GET /actuator/health ν—¬μŠ€μ²΄ν¬ 200
GET /actuator/info νŒ€ 정보 쑰회 200

βš™οΈ ν™˜κ²½ μ„€μ •

Profile 뢄리

Profile DB μš©λ„
local H2 (In-Memory) 둜컬 개발
prod MySQL (RDS) 운영 배포

Parameter Store 경둜

/camp-health-app/prod/
  β”œβ”€β”€ spring.datasource.url
  β”œβ”€β”€ spring.datasource.username
  β”œβ”€β”€ spring.datasource.password
  └── TEAM-NAME

πŸ› νŠΈλŸ¬λΈ”μŠˆνŒ…

https://velog.io/@okokok_1/내일배움캠프-Spring-λ°±μ—”λ“œ-DAY-45-과제-ν΄λΌμš°λ“œμ•„ν‚€ν…μ²˜-섀계-배포-c8yt6wod

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors