본문 바로가기
BackEnd/Project

[RealPJ] Ch02. 실무 스타일로 Feign Client 사용해보기 - Interceptor

by 개발 Blog 2024. 8. 30.

공부 내용을 정리하고 앞으로의 학습에 이해를 돕기 위해 작성합니다.

 

지난 시간에 이어서 Feign Client에서 요청을 보낼 때 Interceptor를 설정하여, 공통적으로 필요한 설정이나 작업을 미리 처리할 수 있도록 한다.

 

의존성 추가

ext {
    set('commonsLangVersion', '3.12.0')
}

// for `StringUtils`
// https://mvnrepository.com/artifact/org.apache.commons/commons-lang3
implementation "org.apache.commons:commons-lang3:${commonsLangVersion}"
  • StringUtils 클래스를 사용하여 인코딩 된 문자열을 처리하기 위해 commons-lang3 라이브러리를 추가한다.
  • 이 라이브러리는 문자열 조작과 관련된 다양한 기능을 제공한다.

Interceptor 구현

package dev.be.feign.feign.interceptor;

import feign.Request;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;

import java.nio.charset.StandardCharsets;

@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.queries());
            return;
        }

        // post 요청일 경우
        String encodedRequestBody = StringUtils.toEncodedString(template.body(), StandardCharsets.UTF_8);
        System.out.println("[POST] [DemoFeignInterceptor] request body : " + encodedRequestBody);
        

        String convertRequestBody = encodedRequestBody;

        template.body(convertRequestBody);

    }
}
  • DemoFeignInterceptor 클래스를 구현하여 RequestInterceptor를 상속받고, apply 메서드를 오버라이드한다.
  • GET 요청의 경우 쿼리 파라미터를 출력하고, POST 요청의 경우 요청 본문을 인코딩하여 출력한 뒤, 본문을 재설정한다.
  • 이를 통해 각 요청에 대한 공통 작업을 수행할 수 있다.

Interceptor 빈 등록

package dev.be.feign.feign.config;

import dev.be.feign.feign.interceptor.DemoFeignInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class DemoFeignConfig {

    @Bean
    public DemoFeignInterceptor feignInterceptor() {
        return DemoFeignInterceptor.of();
    }
}
  • DemoFeignConfig 클래스에서 DemoFeignInterceptor를 빈으로 등록하여, Feign Client에서 Interceptor를 사용할 수 있도록 설정한다.

POST 요청 처리

package dev.be.feign.controller;

import dev.be.feign.service.DemoService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RequiredArgsConstructor
@RestController
public class DemoController {

    private final DemoService demoService;
    
	...

    @GetMapping("/post")
    public String postController() {
        return demoService.post();
    }
}
  • DemoController에서 POST 요청을 처리하는 엔드포인트를 추가한다.

 

@Service
@RequiredArgsConstructor
public class DemoService {

    private final DemoFeignClient demoFeignClient;

   ...
   
    public String post() {
        BaseRequestsInfo baseRequestsInfo = BaseRequestsInfo.builder()
                .name("customName")
                .age(2L)
                .build();
        ResponseEntity<BaseResponseInfo> response = demoFeignClient.callPost("CustomHeader", baseRequestsInfo);
        System.out.println("Name : " + response.getBody().getName());
        System.out.println("Age : " + response.getBody().getAge());
        System.out.println("Header : " + response.getBody().getHeader());
        return "post";
    }
}
  • DemoService에서 POST 요청을 보내고, 응답을 받아 출력한다.

 

@RestController
@RequestMapping("/target_server")
public class TargetController {
	
    ...

    @PostMapping("/post")
    public BaseResponseInfo demoPost(@RequestHeader("CustomHeaderName") String header,
                                     @RequestBody BaseRequestsInfo body) {
        return BaseResponseInfo.builder()
                .header(header)
                .name(body.getName())
                .age(body.getAge())
                .build();
    }

}
  • 외부 API 역할을 하는 TargetController에서 POST 요청을 받아 처리하고, 응답을 생성하여 반환한다.

서버 실행 및 테스트

서버를 실행한 후 GET 요청과 POST 요청을 각각 테스트한다.

  • GET 요청 시 Interceptor에서 쿼리 파라미터가 출력되며, POST 요청 시 요청 본문이 인코딩 된 후 출력된다.

Feign Client에 Interceptor를 설정하여 공통적인 요청 전처리 작업을 효과적으로 수행할 수 있었다. 실무에서 코드의 재사용성과 유지보수성을 높이는 데 중요한 역할을 한다. 이를 통해 더욱 효율적인 API 통신을 구현할 수 있었다.