본문 바로가기
MSA

refresh

by xogns93 2024. 12. 16.

Spring에서 refresh는 실행 중인 애플리케이션이 설정이나 상태를 동적으로 갱신하도록 돕는 메커니즘입니다. 주로 Spring Cloud 환경에서 설정 값 변경, 라우팅 정보 업데이트, Bean 재초기화 등에 사용됩니다.


1. refresh의 기본 개념

  • 동적 갱신: 애플리케이션이 실행 중인 상태에서 설정 파일이나 라우팅 정보 등의 변경 사항을 즉시 반영할 수 있게 합니다.
  • Spring에서 refresh애플리케이션 컨텍스트(Application Context)의 특정 부분을 다시 로드하거나 초기화하여 이를 실현합니다.
  • 시스템 재시작 없이도 업데이트 사항을 반영할 수 있으므로 가용성유연성을 높이는 데 유용합니다.

2. 주요 용도

  1. Spring Cloud Config와 연동:
    • 외부 Config 서버에서 설정 변경 사항을 반영.
    • 예: 데이터베이스 연결 정보, 로깅 레벨 등.
  2. Spring Cloud Gateway 라우팅 정보 갱신:
    • Gateway에서 라우팅 규칙이 변경되었을 때 이를 동적으로 적용.
  3. 운영 중 설정 최적화:
    • 실행 중에 애플리케이션을 재배포하지 않고도 설정 변경.

3. refresh가 작동하는 방식

Spring에서 refresh는 특정 엔드포인트를 호출하거나 자동화된 이벤트를 통해 설정 및 상태를 갱신합니다.

a. /actuator/refresh

  • Spring Cloud Config와 함께 사용되며, 설정 변경 사항을 반영.
  • 작동 원리:
    1. Config 서버에서 설정 값을 변경.
    2. 클라이언트 애플리케이션에서 /actuator/refresh 엔드포인트 호출.
    3. @RefreshScope로 선언된 빈(Bean)이 갱신.

b. /actuator/gateway/refresh

  • Spring Cloud Gateway의 라우팅 정보를 갱신.
  • 작동 원리:
    1. Gateway의 라우트 정보가 변경됨.
    2. /actuator/gateway/refresh 호출.
    3. Gateway의 라우팅 테이블 갱신.

4. 관련 어노테이션 및 기능

a. @RefreshScope

  • Spring Bean에서 설정 변경 사항을 동적으로 반영하기 위해 사용하는 어노테이션.
  • 이 어노테이션이 적용된 빈은 /actuator/refresh 호출 시 갱신됩니다.

사용 예시:

@RefreshScope
@RestController
public class ConfigController {

    @Value("${example.property}")
    private String property;

    @GetMapping("/property")
    public String getProperty() {
        return property;
    }
}

b. @ConfigurationProperties

  • 설정 파일의 값을 매핑하는 클래스에서 @RefreshScope와 함께 사용하여 변경 사항을 반영.

예시:

@RefreshScope
@ConfigurationProperties(prefix = "example")
public class ExampleProperties {
    private String property;
    // Getter & Setter
}

5. Spring Cloud Bus와 연동

  • refresh 작업을 개별 서비스에서 일일이 수행하기 번거롭기 때문에 Spring Cloud Bus를 사용해 이를 자동화할 수 있습니다.
  • Spring Cloud Bus는 Kafka 또는 RabbitMQ와 같은 메시지 브로커를 통해 refresh 이벤트를 여러 서비스에 전파합니다.

작동 방식:

  1. Config 서버에서 설정 변경.
  2. /actuator/bus-refresh 호출.
  3. 메시지 브로커를 통해 모든 클라이언트 애플리케이션에 설정 변경 이벤트 전달.
  4. 클라이언트 애플리케이션이 /actuator/refresh를 호출하여 변경 사항 반영.

6. refresh의 동작 범위

refresh 호출 시 갱신되는 범위는 다음과 같습니다:

범위 설명
Environment 설정 파일이나 외부 Config 서버의 값 변경 사항 갱신.
@RefreshScope @RefreshScope로 선언된 빈의 상태 및 값을 다시 로드.
라우팅 정보 Spring Cloud Gateway의 라우팅 테이블 갱신.
Custom Components 직접 만든 컴포넌트의 상태나 동작 변경(예: 설정 기반 동작 로직 수정).

7. 주의 사항

  1. 전체 애플리케이션이 다시 초기화되는 것은 아님:
    • /actuator/refresh는 애플리케이션 컨텍스트의 일부만 다시 로드합니다.
    • 빈(Bean)이 @RefreshScope로 선언되지 않으면 갱신되지 않습니다.
  2. 보안 문제:
    • /actuator/refresh는 민감한 엔드포인트로, 인증 및 인가를 설정해야 합니다.
    • 운영 환경에서는 Spring Security를 사용해 보호해야 합니다.
  3. 퍼포먼스:
    • 너무 빈번한 refresh 호출은 애플리케이션 성능에 영향을 미칠 수 있습니다.
    • 필요할 때만 호출하도록 설계해야 합니다.

8. 간단 요약

  • /actuator/refresh: Spring Cloud Config 설정 변경 시 사용하는 엔드포인트로, @RefreshScope 빈을 갱신.
  • /actuator/gateway/refresh: Spring Cloud Gateway의 라우팅 정보 변경 시 사용하는 엔드포인트.
  • Spring Cloud Bus: 여러 애플리케이션에 refresh 이벤트를 전파하여 설정 변경을 자동으로 동기화.

/actuator/refresh/actuator/gateway/refresh는 서로 다른 목적과 환경에서 사용됩니다. 두 엔드포인트는 모두 Spring Actuator에서 제공하는 기능이지만, 사용하는 컨텍스트와 갱신 대상이 다릅니다. 차이점을 하나씩 살펴보겠습니다.

 


 

1. /actuator/refresh

  • 주요 사용 환경: Spring Cloud Config와 함께 사용.
  • 역할:
    • 애플리케이션 컨텍스트에서 동적으로 변경된 환경 설정을 반영합니다.
    • 주로 Spring Cloud Config 서버로부터 가져온 설정을 업데이트하기 위해 사용됩니다.
    • @RefreshScope로 지정된 빈만 다시 초기화되며, 전체 애플리케이션 컨텍스트를 다시 로드하지 않습니다.

사용 시나리오

  • Spring Cloud Config에서 외부 설정 파일을 변경한 후, 이를 실행 중인 애플리케이션에 반영하고 싶을 때.
  • 로깅 레벨, API 키, 데이터베이스 연결 설정 등 애플리케이션 전역 설정 변경이 필요할 때.

동작

  1. Config 서버에서 설정 변경.
  2. /actuator/refresh에 POST 요청을 보냄.
  3. @RefreshScope로 선언된 빈이 갱신됨.

예시

curl -X POST http://localhost:8080/actuator/refresh

2. /actuator/gateway/refresh

  • 주요 사용 환경: Spring Cloud Gateway.
  • 역할:
    • Spring Cloud Gateway의 라우팅 정보를 실시간으로 갱신합니다.
    • Gateway는 동적으로 라우팅 규칙을 관리하며, /actuator/gateway/refresh를 통해 이 정보를 갱신할 수 있습니다.
    • 라우팅 정보는 보통 application.yml이나 Config 서버의 설정 파일에 정의됩니다.

사용 시나리오

  • Gateway 라우팅 변경이 필요할 때.
    • 예: 새로운 백엔드 서비스 추가, 기존 서비스 URL 변경, 로드 밸런싱 정책 수정 등.
  • API Gateway의 설정을 즉시 반영해야 하는 경우.

동작

  1. Config 서버 또는 설정 파일에서 라우트 정보 변경.
  2. /actuator/gateway/refresh에 POST 요청을 보냄.
  3. Spring Cloud Gateway가 변경된 라우팅 정보를 다시 로드.

예시

  • application.yml에서 라우트 정보 정의:
  • spring: cloud: gateway: routes: - id: user-service uri: http://localhost:8081 predicates: - Path=/users/**
  • /actuator/gateway/refresh 호출:
  • curl -X POST http://localhost:8080/actuator/gateway/refresh

주요 차이점

구분 /actuator/refresh /actuator/gateway/refresh
사용 대상 Spring Cloud Config 설정 Spring Cloud Gateway 라우팅 정보
갱신 범위 @RefreshScope로 선언된 빈 Gateway의 라우팅 테이블
주요 사용 시나리오 전역 설정 변경 (예: 로깅 레벨, DB 연결 설정 등) API Gateway 라우팅 변경
Spring Cloud 의존성 Spring Cloud Config Spring Cloud Gateway
갱신 대상 예시 로깅 레벨, 환경 변수 라우트 추가/삭제, 백엔드 서비스 URL 변경
엔드포인트 제공 주체 Spring Cloud Context Spring Cloud Gateway

결론

  • /actuator/refresh는 Spring Cloud Config 설정 변경을 반영하기 위한 엔드포인트로, 애플리케이션의 전역 설정을 갱신합니다.
  • /actuator/gateway/refresh는 Spring Cloud Gateway의 라우팅 정보를 갱신하기 위한 엔드포인트로, Gateway의 동적 라우팅 변경에 사용됩니다.

'MSA' 카테고리의 다른 글

UserContextHolder  (0) 2024.12.16
MSA에서의 필터(Filter)와 인터셉터(Interceptor)  (0) 2024.12.16
Netflix Zuul ( API 게이트웨이 )  (1) 2024.12.16
폴백(Fallback)  (0) 2024.12.13
Resilience4j  (0) 2024.12.13