-
Spring Boot 시리즈 40편 – 실무에서의 Spring Boot CI/CD 구축 전략기술과 산업/언어 및 프레임워크 2025. 5. 30. 11:05728x90
Spring Boot 프로젝트의 실제 운영 환경에 적용 가능한 CI/CD 파이프라인 구축 전략을 정리합니다. GitHub Actions, Jenkins, Docker, AWS 기반의 배포 자동화 사례까지 포함하여 실무 적용 가능한 내용을 중심으로 설명합니다.
Spring Boot로 만든 애플리케이션을 실제 운영 환경에 안정적으로 배포하기 위해서는 개발 완료 후 ‘버튼 한 번’으로 배포가 끝나는 CI/CD 환경이 필수입니다. 이번 글에서는 Spring Boot 프로젝트에 특화된 CI/CD 구축 전략을 중심으로 실무에서의 DevOps 흐름을 따라가 보겠습니다.
왜 Spring Boot에 CI/CD가 중요한가?
Spring Boot 프로젝트는 일반적으로 빠르게 개발하여 빠르게 검증하는 특징을 가집니다. 하지만 릴리즈 과정이 수동적이라면 개발 속도만큼 배포도 따라가지 못하게 되죠.
특히 다음 상황에서는 CI/CD가 반드시 필요합니다:
- 팀원이 여러 명일 때
- QA 및 스테이징 환경을 별도로 운영할 때
- 빈번한 릴리즈와 hotfix가 발생할 때
- 클라우드 환경에서 자동 스케일링 또는 롤백이 필요할 때
1. Spring Boot 기반의 CI/CD 구성 흐름
전체 아키텍처 요약
개발자 → GitHub → GitHub Actions → Docker Build → Registry(Public/Private) → 배포 스크립트 → AWS EC2/ECS/EKS
여기서 가장 많이 쓰이는 조합은 아래와 같습니다:
구성 요소기술 스택 예시
소스 관리 GitHub, GitLab CI 도구 GitHub Actions, Jenkins 이미지 빌드 Docker 이미지 저장소 Docker Hub, AWS ECR 배포 대상 AWS EC2, ECS, EKS, 또는 쿠버네티스
2. GitHub Actions 기반 Spring Boot CI 예시
Spring Boot 프로젝트에 다음과 같은 .github/workflows/ci.yml을 정의할 수 있습니다.
name: CI for Spring Boot on: push: branches: [ main ] pull_request: branches: [ main ] jobs: build: runs-on: ubuntu-latest steps: - name: Checkout source uses: actions/checkout@v3 - name: Set up JDK uses: actions/setup-java@v3 with: java-version: '17' - name: Build with Gradle run: ./gradlew clean build
이렇게 구성하면 PR이 들어오거나 main 브랜치에 push되는 순간 자동으로 빌드가 실행됩니다.
3. Docker 기반 빌드 자동화
Dockerfile 예시:
FROM openjdk:17-jdk COPY build/libs/app.jar app.jar ENTRYPOINT ["java", "-jar", "/app.jar"]
GitHub Actions 내에서 Docker 이미지 빌드 및 Docker Hub 푸시까지 자동화할 수 있습니다.
- name: Log in to Docker Hub run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin - name: Build and push Docker image run: | docker build -t myrepo/spring-boot-app:latest . docker push myrepo/spring-boot-app:latest
4. AWS EC2에 자동 배포 스크립트 적용
EC2에 ssh 접속 후 Docker pull + 실행까지 자동화하려면 다음처럼 구성합니다.
- name: Deploy to EC2 uses: appleboy/ssh-action@master with: host: ${{ secrets.EC2_HOST }} username: ec2-user key: ${{ secrets.EC2_KEY }} script: | docker pull myrepo/spring-boot-app:latest docker stop spring-app || true docker rm spring-app || true docker run -d --name spring-app -p 8080:8080 myrepo/spring-boot-app:latest
5. Jenkins를 사용하는 경우
Jenkins는 여전히 많은 기업에서 사용됩니다. Spring Boot와 함께 Jenkins를 쓰는 경우에는 Jenkinsfile을 다음처럼 구성합니다:
pipeline { agent any stages { stage('Build') { steps { sh './gradlew clean build' } } stage('Docker Build') { steps { sh 'docker build -t myrepo/spring-boot-app .' sh 'docker push myrepo/spring-boot-app' } } stage('Deploy') { steps { sh 'ssh ec2-user@host docker run ...' } } } }
실전에서는 ‘단순한 구조 + 일관된 운영’
Spring Boot에 특화된 CI/CD 전략은 생각보다 복잡할 필요가 없습니다. 핵심은 ‘단순하고 반복 가능한 구조’를 만드는 것에 있습니다.
다음 기준을 점검해보세요:
- PR/Push 시점에 자동 빌드와 테스트가 동작하는가?
- Docker 이미지가 항상 동일한 태그 규칙으로 관리되는가?
- Rollback을 위한 버전 관리가 되고 있는가?
- 장애 발생 시 수동/자동 복구 시나리오가 준비되어 있는가?
CI/CD는 단순히 자동화가 아니라 ‘운영 신뢰성 확보’를 위한 도구입니다. Spring Boot와 함께라면 DevOps 환경에서도 충분히 민첩하고 안정적인 운영이 가능합니다.
728x90'기술과 산업 > 언어 및 프레임워크' 카테고리의 다른 글
Spring AI 시리즈 1화 – Spring AI 소개: 왜 지금 AI와 Spring의 결합인가? (1) 2025.05.30 Spring Boot 고급 시리즈 1화 – Spring Boot의 아키텍처 재조명: 왜 우리는 Spring Boot를 선택하는가 (0) 2025.05.30 FastAPI 시리즈 12화 - JWT 기반 인증 시스템 완성: 토큰 구조와 보안 처리 심화 (0) 2025.05.30 Spring Boot 시리즈 38편 – Spring Boot에서 분산 트레이싱(Distributed Tracing) 적용하기 (1) 2025.05.29 Spring Boot 시리즈 37편 – 실시간 기능을 위한 WebSocket 연동 전략 (0) 2025.05.29