Replies: 3 comments
-
RestTemplate
대표적인 Spring의 HTTP Client 중 하나이지만, 다음과 같은 대안을 권장하고 있습니다.
주요 특징
기본적인 사용법Bean 등록 @Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
} 요청 예시 @Service
public class ExampleService {
private final RestTemplate restTemplate;
public String getData() {
return restTemplate.getForObject(
"http://example.com/api",
String.class
);
}
} RestTemplate을 사용하여 외부 API를 호출해야하는 상황일 경우 타임아웃(Timeout), 재시도(retry), 로깅(Logging), 서킷 브레이커 등을 설정하는 방법을 알아두면 좋을 것 같습니다.
RestTemplate도 충분히 괜찮은 선택이지만 직접 API 호출 코드를 작성해야한다는 점과 스프링에서 다른 대안 방안을 권장하는 점에서 RestTemplate은 채택하지 않았습니다. |
Beta Was this translation helpful? Give feedback.
-
WebClient
Spring WebFlux에 포함된 HTTP 클라이언트로, Non-Blocking I/O를 활용한 리액티브 프로그래밍 모델을 기반으로 합니다. 주요 특징
기본적인 사용법Bean 등록 @Configuration
public class WebClientConfig {
@Bean
public WebClient webClient() {
return WebClient.builder()
.baseUrl("http://api.example.com")
.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.build();
}
} 요청 예시 @Service
public class ExampleService {
private final WebClient webClient;
public Mono<UserResponse> getUser(String userId) {
return webClient.get()
.uri("/users/{id}", userId)
.retrieve()
.bodyToMono(UserResponse.class);
}
} 채택하지 않은 이유1. 책 검색 API의 비동기 처리 부적합성
비동기 처리는 회원가입 축하 이메일과 같은 즉시 응답이 필요하지 않은 경우에 적합하지만, 현재 상황은 그렇지 않아보입니다. 2. 러닝 커브와 복잡성
WebClient는 비동기/Non-Blocking 이라는 기능을 제공하지만, 프로젝트의 요구사항과 팀의 기술적 배경을 고려할 때 현재 상황에서는 적합하지 않다고 생각했습니다. 물론, WebClient도 비동기를 사용할 수 있지만 다음으로 언급할 FeignClient 형태가 더욱 직관적인 방법이라고 생각했습니다.
|
Beta Was this translation helpful? Give feedback.
-
OpenFeign (FeignClient)
Spring Cloud OpenFeign은 Netflix에서 개발한 선언적 REST 클라이언트로, 주요 특징
기본적인 사용법@FeignClient(name = "book-service", url = "${api.book.url}")
public interface BookClient {
@GetMapping("/api/books")
List<Book> searchBooks(
@RequestParam String query,
@RequestHeader(HttpHeaders.AUTHORIZATION) String authorization
);
}
만약, RestTemplate 을 사용한다 했다면 아래와 같은 코드 구조로 호출을 해야합니다. @Component
@RequiredArgsConstructor
public class BookRestTemplate {
private final RestTemplate restTemplate;
private final String apiUrl;
private final String apiKey;
public List<Book> search(String query) {
String url = createSearchUrl(query);
HttpHeaders headers = createHeaders();
HttpEntity<?> entity = new HttpEntity<>(headers);
ResponseEntity<List<Book>> response = restTemplate.exchange(
url,
HttpMethod.GET,
entity,
new ParameterizedTypeReference<List<Book>>() {}
);
return response.getBody();
}
private String createSearchUrl(String query) {
return UriComponentsBuilder.fromUriString(apiUrl)
.path("/api/books")
.queryParam("query", query)
.encode()
.build()
.toUriString();
}
private HttpHeaders createHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.set(HttpHeaders.AUTHORIZATION, "KEY " + apiKey);
return headers;
}
} 선택 이유
하지만, 어노테이션과 인터페이스 기반으로 테스트를 통해 확인해야하지만 테스트 도구를 지원하지 않는다는 단점이 존재하긴 합니다. |
Beta Was this translation helpful? Give feedback.
-
책 검색을 위해 외부(카카오) API를 호출해야 하는 상황입니다.
스프링에서 제공하는 클라이언트 중 아래의 3가지의 특징과 장단점을 비교해보고자 합니다.
Beta Was this translation helpful? Give feedback.
All reactions