Feign Client

By | 2022년 7월 28일
Table of Content

Feign Client

참조

Rest API 호출과 Json 을 클래스로 자동변환까지 해주는 라이브러리이다.

의존성

dependencies {
    compile("org.springframework.cloud:spring-cloud-starter-openfeign")
}

활성화

@EnableFeignClients
@SpringBootApplication
public class HelloApplication {
    public static void main(String[] args) {
        SpringApplication.run(HelloApplication.class, args);
    }
}

설정

public class FeignClientConfig implements Jackson2ObjectMapperBuilderCustomizer {
    private static final Logger log = LoggerFactory.getLogger(FeignClientConfig.class);

    public FeignClientConfig() {
    }

    @Bean
    public FeignFormatterRegistrar localDateFeignFormatterRegister() {
        return (registry) -> {
            DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar();
            registrar.setUseIsoFormat(true);
            registrar.registerFormatters(registry);
        };
    }

    @Bean
    public FeignErrorDecoder decoder() {
        return new FeignErrorDecoder();
    }

    public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
        jacksonObjectMapperBuilder
                .featuresToEnable(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL)
                .featuresToDisable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
                .timeZone(TimeZone.getDefault())
                .modulesToInstall(new Module[]{new JavaTimeModule()})
                .locale(Locale.getDefault()).simpleDateFormat("yyyy-MM-dd HH:mm:ss");
    }
}
public class FeignRetryConfig {
    @Value("${feign.retry.period}")
    private long period;
    @Value("${feign.retry.max-period}")
    private long maxPeriod;
    @Value("${feign.retry.max-attempt}")
    private int maxAttempt;

    public FeignRetryConfig() {
    }

    @Bean
    public Retryer retryer() {
        return new Retryer.Default(this.period, this.maxPeriod, this.maxAttempt);
    }
}

서비스

@FeignClient(name = "HELLO-SERVICE",configuration = {FeignClientConfig.class, FeignRetryConfig.class})
public interface HelloService {
    @GetMapping("/hello/{itemId}")
    HelloModel getHelloByItemId(@PathVariable("itemId") String itemId);

    @PostMapping("/hello/basic")
    ProductDetailBasicResponseModel fetchHello(
            @RequestBody List<ItemidOnlyDto> req
    );
}

후기

첨 JPA 접했을 때,
명령 하나 호출하면,
지 혼자 쿼리 작성해서 호출하고 리턴값 받아서 엔터티에 채워주고…
신기했는데…

딱 그느낌이다.
명령 하나 호출하면,
지 혼자 RequestBody 생성해서 url 호출하고,
리턴 json 받아서 response class 에 매핑까지 해준다.
심지어 서버가 죽어 있으면 retry 까지도 해준다.

더군다나,
learning curve 라는 단어 쓰는게 민망할 정도로 쉽다.

헐…
(머리가 나쁘면 손가락이 고생한다.)

답글 남기기