Springboot

🚀 RESTful API CI/CD 및 배포 (AWS, Docker) 가이드

수아파파's 2025. 3. 18. 19:44
반응형

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 인스턴스 생성

  1. AWS 콘솔에서 EC2 인스턴스 생성 (Ubuntu 22.04 LTS)
  2. 보안 그룹에서 포트 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 데이터베이스 연결

  1. AWS RDS 콘솔에서 PostgreSQL 또는 MySQL 인스턴스 생성
  2. 보안 그룹에서 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 및 배포를 적용해보자!

반응형