Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
Tags
- UserLand
- 코엑스그랜드볼룸
- object-creation
- 글또10기
- QueryDSL
- 클라우드아키텍처
- builder-pattern
- 코딩테스트
- 글또
- 3계층 아키텍처
- ReverseNested
- OpenSearch
- DevOps
- 글쓰기세미나
- 포트앤어댑터 아키텍처
- 클린 아키텍처
- static-factory-method
- design-pattern
- HashMap
- constructor
- 프로그래머스
- React
- 레벨1
- 헥사고날 아키텍처
- 가용영역
- 다짐글
- SpringBoot
- 회고
- axios
- Level2
Archives
- Today
- Total
oguri's garage
Spring Boot 외부 설정 우선순위 정리 본문
우선순위 핵심 개념
커맨드라인 > 환경변수 > 프로파일 설정 > 기본 설정 순서다.
같은 키가 여러 곳에 있으면 우선순위 높은 쪽이 이긴다.
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
설정 우선순위:
./config/- 가장 우선./- jar 내부
config/ - 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 외부에 같은 파일이 있으면 외부가 우선이라 내부 수정은 무시된다.
참고 자료
'개발하다 > Spring' 카테고리의 다른 글
| JPA Entity에서 Lombok @EqualsAndHashCode 사용 시 주의사항 (0) | 2025.10.24 |
|---|---|
| Spring DTO 설계 시 기본 생성자만 두는 이유 (0) | 2025.10.22 |
| Spring Data JPA Native Query에서 만난 InvalidDataAccessApiUsageException (0) | 2025.10.21 |
| DB부터 시작하는 JPA Entity 매핑 정리 (0) | 2025.10.20 |
| JPA에서 DISTINCT가 필요한 경우와 필요하지 않은 경우 (0) | 2025.10.18 |