스프링 Feign Client 적용하기 - (2)

supway·2023년 4월 4일
1

Feign Client

목록 보기
2/2

Feign Client Feature

  • Connection/Read Timeout ⇒ 외부서버와 통신 시 Connection / Read Timeout 설정이 가능하다
  • Feign Interceptor ⇒ 외부로 요청이 나가기 전에 만약 공통적으로 처리해야하는 부분이 있다면 Interceptor를 재정의하여 처리가 가능하다
    • 쓰는 이유 ⇒ 외부 요청을 했을 때 실패가 발생할 경우가 있음 → "그냥 실패 됐으니 확인해주세요" 가 아닌 "내가 이런이런 값들로 요청을 하니깐 실패가 떨어졌다 이런 값들을 살펴봐달라" 혹은 내부적으로 어떤 값들을 요청했는지 관리하기 위한 용도 뿐만 아니라 헤더 설정을 부분마다 하는 것이 아니라 Interceptor에서 한번에 처리 가능하다.
  • Feign CustomLogger⇒ Request / Response 등 운영하기 위한 적절한 Log를 남길 수 있음
  • Feign ErrorDecoder
    ⇒ 요청에 대해 정상 응답이 아닌 경우 핸들링 가능하다
    예를 들어 외부에서 404가 날라왔을 경우 클라이언트에 바로 보내줄 수 없으니 정의 해놓은 에러 값으로 맵핑해서 Exception 을 날려줌

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());
    }


잘 나오는 것을 볼 수 있다!!

profile
개발잘하고싶은사람

0개의 댓글