728x90
Feign Client의 인터셉터 설정을 해보겠습니다.
인터셉터의 경우 우리가 요청을 보낼 때 한 곳에서 요청에 필요로 하는 공통적인 설정을 할 수 있는 곳이라 생각하시면 됩니다.
DemoFeignInterceptor
@RequiredArgsConstructor(staticName = "of")
public class DemoFeignInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate template) {
//get 요청일 경우
if (template.method() == Request.HttpMethod.GET.name()) {
System.out.println("[GET] [DemoFeignInterceptor] queries : " + template.headers());
System.out.println("[GET] [DemoFeignInterceptor] queries : " + template.queries());
return;
}
//post 요청일 경우
String encodedRequestBody = StringUtils.toEncodedString(template.body(), StandardCharsets.UTF_8);
System.out.println("[POST] [DemoFeignInterceptor] requestBody : " + encodedRequestBody);
//추가적으로 본인이 필요한 로직을 추가
//encodedRequestBody 스트링이기 때문에 objectmapper를 통해 json 객체로풀어 값을 세팅해주어야한다.
String convertRequestBody = encodedRequestBody;
template.body(convertRequestBody);
}
}
RequestInterceptor 를 상속받은 뒤 apply 메서드를 구현해 줍니다.
RequestTemplate를 보면 요청하는 데에 필요한 값들을 다 확인할 수 있습니다.
저는 메서드에 따라 현재 분기 처리를 해놓은 상태입니다.
여기서 인터셉터의 목적을 알아보면 요청 보내기 전 한 곳에서 요청에 필요한 설정을 하는 곳이라 생각하면 좋다고 했습니다.
그렇다면 만약 외부 API를 요청할 때마다 헤더 값을 보내야 한다면 기존 코드와는 다르게
Interceptor에서 다음과 같이 헤더를 세팅해 줄 수 있습니다.
if (template.method() == Request.HttpMethod.GET.name()) {
template.header("CustomHeaderName", "aa");
System.out.println("[GET] [DemoFeignInterceptor] queries : " + template.headers());
System.out.println("[GET] [DemoFeignInterceptor] queries : " + template.queries());
return;
}
결과 값 또한 잘 나옵니다.
이제 포스트요청을 살펴보겠습니다.
DemoConfig
@Configuration
@RequiredArgsConstructor
public class DemoFeignConfig {
@Bean
public DemoFeignInterceptor feignInterceptor() {
return DemoFeignInterceptor.of();
}
}
위의 인터셉터를 빈으로 등록해 주는 구성파일입니다.
DemoFeignClient
@FeignClient(
name = "demo-client",
url = "${feign.url.prefix}",
configuration = DemoFeignConfig.class
)
public interface DemoFeignClient {
@GetMapping("/get") // -> http://localhost:8080/target_server/get get 으로 요청이 감
ResponseEntity<BaseResponseInfo> callGet(@RequestHeader("CustomHeaderName") String customHeader,
@RequestParam("name") String name,
@RequestParam("age") Long age);
@PostMapping("/post") // -> http://localhost:8080/target_server/post post 으로 요청이 감
ResponseEntity<BaseResponseInfo> callPost(@RequestHeader("CustomHeaderName") String customHeader,
@RequestBody BaseRequestInfo baseRequestInfo);
}
여기서 configuration에서 DemoFeignConfig.class를 선언해 줌으로써 인터셉터를 빈으로 등록하고 이 빈을 Feign Client에서 사용할 수 있도록 합니다.
이제 이 값을 잘 사용하기만 하면 됩니다.
DemoService
public String post() {
BaseRequestInfo baseRequestInfo = BaseRequestInfo.builder()
.name("customName")
.age(2L)
.build();
ResponseEntity<BaseResponseInfo> response =
demoFeignClient.callPost("CustomHeader", baseRequestInfo);
System.out.println("Name = " + Objects.requireNonNull(response.getBody()).getName());
System.out.println("Age : " + response.getBody().getAge());
System.out.println("Header : " + response.getBody().getHeader());
return "post";
}
값들이 잘 출력되는 것을 확인할 수 있습니다
728x90
'Spring Boot > Feign Client' 카테고리의 다른 글
Feign Client - Error Decoder 및 logger (0) | 2023.01.15 |
---|---|
Feign Client 기본 구성 및 흐름 (0) | 2023.01.14 |
댓글