챕터 9: Spring Boot Actuator
9.1 Actuator 개요 및 설정
9.1.1 Actuator의 역할과 기능
Spring Boot Actuator는 애플리케이션의 모니터링과 관리를 위한 다양한 기능을 제공합니다. 이를 통해 애플리케이션의 상태를 점검하고 성능을 모니터링할 수 있습니다.
역사적 배경:
- 과거에는 애플리케이션의 상태를 모니터링하고 문제를 진단하는 것이 매우 어려웠습니다.
- 개발자들은 로그 파일을 수작업으로 분석하거나, 별도의 모니터링 도구를 통합해야 했습니다.
- Spring Boot Actuator는 이러한 문제를 해결하기 위해 도입되었으며, 애플리케이션의 상태를 쉽게 모니터링하고 관리할 수 있는 다양한 엔드포인트를 제공합니다.
9.1.2 기본 설정 방법
Spring Boot Actuator를 사용하려면 먼저 spring-boot-starter-actuator
의존성을 추가해야 합니다. 이는 애플리케이션의 상태를 모니터링하고 관리하는 데 필요한 기능을 제공합니다.
<!-- pom.xml -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
이제 Actuator의 기본 설정을 추가할 수 있습니다. 기본적으로 Actuator는 몇 가지 기본 엔드포인트를 제공합니다.
# application.properties
management.endpoints.web.exposure.include=*
위 설정은 모든 Actuator 엔드포인트를 노출시키는 설정입니다. 필요에 따라 특정 엔드포인트만 노출시키도록 설정할 수도 있습니다.
9.2 기본 엔드포인트 사용
9.2.1 주요 엔드포인트 소개
/actuator/health
: 애플리케이션의 상태를 확인합니다. 애플리케이션이 정상인지 확인할 수 있습니다./actuator/info
: 애플리케이션의 일반 정보를 제공합니다. 예를 들어, 버전 정보나 기타 메타데이터를 포함할 수 있습니다./actuator/metrics
: 애플리케이션의 성능 지표를 확인합니다. JVM 메모리 사용량, 시스템 CPU 사용량 등 다양한 메트릭을 제공합니다.
9.2.2 엔드포인트 사용 예
# 애플리케이션 상태 확인
$ curl http://localhost:8080/actuator/health
{
"status": "UP"
}
# 애플리케이션 정보 확인
$ curl http://localhost:8080/actuator/info
{
"app": {
"name": "MyApp",
"version": "1.0.0"
}
}
# 애플리케이션 메트릭 확인
$ curl http://localhost:8080/actuator/metrics
{
"names": [
"jvm.memory.used",
"jvm.memory.max",
"system.cpu.usage",
"process.uptime"
]
}
위 예제에서는 curl
명령어를 사용하여 Actuator 엔드포인트에 접근하는 방법을 보여줍니다. 각 엔드포인트는 애플리케이션의 상태나 정보를 JSON 형식으로 반환합니다.
9.3 커스텀 엔드포인트 작성
9.3.1 커스텀 엔드포인트 필요성
기본 엔드포인트 외에도 애플리케이션의 특정 요구사항에 맞는 커스텀 엔드포인트를 작성할 수 있습니다. 예를 들어, 특정 비즈니스 로직의 상태나 정보를 제공하는 엔드포인트를 추가할 수 있습니다.
9.3.2 작성 방법과 예제
package com.example.demo;
import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
import org.springframework.stereotype.Component;
// @Endpoint 어노테이션을 사용하여 커스텀 엔드포인트를 정의
@Endpoint(id = "custom")
@Component
public class CustomEndpoint {
// @ReadOperation 어노테이션을 사용하여 HTTP GET 요청을 처리
@ReadOperation
public String customEndpoint() {
// 사용자 정의 정보를 반환
return "This is a custom endpoint";
}
}
위의 예제는 /actuator/custom
엔드포인트를 생성하여 사용자 정의 정보를 제공합니다. @Endpoint
어노테이션을 사용하여 엔드포인트를 정의하고, @ReadOperation
어노테이션을 사용하여 GET 요청을 처리합니다.
커스텀 엔드포인트 예제 2: 시스템 상태 정보 제공
시스템의 CPU 및 메모리 사용량을 제공하는 커스텀 엔드포인트 예제입니다.
package com.example.demo;
import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
import org.springframework.stereotype.Component;
import java.lang.management.ManagementFactory;
import java.lang.management.OperatingSystemMXBean;
// @Endpoint 어노테이션을 사용하여 커스텀 엔드포인트를 정의
@Endpoint(id = "systemStatus")
@Component
public class SystemStatusEndpoint {
// @ReadOperation 어노테이션을 사용하여 HTTP GET 요청을 처리
@ReadOperation
public SystemStatus systemStatus() {
OperatingSystemMXBean osBean = ManagementFactory.getOperatingSystemMXBean();
// 시스템 상태 정보를 반환
return new SystemStatus(
osBean.getSystemLoadAverage(),
Runtime.getRuntime().freeMemory(),
Runtime.getRuntime().totalMemory()
);
}
// 시스템 상태 정보를 나타내는 내부 클래스
public static class SystemStatus {
private final double systemLoadAverage;
private final long freeMemory;
private final long totalMemory;
public SystemStatus(double systemLoadAverage, long freeMemory, long totalMemory) {
this.systemLoadAverage = systemLoadAverage;
this.freeMemory = freeMemory;
this.totalMemory = totalMemory;
}
public double getSystemLoadAverage() {
return systemLoadAverage;
}
public long getFreeMemory() {
return freeMemory;
}
public long getTotalMemory() {
return totalMemory;
}
}
}
위의 예제는 /actuator/systemStatus
엔드포인트를 생성하여 시스템의 CPU 로드 평균 및 메모리 상태를 반환합니다. OperatingSystemMXBean
을 사용하여 시스템 정보를 가져옵니다.
커스텀 엔드포인트 예제 3: 데이터베이스 연결 상태 확인
데이터베이스 연결 상태를 확인하는 커스텀 엔드포인트 예제입니다.
package com.example.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
// @Endpoint 어노테이션을 사용하여 커스텀 엔드포인트를 정의
@Endpoint(id = "databaseStatus")
@Component
public class DatabaseStatusEndpoint {
@Autowired
private JdbcTemplate jdbcTemplate;
// @ReadOperation 어노테이션을 사용하여 HTTP GET 요청을 처리
@ReadOperation
public DatabaseStatus databaseStatus() {
try {
// 간단한 쿼리를 실행하여 데이터베이스 연결 상태를 확인
jdbcTemplate.queryForObject("SELECT 1", Integer.class);
return new DatabaseStatus(true);
} catch (Exception e) {
return new DatabaseStatus(false);
}
}
// 데이터베이스 상태 정보를 나타내는 내부 클래스
public static class DatabaseStatus {
private final boolean isConnected;
public DatabaseStatus(boolean isConnected) {
this.isConnected = isConnected;
}
public boolean isConnected() {
return isConnected;
}
}
}
위의 예제는 /actuator/databaseStatus
엔드포인트를 생성하여 데이터베이스 연결 상태를 확인합니다. JdbcTemplate
을 사용하여 간단한 쿼리를 실행하고, 성공 여부에 따라 연결 상태를 반환합니다.
9.4 애플리케이션 모니터링
9.4.1 모니터링의 중요성
애플리케이션 모니터링은 시스템의 상태를 지속적으로 확인하고, 성능 문제를 조기에 발견하며, 장애 발생 시 신속하게 대응할 수 있도록 도와줍니다. 이는 애플리케이션의 안정성과 사용자 경험을 개선하는 데 필수적입니다.
9.4.2 Actuator를 통한 모니터링 방법
Spring Boot Actuator는 다양한 모니터링 기능을 제공하여 애플리케이션의 상태와 성능을 쉽게 확인할 수 있습니다. 이를 통해 애플리케이션의 안정성을 높이고, 문제 발생 시 신속하게 대응할 수 있습니다.
'IT 강좌(IT Lectures) > SpringBoot' 카테고리의 다른 글
11강. 프론트엔드 통합 (1) | 2024.07.23 |
---|---|
10강. Spring Boot DevTools (3) | 2024.07.23 |
8강. 예외 처리 (0) | 2024.07.19 |
7강. 데이터 접근 (0) | 2024.07.18 |
6강. 컨트롤러(Controller)와 라우팅(Routing) (0) | 2024.07.09 |