IT 강좌(IT Lectures)/SpringBoot

9강. Spring Boot Actuator

소울입니다 2024. 7. 22. 08:56
728x90
반응형

 

 

챕터 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