-
API 호출을 위한 세 가지 Spring 도구(Spring 6에서 새롭게 지원하는 HttpInterface)각종 학습 요약/Spring 2023. 3. 17. 14:12
개요
오늘 포스팅은 토비님의 'Spring 6의 새로운 HTTP Interface와 3 가지 REST Clients 라이브 코딩' 영상을 보고 나서 작성하는 글입니다.
Spring에서 제공하는
RestTemplate
과WebClient
, 그리고 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를 바로 적용해볼 것 같아요. 다음에는 해당 도구를 만들고 사용한 기록을 남겨봐도 재밌겠네요.
긴 글 읽어주셔서 감사합니다. 😇
'각종 학습 요약 > Spring' 카테고리의 다른 글
Spring : 이벤트 리스너 기본 개념 (@EventListener, @TransactionalEventListener) (2) 2022.07.11 Spring: Proxy를 통한 Spring Data Repository 초기화와 설정 (2) 2022.07.01 Spring: AOP의 기본적인 개념 & SpringAOP 훑어보기 (2) 2022.06.20 Error Handling: Spring에서 Exception 대응하기 (0) 2022.06.17 Spring: 의존관계 주입(DI, Dependency Injection) 방식 네 가지 요약 (0) 2022.06.16 Spring: IoC와 DI를 예시로 쉽게 이해해보자 (0) 2022.06.16