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를 노출

 

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/{로거이름}

 

  • 실시간 로그 레벨 변경
    • 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로 변경된 것

출처 : [인프런 김영한 스프링 부트 - 핵심 원리와 활용]

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%ED%95%B5%EC%8B%AC%EC%9B%90%EB%A6%AC-%ED%99%9C%EC%9A%A9/dashboard

 

스프링 부트 - 핵심 원리와 활용 강의 | 김영한 - 인프런

김영한 | 실무에 필요한 스프링 부트는 이 강의 하나로 모두 정리해드립니다., 백엔드 개발자를 위한 스프링 부트 끝판왕! 실무에 필요한 내용을 모두 담았습니다.  [임베딩 영상] 김영한의 스

www.inflearn.com