사용자에게 끊김 없는 서비스 제공을 위해 Quizly 서비스에서 블루/그린(Blue/Green) 무중단 배포 전략을 적용하기로 하였습니다. 본 글에서 검토한 무중단 배포 전략과 최종적으로 확정한 인프라 아키텍처를 적용과정을 공유합니다.
무중단 배포를 구현하는 방식은 인프라 구성에 따라 다양합니다. NCP 환경을 기준으로 세 가지 옵션을 검토하고 배포에 필요한 고정 비용을 계산해보았습니다.
단일 서버 내 Nginx 리버스 프록시 (Server)
한 대의 서버에 두 개의 Spring Boot 컨테이너를 띄우고 Nginx가 트래픽을 스위칭하는 방식입니다. 별도의 로드 밸런서(LB) 비용이 발생하지 않아 가장 경제적입니다.
예상 고정 비용
→ 69,120원(서버) = 69,120원 / 월
NCP Load Balancer + Target Group (Server, LB)
NCP의 Load Balancer와 두 개의 Target Group(Blue/Green)을 이용해 트래픽을 분산하는 방식입니다. 인프라 레벨에서 트래픽을 제어하므로 안정성이 높지만, 매월 약 1.9만 원의 고정 비용이 증가합니다.
예상 고정 비용
→ 69,120원(서버) + 18,720원(LB) = 87,840원 / 월
NCP Kubernetes Service (NKS)
컨테이너 기반(Docker) 운영에 최적화된 쿠버네티스의 Rolling Update 전략을 사용하는 방식입니다. 쿠버네이트스 관련 지식이 필요하며 고정 비용이 크게 증가합니다.
예상 고정 비용
→ 72,000원(NKS) + 66,200원(서버) = 138,200원 / 월
NCP에서 지원 받은 100만원으로 6개월 이상의 실 서비스 운영을 목표로 비용과 운영 지속성을 최우선으로 고려하여 “단일 서버 내 Nginx 리버스 프록시” 방식을 최종 채택했습니다. 또한 현재 서비스 규모에서 NKS와 같은 고도화된 도구는 오버엔지니어링으로 판단했습니다.
무중단 배포 전략 중 하나인 Blue/Green 배포는 구버전(Blue)과 신버전(Green) 두 세트를 동시에 구동하는 방식입니다.
Blue (기존 환경)
→ 현재 사용자가 접속하여 원활하게 서비스되고 있는 8080 포트의 컨테이너입니다.
Green (신규 환경)
→ 새롭게 빌드된 코드가 포함된 컨테이너로, 8081 포트에서 대기합니다.
스위칭(Switching)
→ Green 환경의 Health Check가 완료되어 서비스 준비가 끝나면 Nginx 설정을 변경(reload)하여 트래픽을 8081로 전환합니다.
Nginx는 웹 서버로 선택한 아키텍처에서 리버스 프록시(Reverse Proxy) 역할을 수행하는 컴포넌트입니다.
보안 계층 형성
→ 외부 사용자는 Nginx(80/443 포트)하고만 통신합니다. 실제 Spring Boot 서버는 내부 포트(8080/8081)에 숨겨져 있어 외부의 직접적인 공격으로부터 보호받습니다.
동적 트래픽 스위칭
→ Nginx는 설정 파일의 포트 수정 후 reload 명령을 내리면 서비스 중단 없이 트래픽의 방향을 바꿀 수 있습니다. 이는 물리적인 서버 교체 없이 소프트웨어 레벨에서 무중단 배포를 가능하게 합니다.
네이버 클라우드 플랫폼(NCP)에서 네트워크 보안을 설계 시 매번 헷갈려서… 정리해보았습니다.
| 구분 | ACG (Access Control Group) | NACL (Network Access Control List) |
|---|---|---|
| 적용 단위 | 서버(VM) 단위 | 서브넷(Subnet) 단위 |
| 작동 방식 | Stateful: 요청을 허용하면 응답은 자동 허용 | Stateless: Inbound/Outbound 규칙을 각각 명시 |
| 제어 범위 | 개별 인스턴스의 접근 제어 | 서브넷 전체의 네트워크 흐름 제어 |
| 주요 용도 | 특정 애플리케이션 포트 개방 | 네트워크 대역별 차단 및 허용 |
이전 프로젝트에서 인프라 자원의 네이밍이 혼동되어 있어서 용도 파악에 힘들었던 경험이 있어서 설계 시작 전에 네이밍 규칙을 정하였습니다.
리소스 네이밍 규칙
→ 모든 인프라 자원은 [환경]-[유형]-[가용영역] 형식을 따릅니다.
(prod-pub-app-snet : 운영 환경 - Public 서브넷 - 애플리케이션용 서브넷)
환경 변수 및 보안 키 관리
→ 운영(_PROD)과 개발(_DEV) 환경 변수를 명확히 구분하여 설정 오류를 방지합니다.
→ DB 비밀번호, API Key, 서버 접속 정보 등 보안이 필요한 값은 GitHub Secrets에 등록하여 CI/CD 파이프라인에서 사용 할 수 있도록 관리합니다.

CI 단계의 목표는 “컨테이너 이미지를 만드는 것”입니다.
GitHub Actions 감지
→ 개발자가 main 브랜치에 코드를 Push하면 미리 정의된 deploy.yml 트리거됩니다.
프로젝트 빌드
→ Java 가상 환경에서 Spring Boot 프로젝트를 컴파일 후JAR 파일을 생성합니다.
보안 설정 주입
→ GitHub Secrets에서 가져와 빌드 시점에 application.yml로 주입합니다.
도커 이미지 생성 및 업로드
→ 생성된 Docker 이미지를 NCR(Naver Container Registry)로 Push하여 배포 준비를 합니다.
CD 단계의 목표는 "서비스 중단 없이 신규 버전을 실서버에 반영하는 것"입니다. 해당 부분에서 Blue/Green 전략이 실제로 구현됩니다.