북 스터디/스프링 부트 핵심 가이드

[스프링 부트] 11장. 액추에이터 활용하기 ~ 12장. 서버 간 통신

dbssk 2023. 7. 2. 21:15

이 글은 '스프링 부트 핵심 가이드 - 스프링 부트를 활용한 애플리케이션 개발 실무' 책을 통해 학습한 내용을 정리한 글입니다.

액추에이터 (Actuator)

https://docs.spring.io/spring-boot/docs/current/reference/html/actuator.html

Actuator는 HTTP 엔드포인트나 JMX를 활용해 어플리케이션을 모니터링하고 관리할 수 있는 기능을 제공하며 spring-boot-starter-actuator 종속성을 추가해야 사용할 수 있다.

엔드포인트

  • 엔드포인트는 어플리케이션의 모니터링을 사용하는 경로이다.
  • 스프링 부트내에 여러 내장 엔드포인트가 있으며, 커스텀 엔드포인트를 추가할 수도 있다.
  • 기본 엔드포인트 URL로 /actuator 가 추가되며, 이 뒤에 경로를 추가해 상세 내역에 접근한다.
  • 다른 경로를 사용하고 싶다면 application.properties 파일에 'management.endpoints.web.base-path=/custom-path' 를 작성하면 된다.
## 엔드포인트 활성화
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)

  • 가동중인 어플리케이션 정보 확인
  • application.properties 파일에 info.으로 시작하는 속성값을 이용하여 제공하는 정보의 범위를 정의
// application.propertie파일 내에 어플리케이션 정보 속성 작성
info.organization.name=wikibooks
info.contact.email=hello1234@gmail.com
imfo.contact.phoneNumber=010-0000-0000
  • 이렇게 한 다음, 서버주소/actuator/info URL에 접근하면 정의한 속성 값을 바탕으로 생성된 정보가 JSON 형식으로 제공

어플리케이션 상태 (/health)

  • 어플리케이션 상태를 확인
  • 주소 : http://localhost:8080/actuator/health
  • status의 값으로 UP, DOWN, UNKNOWN, OUT_OF_SERVICE 4가지의 상태 지표를 가짐
  • 이 결과는 주로 네트워크 계층 중 L4(Loadbalancing)레벨에서 어플리케이션 상태를 확인하기 위해 사용
  • application.properties파일에 'management.endpoint.health.show-details=always' 을 추가하면 상세 정보 확인가
  • show-details의 설정 값
    • never(기본값): 세부사항 표시하지 않음
    • when-authorized: 승인된 사용자에게만 세부상태 표시, 확인 권한은 application.properties에 추가한 management.endpoint.health.roles속성으로 부여 가능
    • always : 모든 사용자에게 세부상태 표시
  • 만약 어플리케이션에 DB가 연동되어 있다면 인프라 관련 상태까지 확인가능
  • detail의 모든 status가 UP이어야 어플리케이션의 상태가 UP으로 표시됨, 만약 DOWN상태인 항목이 있다면 어플리케이션의 상태도 DOWN으로 표기되고 HTTP상태코드도 변경

빈 정보 확인 (/beans)

  • 스프링 컨테이너에 등록된 스프링빈의 전체 목록을 표시
    json형식으로 빈의 정보 반환

스프링 부트의 자동설정 내역 확인 (/conditions)

  • 스프링부트의 자동설정(AutoConfiguration) 조건 내역을 확인

스프링 환경변수 정보 (/env)

  • 스프링 환경변수 정보를 확인
  • 기본적으로 application.properties 파일의 변수들이 표시되며, OS, JVM의 환경변수도 함께 표시
  • management.endpoint.env.keys-to-sanitize 속성을 사용하여 민감한 정보를 가릴 수 있음

로깅 레벨 확인 (/loggers)

  • 어플리케이션의 로깅레벨 수준이 어떻게 설정되어 있는지 확인
  • GET 메소드로 호출하면 확인이 가능하며 POST 메소드로 호출하면 로깅 레벨을 변경할 수도 있음

커스텀 액추에이터

기존 기능에 내용을 추가하거나, 새로운 엔드포인트를 개발하는 방식으로 구현하며,@Endpoint 가 명시된 클래스를 이용하여 구현

서버 간 통신 (RestTemplate / WebClient)

RestTemplate

RestTemplate은 스프링에서 HTTP 통신 기능을 손쉽게 사용하도록 설계된 템플릿이다. 이것을 이용하면 RESTful 원칙을 따르는 서비스를 편리하게 만들 수 있다. 기본적으로 동기 방식으로 처리되며, 비동기 방식으로 사용하고 싶을 경우 AsyncRestTemplate을 사용하면 된다. 

GET 형식 RestTemplate

일반적으로 UriComponentsBuilder 를 사용

// 변수 방식
URI uri = UriComponentsBuilder
    	.fromUriString("http://localhost:8080")
        .path("/api/{name}")
        .encode()
        .build()
        .expand("MyName")
        .toUri();
        
// 파라미터 방식
URI uri2 = UriComponentsBuilder
    	.fromUriString("http://localhost:8080")
        .path("/api/param")
        .queryParam("name", "myName")
        .encode()
        .build()
        .toUri();
        
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response = restTemplate.getForEntity(uri, String.class);

return responseEntity.getBody();

POST 형식 RestTemplate

RequestEntity<MemberDto> request = RequestEntity
	.post(uri)
    .header("my-header", "Wikibooks API")
    .body(memberDto);
    
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<MemberDto> response = restTemplate.exchange(requestEntity, MemberDto.class);

WebClient

create() 메서드를 이용하는 방법과 builder()를 이용하는 생성 방법이 있다.

  • WebClient는 객체를 생성한 다음 요청을 전달하는 방식으로 동작
  • builder()를 통해 baseUrl() 메서드에서 기본 URL을 설정하고 defaultHeader() 메서드로 헤더의 값을 설정
  • 한번 빌드된 WebClient는 변경할 수 없다.
  • 그러나 Webclient.mutate() 메서드를 사용하면 복제할 수 있다.