Architecture

Runtime boundary

external servlet container
        |
        | context path: container/runtime choice
        v
Spring Boot WAR
  |- ServletInitializer
  |- /entry
  |- /healthz
  `- deploy profile guard

애플리케이션은 특정 WAR 파일명이나 / context path를 전제로 URL을 만들지 않습니다. DeploymentInfoController는 현재 request의 context path를 사용해 링크를 구성합니다.

Configuration boundary

repository configuration
  application.properties
  application-deploy.properties
        |
        | PORTFOLIO_RUNTIME_TOKEN
        v
DeployRuntimeGuard

deploy profile의 필수 런타임 값은 환경에서 주입합니다. 값이 비어 있으면 application context 생성 단계에서 실패합니다. 샘플 endpoint는 해당 값 자체를 반환하거나 기록하지 않습니다.

Release boundary

candidate WAR
   |
   v
stage -> previous backup -> active WAR
                         |
                         v
                    health check
                    /          \
                  PASS          FAIL
                   |             |
                retain        rollback

release-war.sh는 파일 교체와 health/rollback 경계만 재현합니다. 실제 Tomcat reload 방식, session drain, reverse proxy, cluster rolling deployment는 환경별 책임으로 남겨 둡니다.

설계 이유

  • WAR artifact와 런타임 설정을 분리해 빌드 산출물이 환경별 비밀값을 포함하지 않게 합니다.
  • context path를 runtime concern으로 취급해 개발·검증·운영 경로 차이로 인한 하드코딩 결함을 줄입니다.
  • artifact 교체 성공이 아니라 health gate 통과를 배포 성공 조건으로 둡니다.
  • health 실패 시 이전 artifact를 복구해 실패 상태를 그대로 확정하지 않습니다.