Spring Boot Actuator
1. 개요
1. 개요
Spring Boot Actuator는 Spring Boot 기반의 애플리케이션을 위한 프로덕션 준비 기능을 제공하는 서브 프로젝트이다. 개발사는 VMware Spring이며, 주된 분야는 애플리케이션 모니터링 및 관리이다. 이는 애플리케이션의 상태, 성능 메트릭, 구성 정보 등을 외부에서 쉽게 확인하고 관리할 수 있도록 표준화된 방법을 제공한다.
주요 용도는 Spring Boot 애플리케이션의 상태, 메트릭, 상태 점검, 환경 정보 등을 HTTP 엔드포인트 또는 JMX를 통해 노출하는 것이다. 이를 통해 운영팀은 애플리케이션의 헬스 체크, 성능 모니터링, 로그 레벨 동적 변경 등의 운영 작업을 수행할 수 있다. 관련 기술로는 Spring Boot 프레임워크 자체와 JMX, 그리고 메트릭 수집을 위한 Micrometer가 있다.
Actuator를 활성화하는 방법은 프로젝트에 의존성을 추가한 후, 'management.endpoints.web.exposure.include' 속성을 사용하여 웹을 통해 노출할 구체적인 엔드포인트를 지정하는 것이다. 이는 보안을 고려하여 기본적으로 민감한 정보를 포함할 수 있는 엔드포인트를 선택적으로 공개할 수 있게 해준다. 결과적으로, 마이크로서비스 아키텍처나 클라우드 네이티브 환경에서 애플리케이션의 가시성과 운영성을 크게 향상시키는 핵심 도구로 자리 잡았다.
2. 주요 기능
2. 주요 기능
2.1. 헬스 체크
2.1. 헬스 체크
헬스 체크는 애플리케이션의 현재 상태와 주요 외부 서비스에 대한 연결 상태를 점검하는 기능이다. /actuator/health 엔드포인트를 통해 접근할 수 있으며, 애플리케이션이 정상적으로 요청을 처리할 수 있는지 여부를 간략하게 나타내는 UP, DOWN, OUT_OF_SERVICE 등의 상태를 반환한다. 이는 로드 밸런서나 오케스트레이션 도구가 애플리케이션 인스턴스의 라우팅 여부를 결정하는 데 활용될 수 있다.
기본적으로 데이터베이스, 디스크 공간, 메일 서버 등 여러 구성 요소의 상태를 자동으로 점검하는 내장 헬스 인디케이터를 제공한다. 예를 들어, JDBC나 JPA를 사용하는 경우 관련 데이터 소스의 연결 상태를 확인하며, Redis나 MongoDB 같은 NoSQL 데이터베이스에 대한 의존성이 있다면 해당 클라이언트의 건강 상태도 점검한다.
헬스 체크의 상세 정보 노출 여부는 management.endpoint.health.show-details 속성으로 제어할 수 있다. 기본값은 never로, 간략한 상태만 표시되지만, 설정을 변경하면 각 헬스 인디케이터의 구체적인 상태와 오류 메시지를 확인할 수 있어 문제 진단에 도움이 된다. 또한, 비즈니스 로직에 맞는 커스텀 헬스 인디케이터를 구현하여 특정 서비스나 API의 가용성을 점검하는 지표를 추가할 수도 있다.
2.2. 메트릭 수집
2.2. 메트릭 수집
Spring Boot Actuator는 애플리케이션의 성능과 상태를 수치화하여 제공하는 메트릭 수집 기능을 제공한다. 이 기능은 주로 마이크로미터(Micrometer) 라이브러리를 기반으로 동작하며, JVM 사용량, 시스템 리소스, 데이터베이스 연결 풀 상태, HTTP 요청 처리량 및 지연 시간 등 광범위한 메트릭을 자동으로 수집한다. 수집된 메트릭은 /actuator/metrics 엔드포인트를 통해 확인할 수 있으며, 각 메트릭의 세부 정보를 조회하는 데 활용된다.
메트릭은 다양한 모니터링 도구와의 연동을 지원한다. 마이크로미터는 프로메테우스(Prometheus), 그라파나(Grafana), 뉴렐릭(New Relic), 데이터독(Datadog)과 같은 외부 모니터링 시스템에 메트릭을 게시하기 위한 추상화 계층을 제공한다. 예를 들어, micrometer-registry-prometheus 의존성을 추가하면 /actuator/prometheus 엔드포인트가 활성화되어 프로메테우스가 직접 스크랩할 수 있는 형식으로 메트릭을 노출한다.
애플리케이션은 다음과 같은 핵심 메트릭을 기본으로 제공한다.
메트릭 카테고리 | 주요 내용 |
|---|---|
JVM 메트릭 | |
시스템 메트릭 | |
애플리케이션 메트릭 | HTTP 요청 수, 처리 지연 시간, 에러율 |
캐시 메트릭 | 캐시 적중률 및 미스율 |
데이터베이스 메트릭 | 커넥션 풀 활성/대기 연결 수 |
또한, 개발자는 비즈니스 로직에 맞는 커스텀 메트릭을 쉽게 생성하고 등록할 수 있다. 이를 통해 특정 서비스 메서드의 실행 횟수나 사용자 정의 게이지(Gauge), 카운터(Counter), 타이머(Timer)를 구현하여 애플리케이션의 특정 동작을 모니터링할 수 있다. 이러한 메트릭 수집 기능은 클라우드 환경과 컨테이너 기반 배포에서 애플리케이션의 운영 상태를 지속적으로 관찰하고 성능 문제를 조기에 발견하는 데 필수적이다.
2.3. 환경 정보
2.3. 환경 정보
Spring Boot Actuator의 /env 엔드포인트는 애플리케이션이 실행되는 환경에 대한 상세한 정보를 제공한다. 이는 애플리케이션의 구성 상태를 진단하고 문제를 해결하는 데 필수적인 도구이다.
이 엔드포인트는 애플리케이션의 모든 구성 속성 소스를 계층 구조로 보여준다. 여기에는 운영 체제 환경 변수, 자바 가상 머신 시스템 속성, 애플리케이션의 application.properties 또는 application.yml 파일에 정의된 설정, 그리고 실행 시 명령줄 인수로 전달된 속성 등이 포함된다. 각 속성의 실제 적용된 값과 그 값이 로드된 소스를 명확히 표시함으로써, 설정 충돌이나 예상치 못한 값의 원인을 빠르게 추적할 수 있게 한다.
또한 /env 엔드포인트는 환경 정보를 동적으로 수정하는 데에도 사용될 수 있다. POST 요청을 통해 특정 속성의 값을 일시적으로 변경할 수 있으며, 이 변경 사항은 /refresh 엔드포인트를 호출하기 전까지 유지된다. 이 기능은 마이크로서비스 환경에서 구성 서버를 사용하지 않을 때, 특정 인스턴스의 설정을 긴급하게 조정해야 하는 경우에 유용하다. 다만, 프로덕션 환경에서는 보안을 위해 이 기능에 대한 접근을 엄격히 제한해야 한다.
환경 정보는 JMX를 통해서도 조회가 가능하며, 스프링 클라우드 컨피그와 같은 외부 구성 관리 서버를 사용할 경우, 해당 서버에서 가져온 속성들도 함께 표시된다. 이를 통해 개발 및 운영 팀은 애플리케이션의 전반적인 구성 상태를 한눈에 파악하고, 효율적으로 관리할 수 있다.
2.4. 로그 관리
2.4. 로그 관리
Spring Boot Actuator는 애플리케이션의 로깅 상태를 실시간으로 확인하고 관리할 수 있는 기능을 제공한다. 이를 통해 운영 중인 서비스의 로그 레벨을 동적으로 변경하거나, 현재 로거 구성을 조회할 수 있어 문제 발생 시 신속한 대응이 가능하다.
주요 기능은 /loggers 엔드포인트를 통해 제공된다. 이 엔드포인트에 HTTP GET 요청을 보내면 애플리케이션에 구성된 모든 로거와 그들의 현재 로그 레벨(예: ERROR, WARN, INFO, DEBUG, TRACE)을 확인할 수 있다. 또한 특정 로거의 레벨을 런타임에 변경하려면 해당 엔드포인트에 POST 요청과 함께 새로운 레벨 정보를 JSON 형식의 본문으로 전송하면 된다. 이는 프로덕션 환경에서 디버깅을 위해 특정 패키지의 로그 출력을 일시적으로 상세하게 조정할 때 유용하다.
HTTP 메서드 | 경로 | 설명 |
|---|---|---|
GET |
| 구성된 모든 로거의 목록과 레벨 조회 |
GET |
| 특정 로거의 구성 상세 조회 |
POST |
| 특정 로거의 레벨 동적 변경 |
이러한 로그 관리 기능은 JMX를 통해서도 이용 가능하다. 기본적으로 loggers 엔드포인트는 노출 목록에 포함되어 있지 않으므로, application.properties 또는 application.yml 설정 파일에서 management.endpoints.web.exposure.include 속성에 loggers를 추가하여 활성화해야 한다. 보안을 위해 이 엔드포인트에 대한 접근은 인증과 권한 부여 설정을 통해 제한하는 것이 권장된다.
2.5. 애플리케이션 정보
2.5. 애플리케이션 정보
/info 엔드포인트는 Spring Boot Actuator가 제공하는 애플리케이션의 자체 정보를 노출하는 기능이다. 이 엔드포인트는 애플리케이션의 버전, 빌드 정보, 최근 커밋 세부사항, 또는 운영 환경에서 필요한 임의의 정보를 표시하는 데 사용된다. 기본적으로는 빈 응답을 반환하지만, 다양한 소스로부터 정보를 수집하여 구성할 수 있다.
애플리케이션 정보는 주로 application.properties 또는 application.yml 파일에서 info.* 접두사를 가진 속성들을 설정하여 추가한다. 예를 들어, 애플리케이션 이름과 버전을 명시적으로 정의할 수 있다. 또한, Maven 또는 Gradle 빌드 도구를 사용하는 경우, 프로젝트의 pom.xml이나 build.gradle 파일에 정의된 정보를 자동으로 가져와 /info 엔드포인트에 노출하도록 구성하는 것도 가능하다.
보다 고급 구성으로는 InfoContributor 인터페이스를 구현하여 커스텀 정보 기여자를 작성할 수 있다. 이를 통해 환경 변수, 시스템 속성, 또는 외부 설정 서버로부터 동적으로 정보를 조회하고 가공하여 info 엔드포인트의 응답에 포함시킬 수 있다. 이는 애플리케이션의 배포 환경이나 특정 프로파일에 따른 정보를 노출할 때 유용하다.
/info 엔드포인트는 기본적으로 민감하지 않은 엔드포인트로 분류되며, 다른 액추에이터 엔드포인트와 마찬가지로 management.endpoints.web.exposure.include 속성을 통해 노출을 활성화해야 한다. 이 정보는 모니터링 대시보드에 애플리케이션의 정체성을 표시하거나, 여러 서비스가 운영 중인 마이크로서비스 환경에서 각 인스턴스를 식별하는 데 활용될 수 있다.
3. 엔드포인트
3. 엔드포인트
3.1. 내장 엔드포인트
3.1. 내장 엔드포인트
Spring Boot Actuator는 애플리케이션의 다양한 운영 정보를 제공하기 위해 여러 내장 엔드포인트를 제공한다. 이러한 엔드포인트는 HTTP 요청이나 JMX를 통해 접근할 수 있으며, 각각 특정한 종류의 정보를 노출한다. 기본적으로 /actuator 경로 아래에 위치하며, management.endpoints.web.exposure.include 속성을 사용하여 웹에 노출할 엔드포인트를 선택적으로 구성할 수 있다.
주요 내장 엔드포인트로는 애플리케이션의 전반적인 건강 상태를 보여주는 /health, 메모리 사용량이나 HTTP 요청 수와 같은 다양한 메트릭을 제공하는 /metrics, 애플리케이션이 사용 중인 구성 속성들을 확인할 수 있는 /env, 그리고 설정된 로그 레벨을 동적으로 변경할 수 있는 /loggers 등이 있다. 또한 애플리케이션의 빌드 정보나 Git 커밋 정보를 담은 /info 엔드포인트와, 현재 애플리케이션에 정의된 모든 HTTP 엔드포인트 목록을 보여주는 /mappings도 유용하게 사용된다.
일부 엔드포인트는 애플리케이션의 내부 상태를 변경하거나 민감한 정보를 포함할 수 있어 주의가 필요하다. 예를 들어, 애플리케이션을 정상적으로 종료시키는 /shutdown 엔드포인트나, 실행 중인 스레드 덤프를 보여주는 /threaddump, 최근 발생한 오류 정보를 확인하는 /httptrace 등이 이에 해당한다. 이러한 엔드포인트들은 기본적으로 웹에 노출되지 않으며, 프로덕션 환경에서는 보안 설정을 통해 접근을 엄격히 제한해야 한다.
내장 엔드포인트의 목록과 각 엔드포인트의 기본 활성화 여부, 접근 경로는 Spring Boot 버전에 따라 다를 수 있다. 개발자는 공식 문서를 참조하여 필요한 엔드포인트만 선택적으로 노출하고, 보안 및 네트워크 구성을 통해 외부 접근을 통제하는 것이 바람직하다.
3.2. 엔드포인트 구성
3.2. 엔드포인트 구성
Spring Boot Actuator의 엔드포인트 구성은 애플리케이션의 application.properties 또는 application.yml 파일을 통해 관리한다. 기본적으로 보안을 위해 대부분의 엔드포인트는 비활성화되어 있으며, 개발자가 명시적으로 노출시켜야 사용할 수 있다. 주로 management.endpoints.web.exposure.include 속성을 사용하여 웹을 통해 노출할 엔드포인트 목록을 지정하며, health와 info 엔드포인트만이 기본적으로 노출된다.
노출 범위를 세밀하게 제어하기 위해 include와 exclude 속성을 함께 사용할 수 있다. 예를 들어, 모든 엔드포인트를 노출한 후 특정 엔드포인트만 제외하거나, 특정 엔드포인트만 선택적으로 노출하는 구성이 가능하다. 또한, 각 엔드포인트의 세부 동작은 management.endpoint.<엔드포인트-이름> 접두사를 가진 속성으로 개별적으로 구성할 수 있다. 이를 통해 특정 엔드포인트의 활성화 여부, 캐시 유지 시간, 표시할 세부 정보의 수준 등을 조정할 수 있다.
구성 속성 예시 | 설명 | 기본값 예시 |
|---|---|---|
| 웹에 노출할 엔드포인트 목록 지정 |
|
| 웹에서 제외할 엔드포인트 목록 지정 | (없음) |
|
|
|
| 헬스 상세 정보 노출 정책 ( |
|
| 모든 액추에이터 엔드포인트의 기본 경로 |
|
| 특정 엔드포인트의 경로를 재매핑 | (없음) |
이러한 구성은 프로파일별로 다르게 설정할 수 있어, 개발 환경에서는 상세 정보를 모두 노출하고 프로덕션 환경에서는 최소한의 정보만 노출하는 등의 운영이 용이하다. JMX를 통한 노출은 management.endpoints.jmx.exposure 속성으로 별도로 관리된다.
3.3. 보안 설정
3.3. 보안 설정
Spring Boot Actuator의 엔드포인트는 애플리케이션의 내부 상태와 민감한 정보를 노출할 수 있으므로, 보안 설정은 매우 중요하다. 기본적으로 /actuator 경로를 제외한 대부분의 엔드포인트는 보안이 적용되지 않은 상태로 노출된다. 따라서 프로덕션 환경에서는 반드시 인증 및 권한 부여를 구성하거나, 노출되는 엔드포인트를 제한해야 한다.
주요 보안 설정 방법은 다음과 같다. 첫째, application.properties 또는 application.yml 파일을 사용하여 노출할 엔드포인트를 명시적으로 지정한다. management.endpoints.web.exposure.include 속성에 허용할 엔드포인트 이름(예: health, info)을 나열하고, management.endpoints.web.exposure.exclude 속성으로 제외할 엔드포인트를 설정할 수 있다. 둘째, Spring Security 의존성을 추가하여 엔드포인트 접근에 대한 세밀한 제어를 구현한다. 이를 통해 특정 역할(Role)을 가진 사용자만 특정 엔드포인트에 접근하도록 설정할 수 있다.
또한, 민감한 엔드포인트의 기본 경로를 변경하여 정보 노출을 최소화할 수 있다. management.endpoints.web.base-path 속성을 사용하여 /actuator 대신 다른 경로를 설정할 수 있다. 중요한 점은 env, beans, configprops와 같은 상세한 구성 정보를 노출하는 엔드포인트는 프로덕션에서 노출하지 않거나, 매우 제한된 접근 권한으로 설정해야 한다는 것이다.
4. 설정 및 사용법
4. 설정 및 사용법
4.1. 의존성 추가
4.1. 의존성 추가
Spring Boot Actuator를 사용하기 위해서는 프로젝트에 해당 의존성을 추가해야 한다. Spring Boot 프로젝트의 빌드 도구에 따라 Maven이나 Gradle을 통해 간단히 추가할 수 있다.
Maven을 사용하는 경우 프로젝트의 pom.xml 파일에 spring-boot-starter-actuator 의존성을 추가한다. 이 의존성은 애플리케이션에 다양한 모니터링 및 관리 엔드포인트를 자동으로 구성한다. Gradle을 사용한다면 build.gradle 파일의 의존성 블록에 동일한 이름의 의존성을 선언하면 된다.
의존성을 추가하고 애플리케이션을 실행하면 기본적으로 /actuator/health와 /actuator/info를 포함한 일부 엔드포인트만 HTTP를 통해 노출된다. 모든 엔드포인트를 활성화하려면 application.properties 또는 application.yml 설정 파일에서 management.endpoints.web.exposure.include 속성에 * 값을 지정해야 한다. 또한 JMX를 통한 노출은 별도의 설정 없이 기본적으로 활성화된다.
Actuator의 고급 기능을 활용하려면 추가적인 의존성이 필요할 수 있다. 예를 들어, 상세한 메트릭 수집과 다양한 모니터링 시스템(Prometheus, Datadog 등)으로의 내보내기를 위해서는 Micrometer 관련 의존성을 함께 추가하는 것이 일반적이다.
4.2. 기본 설정
4.2. 기본 설정
Spring Boot Actuator를 사용하기 위한 기본 설정은 매우 간단하다. 의존성을 프로젝트에 추가한 후, 몇 가지 핵심 설정 속성을 통해 동작을 제어할 수 있다.
가장 중요한 설정은 노출할 엔드포인트를 선택하는 것이다. 기본적으로 health와 info 엔드포인트만 웹을 통해 노출되며, 다른 엔드포인트를 사용하려면 명시적으로 허용해야 한다. 이는 application.properties 또는 application.yml 파일에서 management.endpoints.web.exposure.include 속성에 원하는 엔드포인트 이름을 나열하여 구성한다. 예를 들어, health, info, metrics, env를 모두 노출하려면 management.endpoints.web.exposure.include=health,info,metrics,env와 같이 설정한다. 반대로 특정 엔드포인트만 제외하려면 management.endpoints.web.exposure.exclude 속성을 사용할 수 있다.
또한, JMX를 통한 엔드포인트 노출 여부나, HTTP 요청의 기본 경로(/actuator) 변경, 각 엔드포인트별 상세 설정도 가능하다. 예를 들어, health 엔드포인트에 시스템 구성 세부 정보를 표시하려면 management.endpoint.health.show-details=always로 설정한다. 이러한 설정들은 개발, 테스트, 프로덕션 환경에 따라 다르게 적용하여, 운영 환경에서는 민감한 정보가 노출되지 않도록 주의해야 한다.
설정 항목 | 예시 값 | 설명 |
|---|---|---|
|
| 모든 웹 엔드포인트 노출 (비추천) |
|
| 지정된 엔드포인트만 노출 |
|
| 액추에이터 HTTP 경로를 |
|
| 헬스 체크 상세 정보 항상 표시 |
4.3. 커스텀 엔드포인트
4.3. 커스텀 엔드포인트
Spring Boot Actuator는 기본적으로 제공하는 내장 엔드포인트 외에도 개발자가 직접 정의한 커스텀 엔드포인트를 생성할 수 있는 기능을 제공한다. 이를 통해 애플리케이션의 특정 상태나 비즈니스 로직에 기반한 모니터링 지점을 추가할 수 있다.
커스텀 엔드포인트를 생성하려면 @Endpoint 어노테이션을 클래스에 선언하고, @ReadOperation, @WriteOperation, @DeleteOperation 어노테이션을 메서드에 사용하여 각각의 HTTP 요청 메서드(GET, POST, DELETE)에 매핑할 수 있다. 엔드포인트의 ID는 @Endpoint 어노테이션의 id 속성으로 지정하며, 이 ID를 통해 노출 설정 및 접근 경로가 결정된다. 예를 들어, @Endpoint(id = "custom")으로 정의된 엔드포인트는 기본적으로 /actuator/custom 경로로 노출된다.
커스텀 엔드포인트의 반환 데이터는 JSON 형식으로 자동 직렬화되며, 메서드에서 반환하는 객체의 구조가 그대로 노출된다. 또한, @Selector 어노테이션을 사용하면 경로 변수를 받아 처리하는 동적 엔드포인트를 구현할 수 있어, 특정 리소스의 상태를 조회하는 데 유용하게 활용된다. 이러한 커스텀 엔드포인트도 내장 엔드포인트와 마찬가지로 management.endpoints.web.exposure.include 설정을 통해 웹에 노출시켜야 접근이 가능하다.
커스텀 엔드포인트는 애플리케이션의 핵심 비즈니스 상태(예: 특정 큐의 길이, 외부 API 연결 상태, 캐시 적중률 등)를 모니터링하거나, 운영 중에 특정 기능을 제어하는 관리용 인터페이스를 제공하는 데 주로 사용된다. 이를 통해 표준화된 액추에이터 프레임워크 내에서 애플리케이션 고유의 운영 요구사항을 충족시킬 수 있다.
5. 모니터링 및 운영
5. 모니터링 및 운영
5.1. 헬스 인디케이터
5.1. 헬스 인디케이터
헬스 인디케이터는 Spring Boot Actuator가 제공하는 /health 엔드포인트를 통해 애플리케이션의 전반적인 상태를 점검하는 구성 요소이다. 이는 데이터베이스, 디스크 공간, 메시지 큐 연결 상태와 같은 외부 시스템이나 내부 리소스의 가용성을 확인하는 역할을 한다. 기본적으로 /health 엔드포인트는 애플리케이션의 상태를 간략하게 UP, DOWN, OUT_OF_SERVICE, UNKNOWN 중 하나로 요약하여 반환한다.
Actuator는 다양한 상황에 대비해 여러 내장 헬스 인디케이터를 제공한다. 예를 들어, JDBC 데이터 소스를 사용하면 DataSourceHealthIndicator가 자동 구성되어 데이터베이스 연결 상태를 점검한다. Redis, MongoDB, RabbitMQ와 같은 기술 스택을 사용할 때도 해당하는 인디케이터가 활성화된다. 이러한 인디케이터들은 애플리케이션의 상태를 종합하여 최종 헬스 상태를 결정한다.
개발자는 비즈니스 로직에 맞는 커스텀 헬스 인디케이터를 쉽게 구현할 수 있다. HealthIndicator 인터페이스를 구현하거나 AbstractHealthIndicator 클래스를 상속받아 health() 메서드를 재정의하면 된다. 이를 통해 특정 외부 API 호출 상태, 내부 캐시 서버 상태, 또는 중요한 파일 시스템 경로의 여유 공간 등을 점검하는 로직을 추가할 수 있다.
헬스 체크의 상세 정보 노출은 management.endpoint.health.show-details 속성으로 제어할 수 있다. 이 값을 always 또는 when-authorized로 설정하면, 각 인디케이터의 세부 상태와 메시지를 확인할 수 있어 문제 진단에 유용하다. 이러한 기능은 쿠버네티스의 라이브니스 프로브 및 레디니스 프로브 설정이나 로드 밸런서의 헬스 체크와 연동하여 클라우드 네이티브 환경에서 애플리케이션의 신뢰성을 높이는 데 기여한다.
5.2. 메트릭 수집 도구 연동
5.2. 메트릭 수집 도구 연동
Spring Boot Actuator는 애플리케이션의 성능과 상태를 지속적으로 모니터링하기 위해 다양한 메트릭을 수집하고, 이를 외부 모니터링 시스템과 연동할 수 있는 기능을 제공한다. 이 연동의 핵심에는 마이크로미터(Micrometer)라는 애플리케이션 메트릭 파사드(Facade) 라이브러리가 있다. 마이크로미터는 스프링 부트 Actuator에 기본적으로 통합되어 있으며, JVM 메모리 사용량, CPU 사용률, 가비지 컬렉션, HTTP 요청 수 및 지연 시간 등 광범위한 메트릭을 표준화된 방식으로 노출한다.
이렇게 수집된 메트릭 데이터는 프로메테우스(Prometheus), 그라파나(Grafana), 뉴렐릭(New Relic), 데이터독(Datadog), 인플럭스DB(InfluxDB)와 같은 전문 모니터링 및 시각화 도구로 손쉽게 전송할 수 있다. 예를 들어, 프로메테우스와 연동하려면 micrometer-registry-prometheus 의존성을 추가하기만 하면 Actuator는 자동으로 /actuator/prometheus 엔드포인트를 제공하여 프로메테우스가 풀(Pull) 방식으로 메트릭을 수집할 수 있는 형식으로 데이터를 노출한다.
연동 설정은 주로 application.properties 또는 application.yml 파일을 통해 이루어진다. 여기서는 특정 메트릭 레지스트리의 상세 구성, 메트릭 수집 빈도, 태그 지정 등을 커스터마이징할 수 있다. 또한, 마이크로서비스 아키텍처 환경에서는 분산 추적 시스템인 집킨(Zipkin)이나 Jaeger와의 연동을 위해 spring-boot-starter-actuator와 함께 micrometer-tracing 의존성을 활용할 수 있다. 이를 통해 여러 서비스에 걸친 요청의 흐름과 지연 시간을 분석하는 분산 추적(Distributed Tracing) 기능도 구현 가능하다.
5.3. 프로덕션 환경 고려사항
5.3. 프로덕션 환경 고려사항
Spring Boot Actuator를 프로덕션 환경에서 사용할 때는 보안과 노출되는 정보의 민감도를 고려한 구성이 필수적이다. 기본적으로 모든 엔드포인트가 외부에 노출되도록 설정되어 있지 않으며, 개발자는 management.endpoints.web.exposure.include 속성을 통해 필요한 엔드포인트만 명시적으로 선택하여 공개해야 한다. 특히 /env, /heapdump, /loggers와 같이 애플리케이션의 내부 구성이나 메모리 상태를 상세히 보여주는 엔드포인트는 신중하게 관리해야 한다.
보안을 강화하기 위해 스프링 시큐리티와 같은 인증 및 권한 부여 프레임워크를 함께 사용하여 액추에이터 엔드포인트에 대한 접근을 제어하는 것이 일반적이다. 또한, HTTPS를 통한 통신을 강제하고, 방화벽 규칙을 설정하여 액추에이터가 사용하는 포트(management.server.port)에 대한 외부 접근을 제한하는 것도 중요한 운영상의 고려사항이다.
메트릭 수집과 관련하여, 프로덕션에서는 마이크로미터를 통해 수집된 데이터를 프로메테우스, Datadog, 뉴렐릭과 같은 외부 모니터링 시스템으로 전송하는 구성이 권장된다. 이를 통해 애플리케이션의 성능과 상태를 중앙에서 지속적으로 관찰하고, 이상 징후를 조기에 발견할 수 있다. 액추에이터 자체의 상태도 모니터링 대상에 포함시켜야 한다.
마지막으로, 헬스 체크 엔드포인트(/health)는 쿠버네티스나 클라우드 파운드리와 같은 클라우드 플랫폼에서 애플리케이션의 라이브니스와 레디니스를 판단하는 데 사용된다. 따라서 커스텀 헬스 인디케이터를 구현할 때는 외부 의존성(데이터베이스, 캐시 서버, 메시지 큐)의 상태를 정확히 반영하여, 플랫폼이 애플리케이션의 실제 서비스 가능 여부를 올바르게 판단할 수 있도록 해야 한다.
6. 보안
6. 보안
6.1. 액추에이터 보안 설정
6.1. 액추에이터 보안 설정
Spring Boot Actuator는 애플리케이션의 내부 상태와 운영 정보를 노출하는 강력한 도구이기 때문에, 프로덕션 환경에서는 적절한 보안 설정이 필수적이다. 민감한 정보가 포함된 엔드포인트에 대한 무단 접근을 방지해야 한다.
기본적으로, health 엔드포인트를 제외한 대부분의 엔드포인트는 보안이 적용된 상태로 노출된다. 이는 Spring Security가 애플리케이션의 클래스패스에 존재할 경우 자동으로 활성화되는 기능이다. 따라서 보안을 구성하는 가장 일반적인 방법은 Spring Security 의존성을 추가하고, 별도의 보안 구성 클래스를 작성하여 액추에이터 엔드포인트에 대한 접근 제어 규칙을 정의하는 것이다. 예를 들어, 관리자 역할을 가진 사용자만 /actuator 경로 하위의 특정 엔드포인트에 접근할 수 있도록 설정할 수 있다.
보다 세밀한 제어를 위해 application.properties 또는 application.yml 파일을 통한 설정도 가능하다. management.endpoints.web.exposure.include 속성으로 노출할 엔드포인트를 제한하는 것이 첫 번째 단계이다. 또한, management.endpoint.[엔드포인트명].enabled 속성을 false로 설정하여 특정 엔드포인트를 완전히 비활성화할 수 있다. JMX를 통한 노출 여부는 management.endpoints.jmx.exposure.include 속성으로 별도 관리된다. 내부 네트워크에서만 접근해야 하는 경우, 방화벽 규칙을 통해 액추에이터가 사용하는 포트(기본적으로 애플리케이션 포트와 동일)에 대한 외부 접근을 차단하는 것도 중요한 보안 조치이다.
6.2. 인증 및 권한
6.2. 인증 및 권한
Spring Boot Actuator의 엔드포인트는 애플리케이션의 내부 상태와 민감한 정보를 노출할 수 있으므로, 프로덕션 환경에서는 반드시 적절한 인증 및 권한 부여 메커니즘을 구성해야 한다. Spring Security와 같은 보안 프레임워크를 애플리케이션에 통합하면, 액추에이터 엔드포인트에 대한 접근을 제어할 수 있다.
액추에이터 엔드포인트의 보안은 일반적인 Spring Security 구성 방식을 따른다. 개발자는 SecurityFilterChain을 정의하여 특정 엔드포인트 경로(예: /actuator/**)에 대한 접근 규칙을 설정할 수 있다. 예를 들어, health와 info 엔드포인트는 모든 사용자에게 공개하고, env, metrics, loggers와 같은 민감한 엔드포인트는 특정 권한(예: ACTUATOR_ADMIN)을 가진 인증된 사용자에게만 허용하도록 구성하는 것이 일반적이다. 또한, management.endpoints.web.exposure.include 속성을 통해 노출 범위를 제한하는 것이 기본적인 보안 조치이다.
인증 방식은 HTTP 기본 인증, 폼 로그인, OAuth 2.0, JWT 등 애플리케이션의 전체 보안 전략에 맞춰 선택한다. 역할 기반 접근 제어를 구현하여 운영팀과 개발팀에 서로 다른 수준의 접근 권한을 부여할 수 있다. 별도의 관리 포트를 사용하는 management.server.port 설정을 통해 모니터링 트래픽을 애플리케이션의 주요 비즈니스 포트와 분리하고, 해당 포트에만 보안 규칙을 적용하는 고급 구성도 가능하다.
7. 확장 및 커스터마이징
7. 확장 및 커스터마이징
7.1. 커스텀 헬스 체크
7.1. 커스텀 헬스 체크
Spring Boot Actuator는 기본적으로 제공하는 헬스 체크 외에도 애플리케이션의 특정 비즈니스 상태나 외부 의존성 상태를 점검하는 커스텀 헬스 인디케이터를 구현할 수 있다. 이를 통해 애플리케이션의 전반적인 건강 상태를 더욱 정확하고 의미 있게 모니터링할 수 있다.
커스텀 헬스 체크를 구현하려면 HealthIndicator 인터페이스를 구현하거나 AbstractHealthIndicator 클래스를 상속받는 컴포넌트를 생성한다. 이 컴포넌트는 health() 메서드를 오버라이드하여 점검 로직을 작성하고, 그 결과를 Health 객체로 반환해야 한다. 반환되는 상태는 UP, DOWN, OUT_OF_SERVICE, UNKNOWN 중 하나이며, 점검 결과에 대한 상세 정보를 포함시킬 수도 있다.
예를 들어, 외부 API 서비스의 연결 상태나 특정 데이터베이스 테이블의 데이터 무결성을 점검하는 커스텀 헬스 인디케이터를 만들 수 있다. 이렇게 생성된 컴포넌트는 스프링 프레임워크의 의존성 주입 컨테이너에 의해 자동으로 관리되며, /actuator/health 엔드포인트에 접근하면 기본 헬스 정보와 함께 커스텀 점검 결과가 통합되어 표시된다.
여러 개의 커스텀 헬스 인디케이터를 등록하면, Actuator는 이들 모두를 집계하여 최종 애플리케이션 상태를 결정한다. 이는 마이크로서비스 아키텍처에서 각 서비스의 복잡한 내부 상태를 운영 팀이 쉽게 파악할 수 있도록 하는 데 유용하다.
7.2. 커스텀 메트릭
7.2. 커스텀 메트릭
Spring Boot Actuator는 기본적으로 제공하는 메트릭 외에도 애플리케이션의 비즈니스 로직이나 특정 상태를 반영하는 커스텀 메트릭을 생성하고 노출하는 기능을 지원한다. 이를 통해 운영팀은 애플리케이션의 핵심 성능 지표나 도메인 특화 지표를 실시간으로 모니터링할 수 있다. 커스텀 메트릭 생성의 핵심은 마이크로미터 라이브러리이다. 스프링 부트는 마이크로미터를 통합하여 다양한 모니터링 시스템(프로메테우스, Datadog, 뉴렐릭 등)에 호환되는 표준화된 메트릭을 쉽게 생성할 수 있도록 한다.
커스텀 메트릭을 등록하려면 주로 MeterRegistry 빈을 주입받아 사용한다. MeterRegistry는 카운터, 게이지, 타이머, 분포 요약 등 다양한 유형의 메트릭을 생성하는 인터페이스를 제공한다. 예를 들어, 특정 API의 호출 횟수를 측정하려면 Counter를, 처리 시간을 측정하려면 Timer를 사용한다. 생성된 메트릭은 /actuator/metrics 엔드포인트를 통해 확인할 수 있으며, 구성된 메트릭 수집 도구로 자동으로 전송된다.
메트릭 유형 | 주요 용도 | 예시 |
|---|---|---|
Counter | 단조 증가하는 값 측정 | 주문 생성 횟수, 오류 발생 횟수 |
Gauge | 현재 시점의 단일 값 측정 | 대기 중인 작업 큐의 크기, 연결된 세션 수 |
Timer | 이벤트 지속 시간 및 빈도 측정 | HTTP 요청 처리 시간, 데이터베이스 쿼리 시간 |
DistributionSummary | 이벤트의 분포 측정 | 업로드 파일 크기, 응답 페이로드 크기 |
애플리케이션의 특정 도메인 로직에 맞춰 커스텀 메트릭을 설계하면, 단순한 시스템 지표를 넘어 비즈니스 상태를 가시화하는 데 큰 도움이 된다. 예를 들어, 전자상거래 애플리케이션에서는 분당 거래 금액, 장바구니 담기 횟수, 특정 상품의 조회수 등을 메트릭으로 정의할 수 있다. 이러한 메트릭은 대시보드에 표시되거나 특정 임계값을 초과할 때 알림을 트리거하는 데 사용되어 보다 사전 예방적인 운영을 가능하게 한다.
7.3. 정보 기여자
7.3. 정보 기여자
정보 기여자는 Spring Boot Actuator의 기능을 확장하기 위한 핵심 메커니즘이다. 이는 애플리케이션의 특정 정보를 수집하여 Actuator의 다양한 엔드포인트에 자동으로 제공하는 구성 요소를 의미한다. 예를 들어, 애플리케이션의 빌드 정보, Git 커밋 정보, 또는 사용자 정의 상태 정보를 특정 엔드포인트에 노출시키고 싶을 때 정보 기여자를 구현하여 활용한다.
주요 엔드포인트인 /info와 /health는 이러한 정보 기여자에 크게 의존한다. /info 엔드포인트는 InfoContributor 인터페이스를 구현한 빈들로부터 정보를 수집하여 표시한다. 마찬가지로, /health 엔드포인트는 HealthIndicator 인터페이스를 구현한 빈들, 즉 헬스 인디케이터로부터 상태 정보를 집계한다. 이처럼 정보 기여자는 관심사의 분리를 통해 모니터링 데이터의 생산과 노출을 깔끔하게 분리한다.
개발자는 필요에 따라 커스텀 정보 기여자를 쉽게 생성할 수 있다. InfoContributor 인터페이스를 구현하고 contribute 메서드를 오버라이드하여 원하는 정보를 Info.Builder 객체에 추가하기만 하면 된다. 이렇게 생성한 빈은 Spring의 의존성 주입 컨테이너에 등록되면 자동으로 발견되어 /info 엔드포인트의 응답에 포함된다. 이를 통해 애플리케이션의 배포 버전, 특정 외부 서비스의 연결 상태, 또는 비즈니스 관련 지표 등 다양한 사용자 정의 정보를 노출할 수 있다.
정보 기여자 메커니즘은 Spring Boot의 자동 구성과 결합되어 강력한 유연성을 제공한다. 내장된 기여자들(예: 빌드 정보를 제공하는 BuildInfoContributor)은 특정 조건에서 자동으로 활성화되며, 사용자 정의 기여자는 표준 Spring Bean으로 등록함으로써 기존 시스템에 자연스럽게 통합된다. 이는 애플리케이션 모니터링과 운영을 위한 맞춤형 데이터를 구성하는 표준화된 방법을 제시한다.
