기록
[Spring Boot] 10. Actuator 본문

엔코아 플레이데이터(Encore Playdata) Backend 2기 백엔드 개발 부트캠프 (playdata.io)
백엔드 개발 부트캠프
백엔드 기초부터 배포까지! 매력있는 백엔드 개발자 포트폴리오를 완성하여 취업하세요.
playdata.io
1. Actuator
어플리케이션을 개발하는 단계를 지나 운영 단계에 접어들면 어플리케이션이 정상적으로 동작하는지 모니터링하는 환경이 중요해진다. 스프링부트 엑츄에이터는 HTTP 엔드포인트나 JMX 를 활용해, 어플리케이션을 모니터링하고 관리할 수 있는 기능을 제공한다.
즉, 애플리케이션 운영과 모니터링을 효율적으로 관리하기 위한 다양한 도구와 엔드포인트를 제공하여 개발자와 운영팀에게 가치 있는 정보와 기능을 제공하고, 이를 통해 애플리케이션의 안정성과 성능을 향상시킬 수 있다.
1. JMX ?
JMX(Java Management Extensions)
실행중인 어플리케이션의 상태를 모니터링 하고 설정을 변경할 수있게 해주는 api로,
JMX를 통해 리소스를 관리하려면 MBEANS(Managed Beans)를 생성해야한다.
2. Actuator 기능
1. 어플리케이션 상태 모니터링
어플리케이션의 메모리 사용량, 스레드 상태, GC(Garbage Collection) 정보 등과 같은
중요한 메트릭을 확인할 수 있다.
2. 어플리케이션 구성 정보
어플리케이션의 환경 변수, 설정 파일, 빈(Bean) 등과 관련된 정보를 검토할 수 있다.
3. 로그 관리
로그 레벨을 동적으로 변경하거나, 특정 패키지 또는 클래스의 로그를 조회하는 기능을 제공하여,
이를 통해 런타임 중 로깅을 조정할 수 있다.
4. 엔드포인트
다양한 엔드포인트를 통해 어플리케이션의 상태를 외부에서 간단하게 모니터링할 수 있다.
5. 보안
액추에이터는 기본적으로 보안 설정이 적용되어 있어, 민감한 정보나 작업을 외부로 노출하지 않도록 보호한다.
즉, 엔드포인트에 대한 접근 권한을 관리하고 사용자 정의 보안 설정을 구성할 수 있다.
2. 엔드 포인트
엔드포인트는 어플리케이션의 모니터링을 사용하는 경로로, 스프링부트에는 여러 내장 엔드포인트가 포함되있으며 커스텀 엔드포인트를 추가할 수도 있다.
엑추에이터를 추가하면 기본적으로 엔드포인트 URL로 /actuator가 추가되며, 이 뒤에 경로를 추가해 상세 내역에 접근한다.
만약 /actuator 경로가 아닌 다른 경로를 사용하고 싶으면, application.properties 파일에 작성하면 된다.
1. 엔드포인트 예시
1. /info
가동중인 어플리케이션의 정보를 볼 수 있다.
2. /health
어플리케이션의 상태를 확인할 수 있다.
3. /beans
스프링 컨테이너에 등록된 스프링 빈의 전체 목록을 표시할 수 있다. 이 엔드포인트는 JSON 형식으로 빈의 정보를 반환한다.
4. /conditions
스프링부트의 자동설정(AutoConfiguration) 조건 내역을 확인할 수 있다.
5. /env
스프링의 환경변수 정보를 확인하는데 사용한다. 기본적으로 application.properties 파일의 변수들이 표시되고, OS, JVM의 환경변수도 표시된다.
6. /loggers
어플리케이션의 로깅 레벨 수준이 어떻게 설정되어 있는지 확인할 수 있다.
2. application.properties
# server
server.port=8090
# encoding
server.servlet.encoding.charset=utf-8
server.servlet.encoding.enabled=true
server.servlet.encoding.force=true
# db
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://localhost:3307/springboot
spring.datasource.username=root
spring.datasource.password=0000
# jpa
spring.jpa.hibernate.ddl-auto=create
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
# swagger
#spring.mvc.pathmatch.matching-strategy=ant_path_matcher
# 엔드포인트 : 어플리케이션의 모니터링을 사용하는 경로
# actuator 엔드포인트의 기본 경로 변경
# actuator 기본 경로 설정 (미설정시 /actuator 사용)
#management.endpoints.web.base-path=/info
# 엔드포인트 기능 활성화
# management.endpoint.<id>.enabled 를 통해 id로 구분된 기능을 활성화
management.endpoint.shutdown.enabled=true
management.endpoint.caches.enabled=false
# 엔드포인트 노출 설정
# HTTP 설정
management.endpoints.web.exposure.include=*
management.endpoints.web.exposure.exclude=threaddump,heapdump
# JMX 설정
management.endpoints.jmx.exposure.include=*
management.endpoints.jmx.exposure.exclude=threaddump, heapdump
# info.env 활성화
management.info.env.enabled=true
# actuator info 정보 설정
info.organization.name=wikibooks
info.contact.email=thinkground.flature@gmail.com
info.contact.phoneNumber=010-1234-5678
# actuator health 상세 내역 활성화
# never : 세부사항 표시 x
# when-authorized : 승인 된 사용자에게만 세부 상태 표시
# 권한은 management.endpoint.health.roles 속성으로 부여할 수 있다.
# always : 모든 사용자에게 세부 상태 표시
management.endpoint.health.show-details=always
# env 호출 시 등장하는 환경 변수 정보 중 민감한 정보를 가리는데 사용할 수 있다.
management.endpoint.env.keys-to-sanitize=password, secret
3. Custom Actuator
엑추에이터는 다양한 정보를 가공해서 제공해주는데, 개발자의 요구사항에 맞춘 커스텀 기능 설정도 제공 된다.
* Custom Actuator 기능 개발 방법
1. 기존 기능에 내용 추가
2. 새로운 엔드포인트 개발
1. Info 기능 인터페이스를 상속받은 CustomInfoContributor Class
/**
* 엑추에이터 커스터마이징
* /info 엔드포인트의 내용을 추가한 것 처럼 application.properties 파일 내에 내용을 추가
* -> 많은 내용을 담을 때는 관리 측면에서 좋지 않다.
*
* 때문에 커스텀 기능을 설정 할 때는 별도의 구현체 클래스를 작성해서 내용을 추가한다.
* -> InfoContributor 인터페이스를 상속받아 구현체를 만들면 된다.
*/
@Component
public class CustomInfoContributor implements InfoContributor {
/**
* Builder builder : Actuator 패키지의 Info 클래스 안에 정의 되어있는 클래스
* Info 엔드포인트에서 보여줄 내용을 담는 역할
*/
@Override
public void contribute(Builder builder) {
Map<String, Object> content = new HashMap<>();
content.put("code-info", "InfoContributor 구현체에서 정의한 정보입니다.");
builder.withDetail("custom-info-contributor", content);
}
}
2. 커스텀 엔드포인트를 생성한 NoteEndPoint Class
/**
* 커스텀 엔드포인트
* 간단한 메모 기록을 남길 수 있는 기능을 엔드포인트로 생성
*
* @Endpoint
* 엑추에이터에 엔드포인트로 자동 등록
* id 속성 : 값으로 경로를 정의할 수 있다.
* enableByDefault 속성 : 현재 생성하는 엔드포인트의 기본 활성화 여부 설정, 기본값은 true
*/
@Component
@Endpoint(id = "note")
public class NoteEndPoint {
private Map<String, Object> noteContent = new HashMap<>();
/**
* @ReadOperation : HTTP GET 요청에 반응
*/
@ReadOperation
public Map<String, Object> getNoteContent() {
return noteContent;
}
/**
* @WriteOperation : HTTP POST 요청에 반응
*/
@WriteOperation
public Map<String, Object> writeNote(String key, Object value) {
noteContent.put(key, value);
return noteContent;
}
/**
* @DeleteOperation : HTTP DELETE 요청에 반응
*/
@DeleteOperation
public Map<String, Object> deleteNote(String key) {
noteContent.remove(key);
return noteContent;
}
}
4. 45일차 후기
어플리케이션의 개발 이후 유지보수 단계에서 반드시 필요한 엑추에이터에 대한 실습을 진행해보았다.
엑추에이터는 애플리케이션 모니터링 및 관리 측면에서 개발자에게 편의를 주는 기능이나, 불필요한 endpoint를 활성화시킬 경우 비밀번호, API KEY, Token 같은 중요 정보들이 유출될 수 있다.
때문에 해당 기능을 활용하기 위해선 오늘 수업내용뿐만아니라, 안전하게 사용하는 방법을 추가로 익혀 사용해야할 것 같다는 생각이 들었다.
'Bootcamp > Spring Boot' 카테고리의 다른 글
| [Spring Boot] 11. 서버 간 통신 (0) | 2023.09.13 |
|---|---|
| [Spring Boot] 9. Validation, Exception (0) | 2023.09.12 |
| [Spring Boot] 8. Thymeleaf (0) | 2023.09.11 |
| [Spring Boot] 6. Spring Data JPA (0) | 2023.09.11 |
| [Spring Boot] 5. 상속 관계 매핑 (0) | 2023.09.11 |