OpenFeign...Client Part

duckbill413·2024년 6월 2일
0

Spring boot

목록 보기
11/13
post-thumbnail

Open Feign

Feign Client 예제 Github

OpenFeign은 Java에서 RESTful 웹 서비스와의 통신을 간편하게 해주는 HTTP 클라이언트 바인더 입니다. 이 라이브러리는 Spring Cloud와 프로젝트에서 널리 사용되며, 다른 마이크로서비스와의 통신을 위해 사용됩니다. 최근에는 RestTemplate보다 많이 사용되고 있습니다.

Spring Cloud OpenFeign

Feign Feature

  • Connection / Read Timeout
    • 외부 서버와 통신 시 Connection / Read Timeout 설정이 가능
  • Feign Interceptor
    • 외부로 요청이 나가기 전에 만약 공통적으로 처리해야하는 부분이 있다면 Interceptor를 재정의하여 처리
  • Feign Logger
    • Request / Response 등 운영을 하기 위한 적절한 Log를 기록
  • Feign ErrorDecoder
    • 요청에 대해 정상 응답이 아닌 경우 핸들링이 가능

OpenFeign 사용 예제

OpenFeign 프로젝트 설정

  1. build.gradle에 OpenFeign implement 하기

    // open feign
    implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
  2. dependency manager 설정 및 spring cloud version을 주입하기

    ext {
        /**
         * https://spring.io/projects/spring-cloud
         * 위에서 현재 Spring 버전과 호환 되는 springCloudVersion 을 찾아 설정해 준다.
         * 현재 프로젝트 spring version 은 3.2.6 입니다.
         */
        set('springCloudVersion', "2023.0.2")
    }
    
    dependencyManagement {
        imports {
            mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
        }
    }
    • spring cloud version은 spring의 버전과 호환성이 예민하므로 아래의 사이트에서 호환 버전을 확인해야 한다. Spring Cloud Untitled
  3. @EnableFeignClients 어노테이션을 사용하여 현재 프로젝트에서 OpenFeign을 사용할 것임을 알린다.

    @EnableFeignClients // Feign Client 사용을 위한 어노테이션
    @SpringBootApplication
    public class SpringOpenfeignApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringOpenfeignApplication.class, args);
        }
    
    }

Feign Client의 사용

@FeignClient 어노테이션을 사용한 클래스를 생성하여 name, url을 설정한다.

name은 현재 Feign Client의 고유 이름이고 url은 요청을 전송할 서버의 url이다.

또한, configuration에 Feign Client의 설정 정보 클래스를 설정해 줄 수도 있다.

@FeignClient(
        name = "demo-client", // feign client 의 고유 이름
        url = "${feign.url.prefix}", // 요청을 전송할 서버의 url
        configuration = {DemoFeignConfig.class} // 어떤 설정을 적용할 것인지 설정
)
public interface DemoFeignClient {

    @GetMapping("/get")
    ResponseEntity<BaseResponseInfo> callGet(
            @RequestHeader("CustomHeaderName") String customHeader,
            @RequestParam("name") String name,
            @RequestParam("age") Long age
    );
}
  • url 같은 경우 application.yml 파일로 부터 주입 받기 위해 위와 같이 설정하였습니다.
  • application.yml 설정 Feign Client를 설정하기 앞서서 application.yml을 미리 정의하여 환경 변수로 설정 정보를 불러올 수 있다.
    feign:
      url:
        prefix: http://localhost:8080/target_server # DemoFeignClient 에서 사용할 url prefix
      client:
        config:
          default:
            connectTimeout: 1000
            readTimeout: 3000
            loggerLevel: NONE
          demo-client: # DemoFeignClient 에서 사용할 Client 설정 값
            connectionTimeout: 1000
            readTimeout: 10000
            loggerLevel: HEADERS # FeignCustomLogger -> Logger.Level logLevel 변수에 할당
    • demo-client 부분을 보면 connectionTimeout, readTimeout, loggerLevel을 미리 정의한 것을 확인할 수 있으며 feign.url.prefix를 보면 target이 될 서버의 url 을 설정한 것을 볼 수 있다.
  • Feign Client로 요청 전송하고 확인해 보기 DemoService에서 현재 서버에 요청을 전송하고 요청이 전송됬는지 확인해 보자
    @Service
    @RequiredArgsConstructor
    public class DemoService {
        private final DemoFeignClient demoFeignClient;
    
        public String get() {
            ResponseEntity<BaseResponseInfo> response = demoFeignClient.callGet(
    	        "CustomHeader", // 전송 Header
    	        "CustomName", // 전송 Name
    	        1L // 전송 Age
            );
    
            System.out.println("FROM TARGET SERVER");
            System.out.println("Name: " + response.getBody().getName());
            System.out.println("Age: " + response.getBody().getAge());
            System.out.println("Header: " + response.getBody().getHeader());
            return "get";
        }
    }
    • FeignClient를 주입받아 사용하는 클래스

      # GET request
      GET http://localhost:8080/get
    • Feign Client 사용을 위한 요청

      FROM TARGET SERVER
      Name: CustomName
      Age: 1
      Header: CustomHeader
    • get()메소드를 사용하였을때, Feign Client가 원활히 작동하는 것을 확인해 볼 수 있다.

profile
같이 공부합시다~

0개의 댓글