responseEntity =
- restTemplate.exchange(fullUrl, method, requestEntity, String.class);
+ restClient
+ .method(method)
+ .uri(fullUrl)
+ .contentType(MediaType.APPLICATION_JSON)
+ .headers(
+ headers -> {
+ String traceId = MDC.get("traceId");
+ if (traceId != null) {
+ headers.set("X-Request-ID", traceId);
+ log.debug("TraceID 헤더 추가: {}", traceId);
+ }
+ })
+ .body(requestBody)
+ .retrieve()
+ .toEntity(String.class);
+
String responseBody = responseEntity.getBody();
log.debug("FastAPI 응답: Status={}, Body={}", responseEntity.getStatusCode(), responseBody);
return responseBody;
diff --git a/apps/user-service/src/main/java/site/icebang/global/config/WebConfig.java b/apps/user-service/src/main/java/site/icebang/global/config/WebConfig.java
index 9369f887..9e7a13dc 100644
--- a/apps/user-service/src/main/java/site/icebang/global/config/WebConfig.java
+++ b/apps/user-service/src/main/java/site/icebang/global/config/WebConfig.java
@@ -3,12 +3,11 @@
import java.time.Duration;
import java.util.TimeZone;
-import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
-import org.springframework.web.client.RestTemplate;
+import org.springframework.web.client.RestClient;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
@@ -17,13 +16,13 @@
/**
* 애플리케이션의 웹 관련 설정을 담당하는 Java 기반 설정 클래스입니다.
*
- * 이 클래스는 애플리케이션 전역에서 사용될 웹 관련 빈(Bean)들을 생성하고 구성합니다. 현재는 외부 API 통신을 위한 {@code RestTemplate} 빈을
- * 중앙에서 관리하는 역할을 합니다.
+ *
이 클래스는 애플리케이션 전역에서 사용될 웹 관련 빈(Bean)들을 생성하고 구성합니다. 현재는 외부 API 통신을 위한 {@code RestClient} 빈을 중앙에서
+ * 관리하는 역할을 합니다.
*
*
주요 기능:
*
*
- * - 커넥션 및 읽기 타임아웃이 설정된 RestTemplate 빈 생성
+ *
- 커넥션 및 읽기 타임아웃이 설정된 RestClient 빈 생성
*
*
* @author jihu0210@naver.com
@@ -33,29 +32,21 @@
public class WebConfig {
/**
- * 외부 API 통신을 위한 RestTemplate 빈을 생성하여 스프링 컨테이너에 등록합니다.
+ * 외부 API 통신을 위한 RestClient 빈을 생성하여 스프링 컨테이너에 등록합니다.
*
- * 기본 {@code RestTemplateBuilder}를 사용하되, 커넥션 및 읽기 타임아웃을 각각 30초로 명시적으로 설정하기 위해 {@code
- * SimpleClientHttpRequestFactory}를 구성하여 주입합니다. 이렇게 생성된 RestTemplate 빈은 애플리케이션의 다른 컴포넌트에서 주입받아 외부
- * 시스템과의 HTTP 통신에 사용됩니다.
+ *
커넥션 및 읽기 타임아웃을 각각 30초로 설정한 {@code SimpleClientHttpRequestFactory}를 사용하여 RestClient를 구성합니다.
+ * 이렇게 생성된 RestClient 빈은 애플리케이션의 다른 컴포넌트에서 주입받아 외부 시스템과의 HTTP 통신에 사용됩니다.
*
- * @param builder Spring Boot가 자동으로 구성해주는 RestTemplateBuilder 객체
- * @return 타임아웃이 설정된 RestTemplate 인스턴스
- * @see RestTemplate
- * @see RestTemplateBuilder
+ * @return 타임아웃이 설정된 RestClient 인스턴스
* @since v0.1.0
*/
@Bean
- public RestTemplate restTemplate(RestTemplateBuilder builder) {
- // 1. SimpleClientHttpRequestFactory 객체를 직접 생성
+ public RestClient restClient() {
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
+ requestFactory.setConnectTimeout(Duration.ofSeconds(30));
+ requestFactory.setReadTimeout(Duration.ofSeconds(30));
- // 2. 타임아웃 설정 (이 메서드들은 deprecated 아님)
- requestFactory.setConnectTimeout(Duration.ofSeconds(30000));
- requestFactory.setReadTimeout(Duration.ofSeconds(30000));
-
- // 3. 빌더에 직접 생성한 requestFactory를 설정
- return builder.requestFactory(() -> requestFactory).build();
+ return RestClient.builder().requestFactory(requestFactory).build();
}
/**
diff --git a/apps/user-service/src/test/java/site/icebang/e2e/scenario/ContextLoadE2eTests.java b/apps/user-service/src/test/java/site/icebang/e2e/scenario/ContextLoadE2eTests.java
index 29e5857c..8ddda74d 100644
--- a/apps/user-service/src/test/java/site/icebang/e2e/scenario/ContextLoadE2eTests.java
+++ b/apps/user-service/src/test/java/site/icebang/e2e/scenario/ContextLoadE2eTests.java
@@ -2,8 +2,10 @@
import org.junit.jupiter.api.Test;
+import site.icebang.e2e.setup.annotation.E2eTest;
import site.icebang.e2e.setup.support.E2eTestSupport;
+@E2eTest
class ContextLoadE2eTests extends E2eTestSupport {
@Test
diff --git a/apps/user-service/src/test/java/site/icebang/e2e/scenario/ScheduleManagementE2eTest.java b/apps/user-service/src/test/java/site/icebang/e2e/scenario/ScheduleManagementE2eTest.java
index afdff08c..eeb49627 100644
--- a/apps/user-service/src/test/java/site/icebang/e2e/scenario/ScheduleManagementE2eTest.java
+++ b/apps/user-service/src/test/java/site/icebang/e2e/scenario/ScheduleManagementE2eTest.java
@@ -14,11 +14,6 @@
import site.icebang.e2e.setup.annotation.E2eTest;
import site.icebang.e2e.setup.support.E2eTestSupport;
-/**
- * 스케줄 관련 E2E 시나리오 테스트
- *
- *
ScheduleService 기능을 API 플로우 관점에서 검증
- */
@Sql(
value = {
"classpath:sql/data/00-truncate.sql",
@@ -46,11 +41,15 @@ void createSchedule_success() {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
- HttpEntity