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.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
책 검색을 위해 외부(카카오) API를 호출해야 하는 상황입니다.
스프링에서 제공하는 클라이언트 중 아래의 3가지의 특징과 장단점을 비교해보고자 합니다.
Beta Was this translation helpful? Give feedback.
All reactions