Spring Boot 서비스가 “프로세스는 살아 있지만 요청을 처리하지 못하는 상태”가 되면 단순 포트 체크만으로는 장애를 찾기 어렵습니다. Actuator는 Health, Metrics, Loggers, Thread Dump 등 운영 정보를 표준 Endpoint로 제공합니다.
하지만 /actuator/**를 전부 외부에 공개하면 환경 설정, 매핑, Heap Dump 같은 민감 정보가 노출될 수 있습니다. 운영의 핵심은 많이 여는 것이 아니라 필요한 Endpoint만 노출하고 네트워크와 인증으로 보호하는 것입니다.
핵심 요약
- Actuator는 spring-boot-starter-actuator로 활성화합니다.
- 기본 HTTP 노출은 제한적이며 필요한 Endpoint만 명시적으로 추가합니다.
- Liveness는 재시작이 필요한 상태, Readiness는 트래픽 수신 가능 상태를 판단합니다.
- Prometheus Endpoint는 Micrometer Registry 의존성과 노출 설정이 필요합니다.
- env, configprops, heapdump, loggers는 공개 범위를 특히 주의합니다.
1. 의존성과 기본 설정
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-actuator'
runtimeOnly 'io.micrometer:micrometer-registry-prometheus'
}
management:
endpoints:
web:
exposure:
include: health,info,prometheus
endpoint:
health:
show-details: when_authorized
probes:
enabled: true
Spring Boot 버전에 따라 속성명과 기본 동작이 달라질 수 있으므로 사용하는 버전의 Reference를 확인합니다. YAML에서 *는 특별한 의미가 있으므로 전체 노출 시에도 따옴표가 필요하지만, 운영에서는 전체 노출을 기본값으로 삼지 않는 편이 안전합니다.
2. Liveness와 Readiness를 분리하라
Probe질문실패 시
| Liveness | 애플리케이션이 복구 불가능하게 멈췄나 | 컨테이너 재시작 |
| Readiness | 현재 요청을 받을 준비가 됐나 | Service Endpoint에서 제외 |
| Startup | 초기 기동이 아직 진행 중인가 | 기동 완료까지 다른 Probe 지연 |
DB가 잠시 느리다고 Liveness까지 실패시키면 모든 Pod가 재시작되어 장애가 커질 수 있습니다. 외부 의존성은 보통 Readiness에 반영하고, Liveness에는 애플리케이션 자체가 교착·고장 난 경우만 포함합니다.
3. Prometheus 연동
scrape_configs:
- job_name: spring-app
metrics_path: /actuator/prometheus
static_configs:
- targets: ['app:8080']
Micrometer는 JVM, HTTP Server, Connection Pool 등 다양한 Meter를 제공합니다. 알림은 단일 순간값보다 Rate와 분위수를 활용합니다.
- HTTP 요청 수, 오류율, P95·P99 지연시간
- JVM Heap 사용률과 GC Pause
- Tomcat/Netty Thread와 Queue
- DB Connection Pool Active·Pending
- 업무 지표: 주문 실패, 메시지 지연, 재시도 수
4. 보안 설정 원칙
- Management Port를 서비스 포트와 분리하고 내부 네트워크에만 바인딩합니다.
- Ingress·Load Balancer에서 Actuator 경로를 공용으로 노출하지 않습니다.
- Spring Security의 별도 SecurityFilterChain으로 역할 기반 접근을 설정합니다.
- Health 상세 정보는 인증된 운영자에게만 보여줍니다.
- Heap Dump와 Logfile은 개인정보·토큰 포함 가능성을 고려해 별도 절차로 수집합니다.
사용자가 직접 SecurityFilterChain Bean을 정의하면 Actuator 보안 Auto-configuration이 물러날 수 있습니다. Actuator용 Chain과 애플리케이션용 Chain을 모두 명시적으로 검토해야 합니다.
5. Custom Metric 예시
@Component
class OrderMetrics(private val registry: MeterRegistry) {
fun recordFailure(reason: String) {
registry.counter("orders.failed", "reason", reason).increment()
}
}
태그 값에 고객 ID, 주문 번호, URL 전체처럼 종류가 계속 늘어나는 값을 넣으면 Cardinality가 폭증합니다. 태그는 상태 코드, 고정된 오류 유형, 기능명처럼 제한된 집합으로 설계합니다.
6. 운영 체크리스트
- health, info, prometheus만 기본 노출합니다.
- Probe의 Timeout·Failure Threshold를 실제 기동·응답시간에 맞춥니다.
- Actuator 접근 로그와 실패 인증을 모니터링합니다.
- 알림에는 증상, 영향, 확인 대시보드, Runbook 링크를 포함합니다.
- 배포 전 인증 없이 민감 Endpoint에 접근할 수 없는지 테스트합니다.
공식 자료
정리: Actuator는 단순한 Health URL이 아니라 운영 관측의 입구입니다. Liveness와 Readiness를 분리하고, 필요한 지표만 인증된 내부 경로에 노출해야 모니터링과 보안을 함께 만족할 수 있습니다.
'Java & Spring 실전 개발' 카테고리의 다른 글
| Spring Boot Redis 캐시 적용 전 반드시 확인할 체크리스트: 장애를 막는 운영 기준 (0) | 2026.07.15 |
|---|---|
| 5편. 실전 운영 장애 사례 10선 + 장애 복구 플레이북 (0) | 2025.12.01 |
| 4편. DB 성능 모니터링 집중 분석 + 실제로 효과가 컸던 SQL 튜닝 사례 (0) | 2025.12.01 |
| 3편. ThreadPool & Tomcat 튜닝 — 트래픽 폭주 시 서버가 버티지 못하는 진짜 이유 (0) | 2025.12.01 |
| 2편. Jackson 직렬화 튜닝 — CPU를 가장 많이 잡아먹는 숨은 병목 해결기 (0) | 2025.12.01 |