ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • API 호출을 위한 세 가지 Spring 도구(Spring 6에서 새롭게 지원하는 HttpInterface)
    각종 학습 요약/Spring 2023. 3. 17. 14:12

    개요

    오늘 포스팅은 토비님의 'Spring 6의 새로운 HTTP Interface와 3 가지 REST Clients 라이브 코딩' 영상을 보고 나서 작성하는 글입니다.

    Spring에서 제공하는 RestTemplateWebClient, 그리고 Spring 6에서 새롭게 제공하게 된 HttpInterface를 간단히 살펴봅니다.

    어떻게 사용되는지 하나씩 코드로 살펴보겠습니다.


    1. RestTemplate


    간단히 실행 결과 확인을 위해 ApplicationRunner를 사용합니다. RestTemplate은 Spring3.0 부터 사용되어온 동기 방식의 클라이언트입니다. Spring Web 프로젝트를 사용하면서 외부의 api를 호출할 일이 있으면 가장 편하게 선택할 수 있는 방법인 것 같아요.
    사용 방법 자체는 크게 어려울 것이 없습니다. RestTemplate을 생성해서 getFor~~~()로 결과를 받을 수 있습니다. json string으로 받을 수도 있고, 객체를 매핑할 수도 있습니다.
    위의 예제에서는 환율을 달러 기준으로 조회할 수 있는 api인데요, 결과값을 Map으로 받고 있네요. base_code가 USD로, USD에 대비하여 KRW이 얼마인지가 잘 출력되는 모습을 볼 수 있습니다.

    2. WebClient


    Spring Webflux 의존성을 추가하면 WebClient를 api client로 사용할 수 있습니다. Webflux 프로젝트를 사용하고 있지 않았다면, WebClient를 위해 Webflux를 추가해야 한다는 점, 그리고 비동기가 기본 동작 방식이기 때문에, block()을 사용해야 한다는 점에서 사용이 꺼려질 수도 있겠습니다.
    하지만 반대로 Webflux 프로젝트 중이라면 WebClient를 사용하지 않을 이유가 없겠죠? WebClient는 비동기와 fluent API, 스트리밍까지 지원하기 때문에 Spring 커뮤니티에서도 사용을 권장하고 있습니다.

    이런 특별한 기능이 필요하다면 WebClient를, 간단한 api call만 필요하다면 RestTemplate을 선택할 수 있겠네요. 여기에 사족을 하나 덧붙이자면, RestTemplate이 Deprecated 되었기 때문에(혹은 될 것이기 때문에) WebClient를 사용하라고 권장하는 경우가 많은데, 현재로서는 정해진 Deprecated 계획을 없다고 합니다. 아주 예전에 언젠가 RestTemplate의 JavaDoc에서 '미래에 Deprecated 될 것이다'라는 문구가 쓰여있었던 적이 있어서 그런 이야기가 퍼진 것 같지만, 현재는 해당 문구는 삭제되어 'Deprecated'라는 표현은 볼 수 없게 된 상태입니다.

    3. HttpInterface


    마지막으로 소개할 것은 HttpInterface입니다. Spring 6에서 새롭게 지원하게 된 따끈따끈한 피쳐입니다. HttpInterface를 사용하기 위해서는 그 이름답게 interface 구현이 필요합니다. 위 코드에서는 ErApi라는 이름의 인터페이스를 만들어서, 43~47 라인처럼 어노테이션을 붙여서 정의했습니다. 만들어진 인터페이스 타입을 HttpServiceProxyFactory#createClient()의 인자로 넘겨주면 인스턴스를 얻을 수 있습니다.


    ErApi를 빈으로 등록하게 되면 사용하는 쪽의 코드가 좀 더 간결해집니다. 빈을 등록하는 쪽에 HttpServiceProxyFactory를 빌드하여 api client를 반환하는 코드가 들어가 있습니다(자세한 코드는 깃헙을 확인해주세요.).
    이렇게 사용하는 쪽에서 구체적인 구현이 어떻게 되는지 기술할 필요가 없게 되면, 비즈니스 로직에만 집중할 수 있게 되고, 결과적으로는 코드의 의미가 더 명확해집니다. 좀 더 Spring스럽다고 할 수 있겠네요. 🌱

    결론

    처리할 트래픽이 매우 높은 상황이 아니라면, 성능에 있어서 유의미한 차이를 느끼기는 어려울 것 같습니다. '편리한 도구'라는 점과 '깔끔한 코드'의 사이에서 적절한 선택을 하면 될 것 같습니다. 만약 Spring 6를 사용할 수 있는 환경이 주어진다면, HttpInterface의 사용도 고려할 것 같네요.

    사실은 직접 사용할 어떤 도구가 필요해서 구현하려던 차에 마침 토비님의 영상을 보게 된 것이라, HttpInterface를 바로 적용해볼 것 같아요. 다음에는 해당 도구를 만들고 사용한 기록을 남겨봐도 재밌겠네요.

    긴 글 읽어주셔서 감사합니다. 😇

    댓글

Designed by Tistory.