MSA

[MSA] Spring Boot - Feign Client Debug, 예외처리, ErrorDecoder사용

차노도리 2023. 4. 25. 00:31

Feign Client - 디버그

  • application.yml Debug 레벨 설정 한다.
  • applition에 feign client log bean을 등록을 한다.

 

applition.yml - debug레벨 설정

logging:
  level:
    com.gugbab.gugbabservices.client: DEBUG

application - bean 등록

package com.gugbab.gugbabservices;

import ...

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class GugbabServicesApplication {

  	...

    // feign Client 로거 등록
    @Bean
    public Logger.Level feignLoggerLevel(){
        return Logger.Level.FULL;
    }


}

 

Feign Client - 예외처리

  • 일반적인 예외 처리랑 똑같다. (FeignException 객체 넘어옴)
        // feign Client 사용
        StarsResponse stars = null;
        try{
         stars = vocaServicesClient.getStarsByUser(userId,headers);
        }catch (FeignException feignException){
            log.error(feignException.getMessage());
        }

 

Feign Client - Error Decoder 사용

  • Bean에 등록해 돼지만 Enviroment 주입받기 위해 @Component 사용
  • MethodKey를 통해 특정 Feign 요청에 대해서만 처리가능
package com.gugbab.gugbabservices.error;

import ...

@Component
public class FeignErrorDecoder implements ErrorDecoder {

    Environment env;

    @Autowired
    public FeignErrorDecoder(Environment env) {
        this.env = env;
    }


    @Override
    public Exception decode(String methodKey, Response response) {
        switch (response.status()) {
            case 400:
                break;
            case 404:
            	// getStarsByUser 메소드에 대해서만 에러 처리
                if (methodKey.contains("getStarsByUser")) {   
                    return new ResponseStatusException(HttpStatus.valueOf(response.status()),
                            env.getProperty("gugbab.public.error.star_empty"));
                }
                break;
            default:
                return new Exception(response.reason());
        }
        return null;
    }
}

 

Feign Client - Error Decoder 사용 예시

  • 따로 예외 처리 해줄필요 없음
// 예외 처리 FeignErrorDecoder로 처리함
StarsResponse stars = vocaServerClient.getStarsByUser(userId,headers);