개발/Spring

[Spring] Spring cloud feign 예제

hojak99 2018. 7. 27. 15:28

spring cloud feign 이란 것을 알게 됐는데 진짜 조또 모르겠다. cloud, zuul, ribbon, eureka 등 등이 있는데 진짜 모르겠다.


우선 여기서 feign 은 예제 코드를 간단하게 짜 볼 수 있을 것 같아서 github 랑 구글링 좀 해서 대충 어떤 건지 보고 한 번 짜보았다.




쉽게 생각해서 feign 은 A 란 서비스가 있을 때 A 가 다른 서비스와 http 통신을 할 수 있도록 해주는 것 같다.  (A 에서 B란 서버의 api 호출하거나 등)


feign 구글링 했을 때 application.yml 로 무슨 설정 같은 것을 많이 하던데 우선 나는 그런거 다 제끼고 뭔가 동작하는 것을 봐야 이해할 수 있을 것 같아서 설정파일은 건드리지 않았다.



코드로 보면 더 이해하기 쉬울 것이다.




우선 우리는 api.github.com 에서 제공하는 api 들을 사용할 것이다.



[사진 1 : github.com 에서 제공하는 api]



api.github.com 에서는 [사진 1]과 같은 api 들을 제공한다. feign 테스트를 하기 정말 좋은 것 같다.





필자는 Intellij 라이센스가 존재하기 때문에 필자에 개발환경에 맞춰서 설명하겠다. 참고로 gradle 기반의 spring boot 2.0.0 프로젝트이다



[사진 2: Spring boot 프로젝트 생성하기]


Spring boot 를 사용하기 위해 [Spring Initializr] 로 프로젝트를 생성해야 한다.



group id 와 artifact id 는 알아서 설정하자.




[사진 3: dependency 추가]



이제 feign 을 추가하자. 형광색 부분에 Feign 부분에 체크해주면 된다. 아!!!!!!!!!! core 인가 어느 부분에 lombok 이라고 있는데 이것도 추가해주자.


이제 프로젝트가 생성됐을 것이다.


대략적인 프로젝트 구조는 다음과 같다.



[사진 4: 프로젝트 구조]



package com.hojak90.springbootsamplefeign;

import lombok.Getter;
import lombok.Setter;

@Setter
@Getter
public class Contributor {

    private String login;
    private int contributions;
}


package com.hojak90.springbootsamplefeign;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

@Service
@FeignClient(url = "https://api.github.com", name = "GitHub")
interface GitHubClient {

    @RequestMapping(method = RequestMethod.GET, value = "/repos/{owner}/{repo}")
    String contributors(
            @RequestParam("owner") String owner,
            @RequestParam("repo") String repo);
}


package com.hojak90.springbootsamplefeign;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

@EnableFeignClients
@EnableWebMvc
@SpringBootApplication
public class SpringBootSampleFeignApplication extends SpringBootServletInitializer {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootSampleFeignApplication.class, args);
    }
}


package com.hojak90.springbootsamplefeign;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class TestController {

    @Autowired
    public GitHubClient gitHubClient;

    @RequestMapping("/")
    public String home() {
        return "index";
    }

    @RequestMapping("/{owner}/{repo}")
    @ResponseBody
    public String contributors(@PathVariable String owner, @PathVariable String repo) {
        return gitHubClient.contributors(owner, repo);
    }
}


다음과 같이 클래스와 인터페이스를 생성해주자.


그리고 포스트맨으로 확인해주면 된다. 나는 localhost:8080/hojak99/TIL 로 한 번 접속해보겠다.




앙 성공띠

반응형