Feign Interceptor, Feign ErrorDecoder 두가지 기능만 사용해서 프로젝트에 적용할 것이다!
Feign Interceptor 기능을 이용해서 깃허브 닉네임을 조회하는 API 호출시 어떤 값이 넘어갔는지에 대한 log를 남기기 위해 FeignInterceptor 클래스 만들었다. 나는 GET 메서드와 PathVariable을 이용해서 깃허브 API를 호출하기 때문에 GET메서드가 사용되면 path를 보이게 했다.
@Slf4j
@RequiredArgsConstructor(staticName = "of")
public final class FeignInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate template) {
if(template.method()== HttpMethod.GET.name()){
log.info("[GET] Github nickname Path {}",template.path());
}
return;
}
}
Feign ErrorDecoder 기능을 이용해서 존재하지 않는 깃허브 닉네임을 깃허브 API에 넘겼을때 NOT_FOUND_GITHUB_NICKNAME 에러를 발생시키는 부분을 구현하였다! 존재하지 않는 깃허브 닉네임을 깃허브 API에 넘겼을때 깃허브 API는 404를 반환해주기 때문에 해당하는 Http Status가 404라면 NOT_FOUND_GITHUB_NICKNAME 에러를 발생시키도록 했다!
@Slf4j
@RequiredArgsConstructor(staticName = "of")
public class FeignErrorDecoder implements ErrorDecoder {
private final ErrorDecoder errorDecoder = new Default();
@Override
public Exception decode(String methodKey, Response response) {
HttpStatus httpStatus = HttpStatus.resolve(response.status());
if(httpStatus== (HttpStatus.NOT_FOUND)){
log.info("[FeignErrorDecoder] Http Status {}",httpStatus);
throw new NotFoundException(NOT_FOUND_GITHUB_NICKNAME);
}
if(httpStatus== (HttpStatus.BAD_REQUEST)) {
log.info("[FeignErrorDecoder] Http Status {}", httpStatus);
throw new BadRequestException(ErrorCode.GITHUB_SERVER_ERROR);
}
return errorDecoder.decode(methodKey,response);
}
}
실행하기전에 꼭 빈 등록을 해줘야함!
@Configuration
public class FeignConfig {
@Bean
public FeignInterceptor feignInterceptor(){
return FeignInterceptor.of();
}
@Bean
public FeignErrorDecoder feignErrorDecoder(){
return FeignErrorDecoder.of();
}
}
컨트롤러에서 Test 해봤을 때
@GetMapping("/version2/{nickname}")
public void test2(@PathVariable String nickname){
log.info("닉네임 : {}",nickname);
GithubNicknameResponseDto testDto = userAccountService.getGithubUserVersion2(nickname);
log.info("닉네임 : {}",testDto.getNickname());
log.info("이미지 : {}",testDto.getImg());
}
잘 나오는 것을 볼 수 있다!!