
Docker 컨테이너 환경에서 동작하도록 Spring Boot 설정을 최적화.
Docker Compose로 실행하면 환경 변수가 우선순위가 높음.
우선순위 (높음 → 낮음):
1. docker-compose.yml의 environment ✅ (최우선)
2. .env 파일
3. application-dev.yml
4. application.yml
Spring Boot 시작 시:
1. docker-compose.yml 확인
SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/...
→ 환경 변수 발견 이것을 사용 ✅
2. application-dev.yml 무시됨
spring.datasource.url: jdbc:mysql://localhost:3306/...
→ 환경 변수가 있으므로 무시
spring:
datasource:
url: ${SPRING_DATASOURCE_URL:jdbc:mysql://localhost:3306/...}
# ↑ 환경 변수 우선, 없으면 기본값 사용
이 설정의 장점:
| 항목 | 환경 변수 | 설정 파일 |
|---|---|---|
| 우선순위 | 높음 ✅ | 낮음 |
| 용도 | Docker, K8s 환경 | 로컬 개발 |
| 장점 | 환경별 다른 설정 쉬움 | 코드로 관리 가능 |
| 단점 | 많아지면 관리 복잡 | 하드코딩 위험 |
# application-dev.yml
spring:
datasource:
url: ${SPRING_DATASOURCE_URL:jdbc:mysql://localhost:3306/DevCourse}
# ↑ ↑
# 환경 변수 이름 기본값 (환경 변수 없을 때)
이 방식의 장점:
mysql:3306 주입localhost:3306 사용현재 src/main/resources/application-dev.yml은 이미 올바르게 설정되어 있습니다.
spring:
datasource:
# Docker Compose 환경: mysql 컨테이너 사용
# 로컬 환경: localhost:3306으로 접근
url: ${SPRING_DATASOURCE_URL:jdbc:mysql://localhost:3306/DevCourse?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Seoul&allowPublicKeyRetrieval=true}
username: ${SPRING_DATASOURCE_USERNAME:root}
password: ${SPRING_DATASOURCE_PASSWORD:lldj123414}
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: ${SPRING_JPA_HIBERNATE_DDL_AUTO:update}
properties:
hibernate:
dialect: org.hibernate.dialect.MySQLDialect
format_sql: true
show-sql: ${SPRING_JPA_SHOW_SQL:true}
# Redis 설정
data:
redis:
host: ${SPRING_DATA_REDIS_HOST:localhost}
port: ${SPRING_DATA_REDIS_PORT:6379}
확인 포인트:
Actuator는 Spring Boot 애플리케이션의 헬스체크, 메트릭, 모니터링을 제공.
Docker Healthcheck → /actuator/health 호출
Prometheus → /actuator/prometheus 메트릭 수집
application.yml에 이미 설정되어 있는지 확인:
management:
endpoints:
web:
exposure:
include: health,info,prometheus
endpoint:
health:
show-details: always
만약 없다면 추가 필요합니다.
management:
endpoints:
web:
exposure:
include: health,info,prometheus,metrics
base-path: /actuator
endpoint:
health:
show-details: always
show-components: always
metrics:
export:
prometheus:
enabled: true
설정 설명:
| 설정 | 역할 |
|---|---|
include: health,info,prometheus,metrics | 노출할 엔드포인트 목록 |
show-details: always | 헬스체크 상세 정보 표시 |
prometheus.enabled: true | Prometheus 메트릭 수집 활성화 |
# 헬스체크
curl http://localhost:8080/actuator/health
# 출력 예시:
{
"status": "UP",
"components": {
"db": {
"status": "UP",
"details": {
"database": "MySQL",
"validationQuery": "isValid()"
}
},
"redis": {
"status": "UP",
"details": {
"version": "7.2.4"
}
}
}
}
# Prometheus 메트릭
curl http://localhost:8080/actuator/prometheus | head -20
# 출력 예시:
# HELP jvm_memory_used_bytes The amount of used memory
# TYPE jvm_memory_used_bytes gauge
jvm_memory_used_bytes{area="heap",id="G1 Eden Space",} 1.2345678E8
...
Docker 컨테이너 환경에서는 로그를 표준 출력(stdout)으로 보내야 docker-compose logs로 확인 가능.
src/main/resources/logback-spring.xml 파일 확인:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 콘솔 출력 (Docker 환경) -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 루트 로거 -->
<root level="INFO">
<appender-ref ref="CONSOLE" />
</root>
<!-- 애플리케이션 로거 -->
<logger name="com.back" level="DEBUG" />
<logger name="org.springframework.web" level="DEBUG" />
</configuration>
확인 포인트:
개발 환경에서 로그 가독성 향상:
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %highlight(%-5level) [%thread] %cyan(%logger{36}) - %msg%n</pattern>
</encoder>
</appender>
Docker 로그에서 확인:
docker-compose logs -f app
# 출력 예시:
2026-01-28 10:30:45 INFO [main] c.b.DevCource2Application - Starting...
2026-01-28 10:30:46 DEBUG [main] c.b.d.a.service.AuctionService - 경매 조회 - ID: 1
경매 이미지를 컨테이너 내부 Volume에 저장해야 데이터가 유지.
application.yml에 파일 업로드 경로 설정:
# 파일 업로드 설정
file:
upload:
dir: ${FILE_UPLOAD_DIR:/app/uploads}
환경별 경로:
| 환경 | 경로 |
|---|---|
| Docker 컨테이너 | /app/uploads (Volume 마운트됨) |
| 로컬 개발 | ./uploads (프로젝트 루트) |
services:
app:
volumes:
- uploads-data:/app/uploads # ← 이 설정이 중요!
동작 방식:
┌─────────────────────────────────┐
│ auction-app 컨테이너 │
│ /app/uploads │
└─────────┬───────────────────────┘
│ Volume 마운트
↓
┌─────────────────────────────────┐
│ Docker Volume: uploads-data │
│ - 컨테이너 삭제해도 유지 ✅ │
│ - 호스트에서도 접근 가능 │
└─────────────────────────────────┘
# Spring Boot 컨테이너 환경 변수 확인
docker exec auction-app env | grep SPRING
# 출력 예시:
SPRING_PROFILES_ACTIVE=dev
SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/DevCourse...
SPRING_DATASOURCE_USERNAME=root
SPRING_DATASOURCE_PASSWORD=lldj123414
SPRING_DATA_REDIS_HOST=redis
SPRING_DATA_REDIS_PORT=6379
# Spring Boot 로그에서 Hikari 연결 확인
docker-compose logs app | grep -i hikari
# 출력 예시:
HikariPool-1 - Starting...
HikariPool-1 - Added connection conn0: url=jdbc:mysql://mysql:3306/DevCourse
# Spring Boot 로그에서 Redis 연결 확인
docker-compose logs app | grep -i redis
# 출력 예시:
Lettuce ConnectionFactory initialized
# 헬스체크
curl http://localhost:8080/actuator/health
# 메트릭
curl http://localhost:8080/actuator/prometheus | head -10
# 컨테이너 내부 디렉토리 확인
docker exec auction-app ls -la /app/uploads
# 출력 예시:
drwxr-xr-x 2 spring spring 4096 Jan 28 10:00 .
drwxr-xr-x 3 spring spring 4096 Jan 28 10:00 ..
1. docker-compose.yml의 environment (최우선)
2. .env 파일
3. application-dev.yml (기본값)
4. application.yml (전역 설정)
| 환경 | MySQL 연결 | Redis 연결 | 파일 업로드 |
|---|---|---|---|
| Docker Compose | mysql:3306 | redis:6379 | /app/uploads |
| IntelliJ 로컬 | localhost:3306 | localhost:6379 | ./uploads |