느린 것을 걱정하지 말고, 멈춰서는 것을 걱정하라
article thumbnail

이번에 알림설정 기능을 개발하다가 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으로 변환)한 결과이다.

 

RestAPI에 올라가져 있는 데이터

 

 

FeignClient를 통해 http요청 후, 갖고온 값을 통해서 값을 변경한 데이터

profile

느린 것을 걱정하지 말고, 멈춰서는 것을 걱정하라

@주현태

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!