Spring Boot/Feign Client

Feign Client - Interceptor

수수한개발자 2023. 1. 15.
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

댓글