공부 내용을 정리하고 앞으로의 학습에 이해를 돕기 위해 작성합니다.
지난 시간에 이어서 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 통신을 구현할 수 있었다.
'BackEnd > Project' 카테고리의 다른 글
[RealPJ] Ch02. 실무 스타일로 Feign Client 사용해보기 - ErrorDecoder (0) | 2024.08.31 |
---|---|
[RealPJ] Ch02. 실무 스타일로 Feign Client 사용해보기 - Logger (3) | 2024.08.30 |
[RealPJ] Ch02. 실무 스타일로 Feign Client 사용해보기 - 기본 설정 (0) | 2024.08.30 |
[RealPJ] Ch02. 비동기 프로그래밍 개념 및 실습 (0) | 2024.08.30 |
[RealPJ] Ch01. Profile 설정 (0) | 2024.08.30 |