FeignClient 사용법에 대해 알아봅시다. (Spring Cloud OpenFeign)

최동근·2022년 12월 21일
6

Http

목록 보기
2/2
post-custom-banner

안녕하세요 👨‍💻
오늘은 웹 서버 프로그램에서 간단하게 Http Request 를 보내 주는 선언적 Http Client 기능을 하는
"Feign Client" 에 대해 알아보겠습니다.

현재 저는 실전 이커머스 프로젝트를 진행중에 있습니다.

프로젝트를 진행하면서 이메일 인증 시스템 구현을 위해 Mailgun API 를 사용하기로 결정하였습니다.
일반적인 HttpClient 로는 RestTemplate 과 WebTemplate 이 있는데, 중복되는 코드도 많고 사용하기 조금 번거로움이 있어 찾아보던 중 Feign Client 에 대해 알게 되었습니다 🙆🏻

1. Feign Client 란?

Feign Client란 Netflix에서 개발한 Http Client 입니다.
인터페이스를 작성하고 어노테이션을 통해 따로 구현체 없이 Http Client 를 구현 할 수 있습니다.
여기서 Http Client 란 간단히 얘기해서 특정 프로그램에서 Http 요청을 간편하게 만들어서 보낼 수 있도록 돕는 객체라고 생각하시면 됩니다.
원래는 Netflix 에서 자체적인 개발을 진행했지만 현재는 오픈 소스로 전환되어 SpringCloud 프레임 워크의 프로젝트 중 하나로 들어가 있습니다.

2. 왜 Feign Client 를 사용할까?

Spring 프레임 워크로 웹 서버 프로그램을 설계하는데 있어 HttpClient 에 대해 다양한 후보군이 존재합니다.
가방 기본적인 RestTemplate,WebClient 가 존재하며, Apache 에서 따로 제공하는 HttpClient 도 존재합니다.
하지만 FeignClient 는 기존의 HttpClient 보다 사용하기 더욱 간단하며, 더 많은 장점들을 가지고 있습니다.

  • 장점
    1. SpringMvc에서 제공되는 어노테이션을 그대로 사용할 수 있습니다.
    2. 기존에 사용되던 HttpClient 보다 더 간편하게 사용될 수 있으며 가독성 측면에서 뛰어납니다.
    3. 통합 테스트가 비교적 간편합니다.
    4. 사용자 의도대로 커스텀이 간편합니다.

3. Feign Client 사용법

간편한 방식으로 구현 가능합니다.

1) build.gradle 의존성 추가하기

// springboot 3.0.0
// jdk 1.8
// gradle

dependencyManagement {

    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:2020.0.3"
    }
}

implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'

2) @ EnableFeignClients 어노테이션 추가하기

@SpringBootApplication
@EnableFeignClients
public class EcommerceApplication {

    public static void main(String[] args) {
        SpringApplication.run(EcommerceApplication.class, args);
    }

}

@ EnableFeignClients 어노테이션을 붙이면, FeignClient 어노테이션이 명시된 인터페이스를 찾아 자동으로 구현체를 구현해줍니다 👍

3) Feign Client 인터페이스 생성하기

package com.example.ecommerce.client;


import com.example.ecommerce.client.mailgun.SendMailForm;
import feign.Response;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.cloud.openfeign.SpringQueryMap;
import org.springframework.web.bind.annotation.PostMapping;

@FeignClient(name = "mailgun", url = "https://api.mailgun.net/v3/")
@Qualifier("mailgun")
public interface MailgunClient {

    @PostMapping("sandbox92a3501de81b4fd894cc45108c2e5e8a.mailgun.org/messages")
    Response sendEmail(@SpringQueryMap SendMailForm form);

}

제가 진행 중인 프로젝트에서는 Feign Client 를 이용해 Mailgun API 를 호출하기 때문에 해당 API 호출을 위해 필요한 요소들을 SendMailForm 이라는 Dto 클래스로 매핑해주었습니다.
해당 코드에서 주의깊게 봐야 할 부분은 @FeignClient 어노테이션입니다.
name 속성과 url 속성을 가지고 있습니다.(name = " Feign Client 이름", url = "호출할 API url")

4) TestController 생성하기


package com.example.ecommerce.controller;


import com.example.ecommerce.service.EmailSendService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
@RequiredArgsConstructor
public class TestController {

    private final EmailSendService emailSendService;

    @GetMapping
    public String sendTestEmail(){
        return emailSendService.sendMail();
    }
}

간단한 Test 를 위해 Test Controller 를 생성하였습니다.
Test 를 해보겠습니다!!!

마무리

마치 Spring MVC 처럼 REST API 방식을 사용하기 때문에 거부감 없이 사용 할 수 있었습니다.
또한 기존에 RestTemplate 에 비해 훨씬 간결하네요!!🧑🏼‍💻
하지만 처음 Feign Client 을 사용하는 사람들은 꼭 선행 공부가 필요할 것 같습니다 🚀

참고

Feign Client 알아보기
[springboot]Feign client 사용하기 - REST api 간편 호출

profile
비즈니스가치를추구하는개발자
post-custom-banner

1개의 댓글

comment-user-thumbnail
2024년 2월 24일

덕분에 좋은 정보 잘 보고 갑니다.
감사합니다.

답글 달기