Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package site.icebang.common.health.service;

import org.springframework.stereotype.Service;
import org.springframework.web.client.RestClient;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
Expand All @@ -14,7 +14,7 @@
@RequiredArgsConstructor
public class HealthCheckService {

private final RestTemplate restTemplate;
private final RestClient restClient;

private final FastApiProperties fastApiProperties;

Expand All @@ -24,7 +24,7 @@ public String ping() {
log.info("Attempting to connect to FastAPI server at: {}", url);

try {
return restTemplate.getForObject(url, String.class);
return restClient.get().uri(url).retrieve().body(String.class);
} catch (RestClientException e) {
log.error("Failed to connect to FastAPI server at {}. Error: {}", url, e.getMessage());
return "ERROR: Cannot connect to FastAPI";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
import org.slf4j.MDC;
import org.springframework.http.*;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestClient;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
Expand All @@ -14,8 +14,8 @@
/**
* μ™ΈλΆ€ FastAPI μ„œλ²„μ™€μ˜ λͺ¨λ“  HTTP 톡신을 μ „λ‹΄ν•˜λŠ” μ–΄λŒ‘ν„° ν΄λž˜μŠ€μž…λ‹ˆλ‹€.
*
* <p>이 ν΄λž˜μŠ€λŠ” λ‚΄λΆ€ μ‹œμŠ€ν…œμ˜ λ‹€λ₯Έ 뢀뢄듀이 μ™ΈλΆ€ μ‹œμŠ€ν…œμ˜ μƒμ„Έν•œ 톡신 방법을 μ•Œ ν•„μš”κ°€ 없도둝 HTTP μš”μ²­/응닡 λ‘œμ§μ„ μΊ‘μŠν™”ν•©λ‹ˆλ‹€. {@code
* RestTemplate}을 μ‚¬μš©ν•˜μ—¬ μ‹€μ œ 톡신을 μˆ˜ν–‰ν•˜λ©°, λͺ¨λ“  FastAPI μš”μ²­μ€ 이 클래슀의 {@code call} λ©”μ†Œλ“œλ₯Ό 톡해 이루어져야 ν•©λ‹ˆλ‹€.
* <p>이 ν΄λž˜μŠ€λŠ” λ‚΄λΆ€ μ‹œμŠ€ν…œμ˜ λ‹€λ₯Έ 뢀뢄듀이 μ™ΈλΆ€ μ‹œμŠ€ν…œμ˜ μƒμ„Έν•œ 톡신 방법을 μ•Œ ν•„μš”κ°€ 없도둝 HTTP μš”μ²­/응닡 λ‘œμ§μ„ μΊ‘μŠν™”ν•©λ‹ˆλ‹€. {@code RestClient}을
* μ‚¬μš©ν•˜μ—¬ μ‹€μ œ 톡신을 μˆ˜ν–‰ν•˜λ©°, λͺ¨λ“  FastAPI μš”μ²­μ€ 이 클래슀의 {@code call} λ©”μ†Œλ“œλ₯Ό 톡해 이루어져야 ν•©λ‹ˆλ‹€.
*
* <h2>μ‚¬μš© 예제:</h2>
*
Expand All @@ -34,7 +34,7 @@
@RequiredArgsConstructor
public class FastApiAdapter {

private final RestTemplate restTemplate;
private final RestClient restClient;
private final FastApiProperties properties;

/**
Expand All @@ -47,26 +47,32 @@ public class FastApiAdapter {
* @param method μ‚¬μš©ν•  HTTP λ©”μ†Œλ“œ (예: HttpMethod.POST)
* @param requestBody μš”μ²­μ— 담을 JSON λ¬Έμžμ—΄
* @return 성곡 μ‹œ API 응닡 Body λ¬Έμžμ—΄, μ‹€νŒ¨ μ‹œ null
* @see RestTemplate
* @see RestClient
* @since v0.1.0
*/
public String call(String endpoint, HttpMethod method, String requestBody) {
String fullUrl = properties.getUrl() + endpoint;
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);

String traceId = MDC.get("traceId");
if (traceId != null) {
headers.set("X-Request-ID", traceId);
log.debug("TraceID 헀더 μΆ”κ°€: {}", traceId);
}

HttpEntity<String> requestEntity = new HttpEntity<>(requestBody, headers);

try {
log.debug("FastAPI μš”μ²­: URL={}, Method={}, Body={}", fullUrl, method, requestBody);

ResponseEntity<String> 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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -17,13 +16,13 @@
/**
* μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ›Ή κ΄€λ ¨ 섀정을 λ‹΄λ‹Ήν•˜λŠ” Java 기반 μ„€μ • ν΄λž˜μŠ€μž…λ‹ˆλ‹€.
*
* <p>이 ν΄λž˜μŠ€λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ „μ—­μ—μ„œ μ‚¬μš©λ  μ›Ή κ΄€λ ¨ 빈(Bean)듀을 μƒμ„±ν•˜κ³  κ΅¬μ„±ν•©λ‹ˆλ‹€. ν˜„μž¬λŠ” μ™ΈλΆ€ API 톡신을 μœ„ν•œ {@code RestTemplate} λΉˆμ„
* μ€‘μ•™μ—μ„œ κ΄€λ¦¬ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€.
* <p>이 ν΄λž˜μŠ€λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ „μ—­μ—μ„œ μ‚¬μš©λ  μ›Ή κ΄€λ ¨ 빈(Bean)듀을 μƒμ„±ν•˜κ³  κ΅¬μ„±ν•©λ‹ˆλ‹€. ν˜„μž¬λŠ” μ™ΈλΆ€ API 톡신을 μœ„ν•œ {@code RestClient} λΉˆμ„ μ€‘μ•™μ—μ„œ
* κ΄€λ¦¬ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€.
*
* <h2>μ£Όμš” κΈ°λŠ₯:</h2>
*
* <ul>
* <li>컀λ„₯μ…˜ 및 읽기 νƒ€μž„μ•„μ›ƒμ΄ μ„€μ •λœ RestTemplate 빈 생성
* <li>컀λ„₯μ…˜ 및 읽기 νƒ€μž„μ•„μ›ƒμ΄ μ„€μ •λœ RestClient 빈 생성
* </ul>
*
* @author jihu0210@naver.com
Expand All @@ -33,29 +32,21 @@
public class WebConfig {

/**
* μ™ΈλΆ€ API 톡신을 μœ„ν•œ RestTemplate λΉˆμ„ μƒμ„±ν•˜μ—¬ μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ— λ“±λ‘ν•©λ‹ˆλ‹€.
* μ™ΈλΆ€ API 톡신을 μœ„ν•œ RestClient λΉˆμ„ μƒμ„±ν•˜μ—¬ μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ— λ“±λ‘ν•©λ‹ˆλ‹€.
*
* <p>κΈ°λ³Έ {@code RestTemplateBuilder}λ₯Ό μ‚¬μš©ν•˜λ˜, 컀λ„₯μ…˜ 및 읽기 νƒ€μž„μ•„μ›ƒμ„ 각각 30초둜 λͺ…μ‹œμ μœΌλ‘œ μ„€μ •ν•˜κΈ° μœ„ν•΄ {@code
* SimpleClientHttpRequestFactory}λ₯Ό κ΅¬μ„±ν•˜μ—¬ μ£Όμž…ν•©λ‹ˆλ‹€. μ΄λ ‡κ²Œ μƒμ„±λœ RestTemplate λΉˆμ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ‹€λ₯Έ μ»΄ν¬λ„ŒνŠΈμ—μ„œ μ£Όμž…λ°›μ•„ μ™ΈλΆ€
* μ‹œμŠ€ν…œκ³Όμ˜ HTTP 톡신에 μ‚¬μš©λ©λ‹ˆλ‹€.
* <p>컀λ„₯μ…˜ 및 읽기 νƒ€μž„μ•„μ›ƒμ„ 각각 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();
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Loading
Loading