1 분 소요

FeignClient를 사용하면서 유용한 기능(로그, 예외처리)들에 대해 살펴보자.

Logging

user-service

application.yml

logging:
  level:
    com.example.userservice.client: DEBUG

UserServiceApplication.java

import feign.Logger;

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class UserServiceApplication {
    ...
    @Bean
    public Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }
}

테스트

OrderServiceClient에서 @GetMapping()의 주소를 잘못된 주소인 /order-service/{userId}/orders_ng으로 변경해보자.
(원래는 맨 마지막 _ng를 뺀, /order-service/{userId}/orders 이었다!)
스크린샷 2022-10-07 오후 5 41 01

user-service 재기동 후, 회원가입 -> 상품 주문 -> 회원 단건 조회 순으로 실행하자.
스크린샷 2022-10-07 오후 5 32 43
위와 같은 에러가 발생한다.
이때, 500 Unternal Server Error가 발생하는데, 이것은 사용자의 요청이 잘못된 것이기 때문에 4xx 에러로 응답하는게 맞을 것이다.
이는 아래 Exception 파트에서 해결해보도록 할 것이다.

이제 user-service의 인텔리제이 콘솔에서 로그를 확인해보자.
스크린샷 2022-10-07 오후 5 36 23
위와 같이 로그를 통해 요청한 주소, 헤더값, 반환 받은 페이로드 값들을 확인할 수 있다.

Exception

현재, [회원 단건 조회]에서 회원의 [주문 내역]까지 보여줄 수 있도록 되어있다.

그런데 user-service에서 [주문 내역]을 호출하는 order-service의 url 이 잘못 설정되어있을 때,
위에서 테스트 해 본 것과 같이 [회원 단건 조회] 자체가 실패해버린다.

그런데 이렇게 하지 말고,
Exception Handling을 통해, [회원 단건 조회] 시 order-service 설정이 잘못되어있다면,
[주문 내역]은 제외하고, 회원의 기본 정보인 email, name, userId에 대해서는 응답할 수 있도록 코드를 변경하자.

user-service

UserServiceImpl.java

@Service
@Slf4j
public class UserServiceImpl implements UserService {

    @Override
    public UserDto getUserByUserId(String userId) {

        UserEntity userEntity = userRepository.findByUserId(userId);
        UserDto userDto = new ModelMapper().map(userEntity, UserDto.class);

        // 주문 생성
        /* Using FeignClient */
        /* 🌟 Feign exception handling */
        List<ResponseOrder> orderList = null;
        try{
            orderList = orderServiceClient.getOrders(userId);
        } catch (FeignException ex) {
            log.error(ex.getMessage());
        }

        userDto.setOrders(orderList);

        return userDto;
    }
    ...
}

테스트

user-service 재기동 후, 회원가입 -> 상품 주문 -> 회원 단건 조회 순으로 실행하자.
(아직 OrderServiceClient@GetMapping()에는 잘못된 주소인 /order-service/{userId}/orders_ng가 들어있다.)
스크린샷 2022-10-07 오후 5 48 10
이번에는 200 OK 이다.
그리고 회원 정보에 대해서는 정상적으로 응답하고, [주문 내역]에 대해서만 응답하지 않은 것을 확인할 수 있다.



💛 개인 공부 기록용 블로그입니다. 👻

맨 위로 이동하기