Spring/[인프런 김영한 스프링 부트 - 핵심 원리와 활용]
[인프런 김영한 스프링 부트 - 핵심 원리와 활용] 액츄에이터
h2boom
2025. 1. 24. 16:29
액츄에이터
프로덕션 준비 기능
- 프로덕션 준비 기능 : 운영 환경에서 서비스할 때 필요한 기능들
- 프로덕션을 운영에 배포할 때 준비해야 하는 비 기능적 요소들을 의미
- 지표(metric), 추적(trace), 감사(auditing), 모니터링
- ex) 애플리케이션이 살아있는지, 로그 정보는 정상 출력되는지, 커넥션 풀 사용 현황 등..
- 엑츄에이터 : 프로덕션 준비 기능을 편리하게 사용할 수 있도록 스프링 부트가 제공하는 기능
- 마이크로미터, 프로메테우스, 그라파나 같은 모니터링 시스템과 쉽게 연동하는 기능도 제공
액츄에이터 시작
implementation 'org.springframework.boot:spring-boot-starter-actuator' //actuator 추가
- build.gradle 의존성 추가
- 액츄에이터가 제공하는 프로덕션 준비 기능을 사용하기 위한 작업
{
"_links": {
"self": {
"href": "http://localhost:8080/actuator",
"templated": false
},
"health": {
"href": "http://localhost:8080/actuator/health",
"templated": false
},
"health-path": {
"href": "http://localhost:8080/actuator/health/{*path}",
"templated": true
}
}
}
- 액츄에이터 실행 결과
- /actuator 경로를 통해서 액츄에이터 기능을 제공한다.
- /actuator/health : 현재 서버가 잘 동작하고 있는지 애플리케이션의 상태를 나타낸다.
management:
endpoints:
web:
exposure:
include: "*"
- application.yml 설정
- 해당 내용 추가 시 액츄에이터가 제공하는 수 많은 기능을 확인할 수 있다.
- 엔드포인트 : 액츄에이터가 제공하는 기능 하나하나를 의미한다.
- 각 엔드포인트는 /actuator/{엔드포인트명} 형식으로 접근할 수 있다.
엔트포인트 설정
- 엔트포인트 사용하기 위한 과정
- 엔트포인트 활성화 : 해당 기능 자체를 사용할지 말지 선택하는 것
- 엔트포인트 노출 : 엔드포인트를 HTTP에 노출할지 JMX에 노출할지 선택하는 것
- 엔트포인트가 활성화되지 않으면 노출도 되지 않기에 활성화 + 노출이 모두 적용되어야 사용 가능
- shutdown을 제외한 대부분의 엔드포인트는 기본으로 활성화되어 있다.
management:
endpoints:
web:
exposure:
include: "*"
- application.yml
- 모든 엔드포인트를 웹에 노출하는 옵션이다.
- web을 jmx로 변경하면 jmx에 노출되도록 할 수 있다.
- exclude 옵션을 사용하면 노출에서 제외할 엔드포인트를 지정할 수 있다.
다양한 엔드포인트
- 엔드포인트 목록
- beans : 스프링 컨테이너에 등록된 스프링 빈을 보여준다.
- conditions : condition 을 통해서 빈을 등록할 때 평가 조건과 일치하거나 일치하지 않는 이유를 표
시한다. - configprops : @ConfigurationProperties 를 보여준다.
- env : Environment 정보를 보여준다.
- health : 애플리케이션 헬스 정보를 보여준다.
- httpexchanges : HTTP 호출 응답 정보를 보여준다. HttpExchangeRepository 를 구현한 빈을 별
도로 등록해야 한다. - info : 애플리케이션 정보를 보여준다.
- loggers : 애플리케이션 로거 설정을 보여주고 변경도 할 수 있다.
- metrics : 애플리케이션의 메트릭 정보를 보여준다.
- mappings : @RequestMapping 정보를 보여준다.
- threaddump : 쓰레드 덤프를 실행해서 보여준다.
- shutdown : 애플리케이션을 종료한다. 이 기능은 기본으로 비활성화 되어 있다
헬스(health) 정보
- 헬스 정보를 통해 애플리케이션에 문제가 발생했을 때 문제를 빠르게 인지할 수 있다.
- 요청에 대한 응답뿐 아니라 DB가 응답하는지, 디스크 사용량과 같은 다양한 정보를 포함한다.
management:
endpoint:
health:
show-components: always
show-details: always
- application.yml
- 헬스 정보를 더 자세히 보기 위해서 옵션 지정
- DB 상태, 디스크 사용량 확인 가능
- show-details는 더 자세한 정보, show-components는 상태가 UP인지 DOWN인지 간략한 정보만 확인할 수 있다.
- 헬스 정보를 더 자세히 보기 위해서 옵션 지정
- 헬스 컴포넌트(DB 상태, 디스크 사용량) 중 하나라도 문제가 있으면 전체 상태는 DOWN이 된다.
애플리케이션 정보
- info 엔드포인트 : 애플리케이션의 기본 정보를 노출한다.
- java : 자바 런타임 정보
- os : os 정보
- env : Environment에서 info.로 시작하는 정보
- build : 빌드 정보로 META-INF/build-info.properties 파일이 필요
- git : git 정보로 git.properties 파일이 필요
- env, java, os는 기본적으로 비활성화 되어있다.
management:
info:
java:
enabled: true
os:
enabled: true
env:
enabled: true
info:
app:
name: hello-actuator
company: hb
- application.yml
- info 엔드포인트 활성화 예제
- endpoint 하위가 아닌 management 하위에 작성해야 한다.
- env는 info 하위 내용을 노출한다.
- 예제에서는 app.name과 app.company를 노출
- info 엔드포인트 활성화 예제
springBoot {
buildInfo()
}
- 해당 내용 build.gradle에 추가 시 빌드 시점에 build 폴더안에 resources/main/META-INF/build-info.properties 파일이 만들어진다.
- 해당 파일이 있어야 build 정보가 노출이 된다.
id "com.gorylenko.gradle-git-properties" version "2.4.1" //git info
- 해당 내용을 build.gradle에 추가 시 git 정보가 노출된다.
- 해당 프로젝트가 git으로 관리되고 있어야 한다.
로거
- 로그를 별도로 설정하지 않으면 스프링 부트는 기본으로 INFO를 사용한다.
- INFO 이상의 수준 로그만 확인 가능하다. (INFO, WARN, ERROR)
- 특정 로거 이름을 기준으로 조회할 수 있다.
- ex) /actuator/loggers/{로거이름}
- ex) /actuator/loggers/{로거이름}
- 실시간 로그 레벨 변경
- loggers 엔드포인트 사용 시 애플리케이션을 다시 시작하지 않고 실시간으로 로그 레벨을 변경할 수 있다.
- POST 요청 /actuator/loggers/{로거이름} application/json 타입으로 {"configuredLevel": "TRACE"} 전달 시 실시간으로 로그 레벨이 TRACE로 변경되는 것을 볼 수 있다.
- 꼭 POST 요청으로 변경해야 한다.
HTTP 요청 응답 기록
- HTTP 요청과 응답 기록을 확인하려면 httpexchanges 엔드포인트를 사용하면 된다.
- HttpExchangeRepository 인터페이스 구현체를 빈으로 등록해야 사용할 수 있다.
- 기능이 단순하고 제한이 많기에 개발 단계에서만 사용하고 운영 서비스에서는 다른 기술을 사용하는 것이 좋다.
액츄에이터와 보안
- 액츄에이터가 제공하는 기능들은 애플리케이션의 내부 정보를 너무 많이 노출하기에 외부 인터넷망이 공개된 곳에 엔드포인트를 공개하는 것은 보안상 좋지 않다.
- 애플리케이션 서버와 다른 포트에서 액츄에이터 기능을 사용하도록 할 수 있다.
management:
server:
port: 9292
- application.yml에서 액츄에이터에 다른 포트를 설정
- 예제에서는 9292포트에서만 액츄에이터 기능에 접근할 수 있으며 기존 8080포트에서는 액츄에이터 기능에 접근할 수 없게된다.
- 포트를 분리하는 것이 어려운 경우 /actuator 경로에 서블릿 필터, 스프링 인터셉터, 시큐리티를 통해서 인증된 사용자만 접근 가능하도록 개발해야 한다.
management:
endpoints:
web:
base-path: "/manage"
- application.yml에서 엔드포인트 경로 변경
- 기본 경로를 변경할 수 있으며 이 경우 /actuator -> /manage로 변경된 것
출처 : [인프런 김영한 스프링 부트 - 핵심 원리와 활용]
스프링 부트 - 핵심 원리와 활용 강의 | 김영한 - 인프런
김영한 | 실무에 필요한 스프링 부트는 이 강의 하나로 모두 정리해드립니다., 백엔드 개발자를 위한 스프링 부트 끝판왕! 실무에 필요한 내용을 모두 담았습니다. [임베딩 영상] 김영한의 스
www.inflearn.com