✅ 1️⃣ 서론 - RESTful API CI/CD 및 배포가 중요한 이유
✅ 2️⃣ Docker를 활용한 RESTful API 컨테이너화
✅ 3️⃣ GitHub Actions을 활용한 CI/CD 자동화
✅ 4️⃣ AWS EC2를 이용한 배포 (Docker + Nginx + Spring Boot)
✅ 5️⃣ AWS RDS 및 환경 변수 설정
✅ 6️⃣ CI/CD 및 배포 최적화 전략
1️⃣ 서론 - RESTful API CI/CD 및 배포가 중요한 이유
🔹 RESTful API 배포의 주요 요소
- CI/CD (Continuous Integration & Continuous Deployment) → 코드 변경 사항을 자동 빌드, 테스트, 배포
- Docker 컨테이너화 → 배포 환경을 통일하고, 어디서든 실행 가능
- AWS EC2 + RDS 활용 → 확장성 있는 서버 배포 환경 구축
✅ CI/CD를 활용하면 코드 변경이 자동으로 빌드 및 배포되어 서비스 운영이 효율적!
🔥 이제 Docker 컨테이너화부터 AWS 배포까지 실습해보자!
2️⃣ Docker를 활용한 RESTful API 컨테이너화
🔹 1. Dockerfile 작성
📌 프로젝트 루트 디렉토리에 Dockerfile 생성
# 1. JDK 17 기반 이미지 사용
FROM openjdk:17-jdk-slim
# 2. 작업 디렉토리 설정
WORKDIR /app
# 3. JAR 파일 복사
COPY build/libs/demo-0.0.1-SNAPSHOT.jar app.jar
# 4. 실행 명령어
CMD ["java", "-jar", "app.jar"]
🔹 2. Docker 이미지 빌드 & 컨테이너 실행
📌 도커 이미지 빌드
docker build -t my-spring-boot-app .
📌 컨테이너 실행
docker run -p 8080:8080 my-spring-boot-app
✅ 이제 RESTful API가 컨테이너화되어 어디서든 실행 가능!
🔥 CI/CD를 통해 AWS EC2에 자동 배포해보자!
3️⃣ GitHub Actions을 활용한 CI/CD 자동화
🔹 1. GitHub Actions CI/CD Workflow 설정
📌 .github/workflows/deploy.yml 생성
name: Deploy to AWS
on:
push:
branches:
- main # main 브랜치에 push되면 실행
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Repository Checkout
uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- name: Build with Gradle
run: |
chmod +x gradlew
./gradlew build
- name: Build Docker Image
run: docker build -t my-spring-boot-app .
- name: Push Docker Image to AWS ECR (or Docker Hub)
run: |
echo "${{ secrets.AWS_ACCESS_KEY_ID }}" | docker login -u AWS --password-stdin <ECR_REPOSITORY_URL>
docker tag my-spring-boot-app <ECR_REPOSITORY_URL>:latest
docker push <ECR_REPOSITORY_URL>:latest
- name: Deploy to AWS EC2
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.AWS_EC2_HOST }}
username: ubuntu
key: ${{ secrets.AWS_EC2_SSH_KEY }}
script: |
docker pull <ECR_REPOSITORY_URL>:latest
docker stop spring-app || true
docker rm spring-app || true
docker run -d --name spring-app -p 8080:8080 <ECR_REPOSITORY_URL>:latest
✅ GitHub Actions를 설정하면 main 브랜치에 push될 때 자동으로 빌드 및 배포 진행!
4️⃣ AWS EC2를 이용한 배포 (Docker + Nginx + Spring Boot)
🔹 1. AWS EC2 인스턴스 생성
- AWS 콘솔에서 EC2 인스턴스 생성 (Ubuntu 22.04 LTS)
- 보안 그룹에서 포트 22 (SSH), 80 (HTTP), 8080 (Spring Boot) 허용
🔹 2. Nginx 리버스 프록시 설정
📌 Nginx 설치 및 설정
sudo apt update
sudo apt install nginx -y
sudo nano /etc/nginx/sites-available/default
📌 Nginx 설정 예제 (/etc/nginx/sites-available/default)
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
📌 Nginx 적용 및 재시작
sudo nginx -t
sudo systemctl restart nginx
✅ 이제 AWS EC2에서 Nginx를 통해 Spring Boot 컨테이너를 서비스할 수 있음!
5️⃣ AWS RDS 및 환경 변수 설정
🔹 1. AWS RDS 데이터베이스 연결
- AWS RDS 콘솔에서 PostgreSQL 또는 MySQL 인스턴스 생성
- 보안 그룹에서 EC2에서 접근 가능하도록 설정
📌 application.properties에서 DB 설정
spring.datasource.url=jdbc:mysql://<AWS_RDS_ENDPOINT>:3306/mydb
spring.datasource.username=myuser
spring.datasource.password=mypassword
spring.jpa.hibernate.ddl-auto=update
✅ 환경 변수(.env)를 활용하면 보안 강화 가능!
6️⃣ CI/CD 및 배포 최적화 전략
✅ 1. Docker Compose 활용하여 다중 컨테이너 관리 (docker-compose.yaml)
version: "3"
services:
app:
image: my-spring-boot-app
ports:
- "8080:8080"
depends_on:
- db
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: mydb
MYSQL_USER: myuser
MYSQL_PASSWORD: mypassword
ports:
- "3306:3306"
✅ 2. AWS ALB (Application Load Balancer) 설정
- 다중 EC2 인스턴스 로드 밸런싱
- HTTPS 트래픽 처리 및 SSL 적용
✅ 3. 로그 관리 (CloudWatch + ELK 스택 활용)
- 로그 수집 및 모니터링 자동화
✅ 4. 성능 모니터링 (Prometheus + Grafana 연동)
- REST API 성능 분석 및 모니터링
✅ 5. CI/CD 속도 개선 (Gradle 캐싱, 병렬 빌드 적용)
🎯 마무리: RESTful API CI/CD 및 배포 최적화 완료!
🔥 Spring Boot RESTful API를 Docker 컨테이너화하고 AWS에 CI/CD를 적용하여 자동 배포까지 구현!
✅ GitHub Actions를 활용한 CI/CD 자동화 구축
✅ Docker + Nginx + AWS EC2를 활용한 프로덕션 배포
✅ AWS RDS 연결 및 환경 변수 적용으로 보안 강화
🚀 이제 실전 프로젝트에서 CI/CD 및 배포를 적용해보자!
'Springboot' 카테고리의 다른 글
Springboot - Field required a bean of type '...' that could not be found (Bean 주입 실패) (0) | 2025.03.18 |
---|---|
Spring Boot - Port 8080 is already in use (0) | 2025.03.18 |
🚀 Spring Boot 예외 처리 및 Global Exception Handling (0) | 2025.03.13 |
🚀 RESTful API 페이징 및 정렬 (Spring Boot Pageable) 가이드 (0) | 2025.03.10 |
🚀 RESTful API 설계 가이드 (Spring Data JPA + Swagger) (0) | 2025.02.27 |