이번에 알림설정 기능을 개발하다가 FeignClient라는 어노테이션을 발견하게 되었다. 인터페이스 상단에 @FeignClient라고 선언 후, 약간의 설정값만 넣으면 해당 인터페이스 자체가 HTTP 클라이언트가 되어서 서버로 HTTP요청을 할 수 있는 기능으로 보인다.
일단, 인터넷을 리서치하여 기능의 구현은 하였지만, 생각의 정리차 포스팅으로 남긴다.
소개
Feign은 Netflix에서 만든 선언적 Http 클라이언트이다. 여기서 선언적이란 말은 Spring에서 선언적 트랜잭션이라는 용어와 비슷한데, 소스코드가 아닌 어노테이션 선언만으로 트랜잭션을 적용하게 하는 기술이다. Feign에서의 선언적 Http클라이언트 역시 어노테이션 선언만으로 Http 클라이언트를 만들 수 있고 이를 통해서 Http Api 호출이 가능한 것을 의미한다.
실습
이제부터 예제코드를 작성해 보면서 실습을 할 것인데, 실습의 목표는 Rest Api 샘플구현하고 해당 Rest API에 Feign을 이용하여 만든 HttpClient로 Http 요청을 하여 요청을 성공적으로 하는가를 알아내는 것이 실습의 목표이다.
예제코드
[build.gradle]
plugins {
id 'org.springframework.boot' version '2.2.5.RELEASE'
id 'io.spring.dependency-management' version '1.0.9.RELEASE'
id 'java'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
ext {
set('springCloudVersion', "Hoxton.SR3")
}
dependencies {
implementation 'com.google.guava:guava:28.2-jre'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
test {
useJUnitPlatform()
}
[FeignApplication.java]
SpringApplication.run이 있는 클래스에서 @EnableFeignClients를 선언해 줘야 @FeignClient가 선언된 클래스를 빈으로 인식하게 된다.
package com.example.feign;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
@EnableFeignClients
@SpringBootApplication
public class FeignApplication
{
public static void main(String[] args)
{
SpringApplication.run(FeignApplication.class, args);
}
}
[Human.java]
Rest서버에 있는데이터와 매칭된 DTO 클래스
package com.example.feign;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Builder
public class Human
{
@JsonProperty("name")
private String name;
@JsonProperty("age")
private int age;
@JsonProperty("sex")
private String sex;
}
[MyFeignClient]
@FeignClient를 사용하여 만든 HttpClient이다.
package com.example.feign;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
@FeignClient(name = "my-client", url="localhost:8080/example/human")
public interface MyFeignClient
{
@GetMapping(produces = "application/json")
public List<Human> getHumans();
}
[MyRestController]
RestController로서, /example/human으로 접근시 사람정보를 json형태로 보여주고, /example/feign으로 접근시 /example/human으로 FeignClient를 통해서 Http요청을 하여 값을 갖고온 후, 모든 사람의 나이를 변경 및 변경된 사람들의 정보를 json으로 보여주는 기능을 갖고있다.
package com.example.feign;
import com.google.common.collect.Lists;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class MyRestController
{
private final MyFeignClient feignClient;
@Autowired
public MyRestController(MyFeignClient feignClient)
{
this.feignClient = feignClient;
}
@GetMapping("/example/human")
public List<Human> getHuman()
{
return Lists.newArrayList(
Human.builder().name("주현태").age(31).sex("남").build(),
Human.builder().name("주동혁").age(29).sex("남").build(),
Human.builder().name("고요한").age(32).sex("남").build(),
Human.builder().name("여자1").age(20).sex("여").build(),
Human.builder().name("여자2").age(25).sex("여").build(),
Human.builder().name("여자3").age(30).sex("여").build()
);
}
@GetMapping("/example/feign")
public List<Human> getFeign()
{
List<Human> humans= feignClient.getHumans();
humans.stream().forEach(m->m.setAge(100));
return humans;
}
}
테스트
서버에 있는 데이터를 Feign 클라이언트를 통해서 Http요청 후, 가공(나이를 전부 100으로 변환)한 결과이다.
'IT > Spring Boot' 카테고리의 다른 글
스프링 부트 시작시 숙지할 개념(?) (0) | 2020.10.15 |
---|---|
H2 데이터베이스 간단하게 알아보기 (0) | 2020.06.14 |
Spring Boot @ModelAttribute로 Date타입 Data 바인딩 안될때 (0) | 2020.01.04 |
Spring Boot에서 Google Cloud Storage에 접근하기 (0) | 2020.01.01 |
Spring Boot + Google Cloud Platform 이용하기 (0) | 2019.12.29 |