본문 바로가기

개발(합니다)/Java&Spring

[spring boot 설정하기-13] spring cloud feign 설정 및 테스트 소스

반응형

CreateMSA(MicroService Architecture)를 서로를 호출하다보면

코드의 복잡성이 높아지는데 Feign으로 복잡성을 낮출수 있습니다.

  • Feign은 Rest 기반 서비스 호출을 추상화하는 Spring cloud Netflix 라이브러
  • Feign을 사용하면 코드의 복잡성을 낮춤
  • 선언적 동작 식으로 인터페이스를 클러이언트에서 작성하고 인터페이스를 통해 REST api를 호출
  • Spring에서 런타임에 인터페이스 구현체를 제공하여 개발자는 비즈니스에 집중할 수 있음

관련 정보는 아래 사이트에서 확인할 수 있습니다.

spring.io/projects/spring-cloud-openfeign

이어진 포스팅은 base 프로젝트를 기반으로 만들었으나
spring cloud는 개별적으로 폴더를 만들어서 진행하도록 하겠습니다.


1. Provider

패키지 구성은 아래와 같습니다.

1-1. 의존성 추가

    implementation 'org.springframework.boot:spring-boot-starter-web'
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'

1-2. application.yml

server:
  port: 8880

1-3. ProviderContoller.java

package com.otrodevym.feignprovider;

import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
@RequestMapping(value = "/api/v1/provider", produces = MediaType.APPLICATION_JSON_VALUE)
public class ProviderContoller {

    @GetMapping("/member/{id}")
    public String member(@PathVariable("id") int id) {
        String memberName = "YONG";
        return memberName;
    }
}

2. Consumer

패키지 구성은 아래와 같습니다.

2-1. 의존성 추가

    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'

2-2. application.yml

server:
  port: 8881

2-3. ConsumerClient.java

package com.otrodevym.feignconsumer;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

import javax.websocket.server.PathParam;


@FeignClient(name = "member-client", url = "localhost:8880/api/v1/provider")
public interface ConsumerClient {

    @GetMapping("/member/{id}")
    String member(@PathVariable("id") int id);
}

2.4 ConsumerContoller.java

package com.otrodevym.feignconsumer;

import lombok.RequiredArgsConstructor;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
@RequestMapping(value = "/api/v1/consumer", produces = MediaType.APPLICATION_JSON_VALUE)
@RequiredArgsConstructor
public class ConsumerContoller {
    private final ConsumerClient consumerClient;

    @GetMapping("/getMemberName/{id}")
    public String getMemberName(@PathVariable("id") int id) {
        return consumerClient.member(id);
    }
}

3. Postman 테스트

http://localhost:8881/api/v1/consumer/getMemberName/555

반응형