doFirst 블록 안에서 bootRun.args(...)를 설정하고 finalizedBy로 bootRun을 이어 실행하는 비표준 패턴이다. 즉 localBootRun 자체는 아무 것도 안 하고 bootRun을 뒤따라 돌리며 args만 주입한다. ./gradlew bootRun을 직접 부르면 프로파일이 비어 부팅에 실패할 수 있으니, 로컬은 반드시 localBootRun을 쓴다. 자세한 빌드 메커니즘은 build-deploy-config 참고.
포트 주의
컨테이너는 Dockerfile:32에서 EXPOSE 8080이지만, 앱이 실제로 바인딩하는 포트는 application.yml:5-6의 server.port: 8000이다. 로컬에서는 8000으로 접속(예: http://localhost:8000). 8080은 컨테이너 노출 메타데이터일 뿐이다.
2. 환경 셋업 순서
처음 로컬을 띄울 때 이 순서대로
핵심은 (1) JDK 21, (2) my 프로파일 파일 준비, (3) Redis 도달성, (4) AWS Secrets 접근 권한이다.
flowchart TD
S0["STEP 0 사전 요구<br/>JDK 21 Amazon Corretto 권장<br/>Gradle 래퍼 동봉 별도 설치 불필요"]
S1["STEP 1 프로파일 local,my<br/>localBootRun 이 두 프로파일 활성화<br/>local 은 application-local.yml 커밋됨<br/>my 는 application-my.yml 직접 생성 gitignore 됨"]
S2["STEP 2 Redis Redisson<br/>local 프로파일은 redisson-local.yml 로드<br/>기본값이 DEV 원격 ElastiCache 를 가리킴<br/>도달 불가 시 my 로 로컬 Redis 오버라이드"]
S3["STEP 3 AWS Secrets Manager<br/>local 프로파일도 dev 시크릿을 끌어옴<br/>공급사별 시크릿은 supplier yml 의 dev,local 섹션<br/>optional 접두사라 누락 시 런타임 실패<br/>AWS 자격증명이 셸 환경에 있어야 함"]
S0 --> S1 --> S2 --> S3
STEP 1 — 프로파일 local,my: localBootRun이 local,my 두 개를 활성화. local → application-local.yml(커밋됨), my → application-my.yml(★ 직접 생성, .gitignore됨). .gitignore 마지막 줄 *-my.*가 모든 *-my.* 파일을 무시. 개인 비밀/오버라이드(포트, 자격증명 등)를 여기 둔다.
STEP 2 — Redis(Redisson): local 프로파일은 redisson/redisson-local.yml을 로드. application-local.yml:8-10에서 spring.redis.redisson.file: classpath:redisson/...-local. redisson-local.yml:11-12 → AWS ElastiCache serverless 주소 rediss://air-international-dev-...amazonaws.com:6379. ⚠ 기본값이 “DEV의 원격 Redis”를 가리킨다. VPN/네트워크 도달이 안 되면 application-my.yml로 로컬 Redis 오버라이드.
STEP 3 — AWS Secrets Manager: local 프로파일도 dev 시크릿을 끌어온다(application-local.yml:5-7): optional:aws-secretsmanager:dev/air-intl-adapter. 공급사별 시크릿은 supplier/*.yml의 dev,local 섹션에서 로드(예: supplier/amadeus.yml:1-7 → dev/air-intl-adapter/amadeus). optional: 접두사라 시크릿이 없어도 부팅은 되지만, 자격증명 누락 시 해당 공급사 호출이 런타임에 실패한다. AWS 자격증명(프로파일/역할)이 셸 환경에 있어야 한다.
my 프로파일이 뭐길래
application-my.yml은 저장소에 없다(.gitignore의 *-my.*가 차단). 각자 로컬에서 만들어 개인용 오버라이드(로컬 Redis, 슬랙 비활성, 포트 변경 등)를 둔다. application.yml:73-80에서 슬랙은 기본 active: true이고 application-local.yml:29-30이 active: false로 끄지만, 추가로 막고 싶거나 채널을 바꾸려면 my에서 한다. 프로파일/시크릿 전체 그림은 configuration-and-infra 참고.
프로파일별 Redis/Secrets 매핑 — 절대 헷갈리지 말 것
프로파일
Redisson 파일
AWS Secrets 경로(루트)
local
redisson-local.yml
dev/air-intl-adapter (★dev를 봄)
dev
redisson-dev.yml
dev/air-intl-adapter
qa
redisson-qa.yml
qa/air-intl-adapter
staging
redisson-staging.yml
staging/air-intl-adapter
prod
redisson-prod.yml
prod/air-intl-adapter
local이 local이 아니라 dev 시크릿/Redis를 보는 점이 신입이 가장 많이 빠지는 함정이다. 자세히는 landmines.
중앙 디스패처가 없다. 각 컨트롤러가 @RequestMapping("/internals/{NAME}/{op}")로 직접 노출된다. 예: AmadeusSearchController.kt:18-19 → /internals/AMADEUS/search + @CircuitBreaker(name="amadeusSearch"). 라우팅 전체 지도는 caller-callee-map, 공통 오퍼레이션은 common-operations.