oguri's garage

Spring Boot 외부 설정 우선순위 정리 본문

개발하다/Spring

Spring Boot 외부 설정 우선순위 정리

oguri 2025. 11. 1. 23:35

우선순위 핵심 개념

커맨드라인 > 환경변수 > 프로파일 설정 > 기본 설정 순서다.
같은 키가 여러 곳에 있으면 우선순위 높은 쪽이 이긴다.

1. 커맨드라인: java -jar app.jar --server.port=9090
2. 환경변수: export SERVER_PORT=9090
3. jar 외부 설정: ./config/application-prod.properties
4. jar 내부 설정: application-prod.properties
5. jar 내부 기본: application.properties




환경변수 명명 규칙

환경변수는 특별한 규칙으로 매핑된다:

server.port              → SERVER_PORT
spring.datasource.url    → SPRING_DATASOURCE_URL
app.my-property          → APP_MY_PROPERTY


규칙: 대문자 변환 + 점(.)을 언더스코어(_)로 + 하이픈(-) 제거






자주 사용하는 설정 패턴

1. 프로파일로 환경 분리

src/main/resources/
├── application.properties        # 공통 설정
├── application-local.properties  # 로컬 개발
├── application-dev.properties    # 개발 서버
└── application-prod.properties   # 운영
# application.properties (공통)
app.name=MyApp
spring.jpa.hibernate.ddl-auto=validate

# application-local.properties
spring.datasource.url=jdbc:h2:mem:testdb
logging.level.root=DEBUG

# application-prod.properties
spring.datasource.url=jdbc:mysql://prod-db:3306/mydb
spring.datasource.password=${DB_PASSWORD}  # 환경변수 주입
logging.level.root=WARN

 

프로파일 활성화:

java -jar myapp.jar --spring.profiles.active=prod



2. 민감 정보는 환경변수로

# ❌ 절대 이렇게 하지 말 것
spring.datasource.password=mySecretPassword

# ✅ 올바른 방법
spring.datasource.password=${DB_PASSWORD}

 

배포 시:

export DB_PASSWORD=mySecretPassword
java -jar myapp.jar --spring.profiles.active=prod



3. jar 외부 설정으로 유연성 확보

배포 디렉토리:

/app
├── config
│   └── application-prod.properties  # 재배포 없이 수정 가능
├── myapp.jar
└── logs

 

설정 우선순위:

  1. ./config/ - 가장 우선
  2. ./
  3. jar 내부 config/
  4. jar 내부 루트

이렇게 하면 jar 재빌드 없이 config 파일만 수정 후 재시작하면 된다.

 

 

 


Docker/Kubernetes 환경

Docker Compose

version: '3'
services:
  app:
    image: myapp:latest
    environment:
      - SPRING_PROFILES_ACTIVE=prod
      - SERVER_PORT=9090
      - SPRING_DATASOURCE_PASSWORD=secret



Kubernetes

apiVersion: v1
kind: Secret
metadata:
  name: app-secret
type: Opaque
stringData:
  database.password: mySecretPassword

---
apiVersion: apps/v1
kind: Deployment
spec:
  template:
    spec:
      containers:
      - name: myapp
        env:
        - name: SPRING_DATASOURCE_PASSWORD
          valueFrom:
            secretKeyRef:
              name: app-secret
              key: database.password
        - name: SPRING_PROFILES_ACTIVE
          value: "prod"

 

 

 

 




긴급 상황 대응

운영 중 급하게 로그 레벨을 올려야 할 때:

# 방법 1: 커맨드라인으로 즉시 오버라이드
kill <PID>
java -jar myapp.jar \
  --spring.profiles.active=prod \
  --logging.level.com.example=DEBUG

# 방법 2: 외부 설정 수정
echo "logging.level.com.example=DEBUG" >> config/application.properties
kill <PID>
java -jar myapp.jar --spring.profiles.active=prod

 

 

 

 




자주 하는 실수

1. 환경변수 이름 오타

# ❌ 잘못된 방법
SPRING.DATASOURCE.URL=jdbc:mysql://db:3306/mydb

# ✅ 올바른 방법
SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/mydb



2. 프로파일 활성화 누락

# ❌ application-prod.properties 적용 안 됨
java -jar myapp.jar

# ✅ 프로파일 명시적 활성화 필요
java -jar myapp.jar --spring.profiles.active=prod



3. 우선순위 착각

jar 내부 설정을 수정했는데 jar 외부에 같은 파일이 있으면 외부가 우선이라 내부 수정은 무시된다.






참고 자료