Skip to content
env-config-management logo

환경변수 및 Spring 프로파일 관리

env-config-management

환경변수(.env.*), Spring 프로파일(application-*.yml) 수정 시 사용. app/backend/CLAUDE.md 참조 필수. 서비스별 포트 중복 검증, 민감 정보는 .env.local만, application-*.yml은 플레이스홀더만(기본값 금지). 의미없는 override 지양. SQS 엔드포인트 정확성 확인.

SKILL.md

Full skill instructions

환경변수 및 Spring 프로파일 관리

참조 문서

핵심 철학

환경변수 파일 역할

파일역할커밋민감 정보사용 시점
.envdocker-compose 인프라 설정 (MySQL, LocalStack)✅❌docker-compose up
.env.common컨테이너 공통 앱 설정 (Service URLs, SQS 큐)✅❌docker-compose.{acceptance|demo}.yml
.env.localSpring 직접 실행용 모든 설정❌ (gitignore)✅Gradle bootRun/​test (IDE)
.env.acceptance.env.common 오버라이드 (테스트 DB, 더미 키)✅❌docker-compose.acceptance.yml
.env.demo.env.common 오버라이드 (데모 환경)✅❌docker-compose.demo.yml

Spring 프로파일 파일

파일환경커밋하드코딩환경변수 로드
application.yml공통✅❌ (플레이스홀더만)-
application-local.yml로컬 개발 (IDE)✅❌ (플레이스홀더만)Gradle이 .env.local 로드
application-acceptance.yml인수 테스트✅❌ (플레이스홀더만).env.common + .env.acceptance
application-prod.yml운영/데모✅❌ (플레이스홀더만).env.common + .env.demo

핵심 원칙 (절대 위반 금지 ⚠️)

1. 민감 정보 분리

# ❌ 나쁜 예: application-local.yml에 하드코딩
jwt:
  secret: "my-secret-key-12345"  # 절대 금지!

# ✅ 좋은 예: 플레이스홀더만
jwt:
  secret: ${JWT_SECRET}

규칙:

  • .env.local에만 민감 정보 저장 (gitignore)
  • application-*.yml은 ${...} 플레이스홀더만 사용
  • 커밋되는 파일에는 절대 민감 정보 하드코딩 금지

2. 서비스별 포트 고정 (절대 변경 금지)

8080 - API Gateway (모든 요청 진입점)
8081 - User-Service
8082 - Course-Service
8083 - Schedule-Service

검증:

  • 포트 번호 변경 시 모든 서비스의 SERVICE_URL 환경변수 확인
  • API Gateway 라우팅 설정 확인

3. .env.local 필수 내용

# IDE 직접 실행 시 필요한 모든 설정 포함
# 1. 비밀 정보
JWT_SECRET=...
ENCRYPTION_KEY=...
LOCALSTACK_AUTH_TOKEN=...

# 2. 로컬 전용 설정 (localhost)
USER_SERVICE_URL=http://localhost:8081
COURSE_SERVICE_URL=http://localhost:8082
SCHEDULE_SERVICE_URL=http://localhost:8083

# 3. .env.common의 모든 내용 복사
# (중복이지만 로컬 실행 시 필요)
CANVAS_API_BASE_URL=https://khcanvas.khu.ac.kr/​api/​v1
SQS_ENDPOINT=http://localhost:4566
...

4. 플레이스홀더 기본값 절대 금지 (Fail Fast)

# ❌ 나쁜 예: 기본값 사용
spring:
  datasource:
    url: ${DATABASE_URL:jdbc:mysql://localhost:3306/​default}  # 절대 금지!

# ✅ 좋은 예: 기본값 없이 명시적 실패
spring:
  datasource:
    url: ${DATABASE_URL}  # 환경변수 없으면 에러 발생

철학:

  • 예상치 못한 기본값은 예상치 못한 동작을 야기함
  • 환경변수가 누락되면 명시적으로 에러 발생시켜 즉시 파악
  • "조용히 잘못 동작"보다 "명시적으로 실패"가 훨씬 안전

규칙:

  • ${VAR_NAME:default} 형식 절대 금지
  • ${VAR_NAME} 형식만 사용
  • 누락된 환경변수는 즉시 감지되어야 함

5. 의미없는 Override 지양 (DRY 원칙)

# ❌ 나쁜 예: .env.common과 동일한 값을 .env.acceptance에서 반복
# .env.common
CANVAS_API_BASE_URL=https://khcanvas.khu.ac.kr/​api/​v1

# .env.acceptance (의미없는 중복)
CANVAS_API_BASE_URL=https://khcanvas.khu.ac.kr/​api/​v1  # 절대 금지! base와 동일

# ✅ 좋은 예: 실제로 다른 값만 override
# .env.common
DATABASE_URL=jdbc:mysql://mysql:3306/​unisync

# .env.acceptance (테스트 DB로 override)
DATABASE_URL=jdbc:mysql://mysql:3306/​unisync_test  # 이건 OK (실제로 다름)

철학:

  • base & override 관계에서 같은 값 반복은 의미 없음
  • 환경변수 개수가 지나치게 많아지면 관리 어려움
  • 변경 시 여러 파일 수정해야 하는 부담 증가

규칙:

  • .env.common에 있는 값을 .env.{acceptance|demo}에서 동일하게 반복 금지
  • application.yml에 있는 값을 application-{local|acceptance|prod}.yml에서 동일하게 반복 금지
  • 실제로 다른 값일 때만 override

Base & Override 관계:

# 환경변수 파일
.env.common (base)
  ├── .env.acceptance (override: 테스트 전용 값만)
  └── .env.demo (override: 데모 전용 값만)

# Spring 프로파일
application.yml (base)
  ├── application-local.yml (override: 로컬 전용 값만)
  ├── application-acceptance.yml (override: 테스트 전용 값만)
  └── application-prod.yml (override: 운영 전용 값만)

6. SQS 큐 이름 정확성

# 반드시 docs/​design/​sqs-architecture.md와 일치해야 함
SQS_LAMBDA_TO_COURSE_ENROLLMENTS=lambda-to-courseservice-enrollments
SQS_LAMBDA_TO_COURSE_ASSIGNMENTS=lambda-to-courseservice-assignments
SQS_COURSE_TO_SCHEDULE_ASSIGNMENTS=courseservice-to-scheduleservice-assignments

검증:

  • SQS 큐 이름 변경 시 관련 서비스 모두 확인
  • LocalStack에서 큐 생성 스크립트 확인 (init-aws.sh)

체크리스트

.env.* 파일 수정 시

작성 전
  • app/​backend/​CLAUDE.md 환경변수 철학 확인
  • 수정할 파일 역할 확인 (.env vs .env.common vs .env.local)
  • 민감 정보는 .env.local에만 작성 확인
작성 중
  • 민감 정보 분리: 비밀 정보는 .env.local만
  • 포트 중복 검증: 8080-8083 범위 확인
  • SERVICE_URL 정확성: http://localhost:{포트} 형식
  • SQS 큐 이름: docs/​design/​sqs-architecture.md와 일치
  • CANVAS_API_BASE_URL: https://khcanvas.khu.ac.kr/api/v1 고정
  • 의미없는 override 금지: base 파일과 동일한 값 반복 금지
작성 후
  • .env.local.example 업데이트 (새 변수 추가 시)
  • 관련 서비스 재시작하여 환경변수 로드 확인
  • ./​gradlew printEnv 실행하여 로드 검증

application-*.yml 파일 수정 시

작성 전
  • 수정할 프로파일 확인 (local/​acceptance/​prod)
  • 해당 프로파일의 용도 확인 (app/​backend/​CLAUDE.md 참조)
작성 중
  • 하드코딩 금지: 모든 값은 ${...} 플레이스홀더
  • 플레이스홀더 기본값 금지: ${VAR:default} 형식 절대 금지, ${VAR} 만 사용
  • 플레이스홀더 네이밍: 대문자_스네이크_케이스
  • 환경변수 존재 확인: 해당 환경변수가 .env.* 파일에 존재하는지 확인
  • 의미없는 override 금지: application.yml과 동일한 값 반복 금지
작성 후
  • 해당 프로파일로 서비스 실행하여 검증
  • 누락된 환경변수 없는지 확인 (에러 로그 확인)

새 환경변수 추가 시

단계별 작업
  1. docs/​design/​system-architecture.md 또는 app/​backend/​CLAUDE.md 업데이트

    • 새 환경변수 목적, 형식 문서화
  2. .env.common 또는 .env.local에 추가

    • 공통 설정: .env.common
    • 민감 정보: .env.local만
  3. .env.local.example 업데이트

    • 새 환경변수 템플릿 추가
    • 설명 주석 추가
  4. application-*.yml에 플레이스홀더 추가

    • ${NEW_VARIABLE_NAME} (기본값 없이)
    • ⚠️ 절대 금지: ${NEW_VARIABLE_NAME:default-value} (기본값 설정)
  5. 검증

    • ./​gradlew printEnv 실행
    • 서비스 재시작 후 로그 확인
    • 환경변수 누락 시 에러 발생 확인 (Fail Fast)

금지사항

  • ❌ application-*.yml에 하드코딩: 민감 정보, URL, 포트 등 절대 금지
  • ❌ 플레이스홀더 기본값 사용: ${VAR:default} 형식 절대 금지 (Fail Fast 위반)
  • ❌ 의미없는 override: base 파일과 동일한 값을 override 파일에서 반복
  • ❌ 포트 번호 변경: 8080-8083 고정, 변경 시 전체 시스템 영향
  • ❌ SERVICE_URL 오타: http://localhost:8081 형식 정확히 준수
  • ❌ .env.local 커밋: gitignore 확인, 민감 정보 유출 방지
  • ❌ SQS 큐 이름 오타: docs/​design/​sqs-architecture.md와 정확히 일치
  • ❌ .env.common에 민감 정보: JWT_SECRET, ENCRYPTION_KEY 등 .env.local만

트러블슈팅

문제: 환경변수가 로드 안됨

해결:

  1. .env.local 파일 존재 확인
  2. Gradle 스크립트 확인 (build.gradle.kts)
  3. ./​gradlew printEnv 실행하여 로드 상태 확인

문제: LocalStack 연결 실패

해결:

  1. docker-compose ps 실행하여 LocalStack 상태 확인
  2. .env.local에 LOCALSTACK_AUTH_TOKEN 존재 확인
  3. SQS_ENDPOINT=http://localhost:4566 확인

문제: 서비스 간 통신 실패

해결:

  1. 포트 번호 확인 (8080-8083)
  2. SERVICE_URL 환경변수 확인
  3. API Gateway 라우팅 설정 확인 (GatewayRoutesConfig.java)

환경변수 검증 명령

# User Service 환경변수 확인
cd app/​backend/​user-service
./​gradlew printEnv

# Course Service
cd app/​backend/​course-service
./​gradlew printEnv

# Schedule Service
cd app/​backend/​schedule-service
./​gradlew printEnv

# API Gateway
cd app/​backend/​api-gateway
./​gradlew printEnv

참고: 환경별 실행 방법

로컬 개발 (IDE)

# 1. 인프라 실행
docker-compose up -d

# 2. IDE에서 서비스 실행
# Profile: local
# Gradle이 .env.local 자동 로드

Acceptance 테스트

# 사전 준비: .env.local 필요 (LOCALSTACK_AUTH_TOKEN)
docker-compose -f docker-compose.acceptance.yml up --build

Demo (전체 시스템)

# 사전 준비: .env.local 필요 (LOCALSTACK_AUTH_TOKEN)
docker-compose -f docker-compose.demo.yml up

More DevOps & CI/CD skills

Project scaffolding, deployment configuration, and CI/CD setup for Google ADK agents.

6K 472.6K
View

Set up tracing, logging, and monitoring for deployed ADK agents across Cloud Trace, BigQuery, and third-party platforms.

6K 472.6K
View

Enterprise Azure infrastructure architect generating Bicep or Terraform from workload descriptions.

1.5K 454.3K
View
azure-kubernetes logo
DevOps & CI/CD

azure-kubernetes

Plan and configure production-ready Azure Kubernetes Service clusters with Day-0 and Day-1 best practices.

1.5K 447.1K
View

Raw mechanical interfaces fusing Swiss typographic print with military terminal aesthetics. Rigid grids, extreme type scale contrast, utilitarian color, analog degradation effects. For data-heavy dashboards, portfolios, or editorial sites that need to feel like declassified blueprints.

92.7K 354.9K
View
just-scrape logo
DevOps & CI/CD

just-scrape

Web search, scraping, extraction, crawling, and monitoring via ScrapeGraph AI CLI.

69 245K
View

Skill for working with Firebase Hosting (Classic). Use this when you want to deploy static web apps, Single Page Apps (SPAs), or simple microservices. Do NOT use for Firebase App Hosting.

462 159.7K
View

Deploy and manage web apps with Firebase App Hosting. Use this skill when deploying Next.js/Angular apps with backends.

462 159.1K
View
deploy-to-vercel logo
DevOps & CI/CD

deploy-to-vercel

Deploy applications and websites to Vercel. Use when the user requests deployment actions like "deploy my app", "deploy and give me the link", "push this live", or "create a preview deployment".

31.9K 146.6K
View
programmatic-seo logo
DevOps & CI/CD

programmatic-seo

Build SEO-optimized pages at scale using templates, data, and proven playbook patterns.

53.3K 140.1K
View

Design and build isolated, reusable Convex backend components with clear boundaries and app-facing wrappers.

63 123.5K
View

Deploy and manage projects on Vercel using token-based authentication. Use when working with Vercel CLI using access tokens rather than interactive login — e.g. "deploy to vercel", "set up vercel", "add environment variables to vercel".

31.9K 116.1K
View

Coding & apps AI tools

Opus Clip logo
Coding & apps

Opus Clip

Opus.ai: Revolutionize Your Web Experience

Free
View
Imagica logo
Coding & apps

Imagica

Build a no-code AI app in minutes.

Freemium
View
E
Coding & apps

Emergent.sh

An IDE for code migration from legacy to modern frameworks through coding agents.

Freemium
View
Wonder Dynamics logo
Coding & apps

Wonder Dynamics

Automate CGI animation in live-action scenes

Paid
View
M
Coding & apps

Mixo

Launch a website in seconds with AI.

Paid
View
AI Code Convert logo
Coding & apps

AI Code Convert

Streamline Your Coding Experience with AI Code Helper

Free
View