Spring에서 refresh
는 실행 중인 애플리케이션이 설정이나 상태를 동적으로 갱신하도록 돕는 메커니즘입니다. 주로 Spring Cloud 환경에서 설정 값 변경, 라우팅 정보 업데이트, Bean 재초기화 등에 사용됩니다.
1. refresh
의 기본 개념
- 동적 갱신: 애플리케이션이 실행 중인 상태에서 설정 파일이나 라우팅 정보 등의 변경 사항을 즉시 반영할 수 있게 합니다.
- Spring에서
refresh
는 애플리케이션 컨텍스트(Application Context)의 특정 부분을 다시 로드하거나 초기화하여 이를 실현합니다. - 시스템 재시작 없이도 업데이트 사항을 반영할 수 있으므로 가용성과 유연성을 높이는 데 유용합니다.
2. 주요 용도
- Spring Cloud Config와 연동:
- 외부 Config 서버에서 설정 변경 사항을 반영.
- 예: 데이터베이스 연결 정보, 로깅 레벨 등.
- Spring Cloud Gateway 라우팅 정보 갱신:
- Gateway에서 라우팅 규칙이 변경되었을 때 이를 동적으로 적용.
- 운영 중 설정 최적화:
- 실행 중에 애플리케이션을 재배포하지 않고도 설정 변경.
3. refresh
가 작동하는 방식
Spring에서 refresh
는 특정 엔드포인트를 호출하거나 자동화된 이벤트를 통해 설정 및 상태를 갱신합니다.
a. /actuator/refresh
- Spring Cloud Config와 함께 사용되며, 설정 변경 사항을 반영.
- 작동 원리:
- Config 서버에서 설정 값을 변경.
- 클라이언트 애플리케이션에서
/actuator/refresh
엔드포인트 호출. @RefreshScope
로 선언된 빈(Bean)이 갱신.
b. /actuator/gateway/refresh
- Spring Cloud Gateway의 라우팅 정보를 갱신.
- 작동 원리:
- Gateway의 라우트 정보가 변경됨.
/actuator/gateway/refresh
호출.- 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
이벤트를 여러 서비스에 전파합니다.
작동 방식:
- Config 서버에서 설정 변경.
/actuator/bus-refresh
호출.- 메시지 브로커를 통해 모든 클라이언트 애플리케이션에 설정 변경 이벤트 전달.
- 클라이언트 애플리케이션이
/actuator/refresh
를 호출하여 변경 사항 반영.
6. refresh
의 동작 범위
refresh
호출 시 갱신되는 범위는 다음과 같습니다:
범위 | 설명 |
---|---|
Environment | 설정 파일이나 외부 Config 서버의 값 변경 사항 갱신. |
@RefreshScope 빈 |
@RefreshScope 로 선언된 빈의 상태 및 값을 다시 로드. |
라우팅 정보 | Spring Cloud Gateway의 라우팅 테이블 갱신. |
Custom Components | 직접 만든 컴포넌트의 상태나 동작 변경(예: 설정 기반 동작 로직 수정). |
7. 주의 사항
- 전체 애플리케이션이 다시 초기화되는 것은 아님:
/actuator/refresh
는 애플리케이션 컨텍스트의 일부만 다시 로드합니다.- 빈(Bean)이
@RefreshScope
로 선언되지 않으면 갱신되지 않습니다.
- 보안 문제:
/actuator/refresh
는 민감한 엔드포인트로, 인증 및 인가를 설정해야 합니다.- 운영 환경에서는 Spring Security를 사용해 보호해야 합니다.
- 퍼포먼스:
- 너무 빈번한
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 키, 데이터베이스 연결 설정 등 애플리케이션 전역 설정 변경이 필요할 때.
동작
- Config 서버에서 설정 변경.
/actuator/refresh
에 POST 요청을 보냄.@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의 설정을 즉시 반영해야 하는 경우.
동작
- Config 서버 또는 설정 파일에서 라우트 정보 변경.
/actuator/gateway/refresh
에 POST 요청을 보냄.- 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 |