• 티스토리 홈
starryeye
  • 프로필사진
    starryeye
    • 분류 전체보기 (189)
      • C++ (17)
      • Java (24)
      • OOP (5)
      • Spring Reactive Stack (12)
        • Reactive Streams (3)
        • Netty (4)
        • Reactor (1)
        • Webflux (3)
        • DB, Cache 연동 (1)
      • Spring (90)
        • Core (17)
        • MVC (33)
        • Client (2)
        • Security (4)
        • DB, Cache 연동 (33)
      • DataBase (12)
        • RDBMS (2)
        • NoSQL (10)
      • Message Broker (6)
      • Web (4)
      • Network (4)
      • 대규모 시스템 설계 (15)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • Spring Cloud OpenFeign, Synchronization
        2023년 06월 17일
        • starryeye
        • 작성자
        • 2023.06.17.:08
        반응형

        https://spring.io/projects/spring-cloud-openfeign#overview

         

        Spring Cloud OpenFeign

        This project provides OpenFeign integrations for Spring Boot apps through autoconfiguration and binding to the Spring Environment and other Spring programming model idioms. Features Declarative REST Client: Feign creates a dynamic implementation of an inte

        spring.io

         

        선언적 웹 서비스 클라이언트 도구인 open feign 에 대해 알아보자..

         

        Open Feign 특징

        open feign 은 spring cloud 생태계에 포함 되어있다.

        과거에는 Netflix OSS 프로젝트의 일부였다.

         

        Spring MVC 어노테이션을 함께 사용할 수 있으며, 내부적으로 HttpMessageConverters 를 사용한다.

         

        선언적 HTTP Client 이므로,

        Spring Data Jpa 처럼..

        인터페이스에 어노테이션을 곁들여서 메서드 선언만 해주면 구현체는 알아서 생성되는 특징을 가지고있다.

         

        동기, 블로킹 I/O 방식으로 요청을 보낸다.

         

         

        코드로 하나씩 알아보자...

         

        Open Feign 은 스프링 클라우드 프로젝트에 포함되어 관리가 되기 때문에..

        의존성 라이브러리를 셋팅할 때 위와 같이 스프링 클라우드 의존성을 추가해준다.

        -> 21 ~ 23 line, 35 ~ 39 line

        그리고, openfeign 라이브러리 의존성을 추가해준다.

        -> 29 line

         

         

        스프링 클라우드의 버전은 뭘 써야하는가..

        https://spring.io/projects/spring-cloud

        위와 같이 사용할 스프링 부트 버전에 따른 스프링 클라우드 버전이 존재한다.

        -> 필자는 스프링 부트 3.0.x 버전을 사용하므로 .. 2022.0.x 버전 중, 2022.0.3 버전을 사용하였다.

         

         

        다음으로..

        @EnableFeignClients 어노테이션을 사용하여 FeignClient (openfeign 의 Http Client 선언적 인터페이스) 를 인지하여

        구현체를 만들도록 한다.

        basePackages 요소로 해당 FeignClient 위치를 정해줄 수 있다.

         

         

        OpenFeign 의 FeignClient 를 만들어보자..

         

        요청할 uri 는 https://https//open.er-api.com/v6/latest 이다.

        (USD 기준으로, 전세계 환율을 리턴해준다.)

        @FeignClient 어노테이션을 사용하여, 요청 보낼 url 을 설정 해주고..

        name 을 설정해준다. (Placeholders 가 지원된다.)

        name 요소의 값은 Spring Cloud LoadBalancer 클라이언트를 생성하는데 사용되는 클라이언트 이름이다.

        (해당 포스팅에서는 중요하지 않으므로 넘어간다.)

        FeignClient 인터페이스에 @FeignClient 를 사용하면

        스프링이 자동으로 구현체를 생성하고 해당 객체를 빈으로 등록해준다.

        (빈 이름은 인터페이스의 이름이다. 이름을 변경하기 위해서는 qualifiers 요소를 사용하면 된다.)

         

        @GetMapping 어노테이션은 Spring Web 의 바로 그 어노테이션을 사용하는 것이다.

        의미는 해당 url 로 "GET 요청을 보내겠다" 이다. (다른 HTTP Method 도 사용할 수 있다.)

         

        getLatest() 메서드를 호출하면 설정한 url 로 동기식 요청을 보내고 응답을 받는다.

        현재 예제에서는 ResponseExchangeRates 클래스 형태로 받았는데

        이는 해당 요청의 Body (JSON) 을 객체로 바인딩 받기 위함이다.

        (귀찮으면 그냥 Map<String, Object> 타입으로 받아보자..)

         

        메서드의 파라미터로는 Controller 개발할 때 처럼 사용하면 된다.(요청을 보낸다의 의미이지만..)

        @RequestHeader, @RequestParam, @PathVariable 등을 사용할 수 있다.

         

         

        중간에 layer 가 있어서 FeignClient 를 바로 사용되는 코드는 아니지만..

        변환 없이 동일한 프로퍼티를 사용한다고 생각하자.

        CurrencyExchangeRate 는 ResponseExchangeRates 라 생각하면되고

        RequestExchangeRatePort 는 MyFeignClient 라 생각하면된다.

         

        수행 결과

         

         

        설정

        커넥션에 관한 타임아웃 설정은 application.yml 로 위와 같이 할 수 있다.

        https://docs.spring.io/spring-cloud-openfeign/docs/current/reference/html/appendix.html

        기본 값 셋팅과 그 외 다양한 설정 속성은 위 url 에서 확인할 수 있다.

         

        위와 같이 글로벌 공통 설정을 할 수도 있지만..

        FeignClient 별로 서로 다른 설정을 해줄수 도 있다.

         

        아래는 예시이다.

        위와 같이 타임아웃을 설정할 수 있는 config 파일을 만들고..

         

        위와 같이 해당 설정을 적용할 FeignClient 에 적용하면 개별 적용이 된다.

         

        FeignClient 개별 설정할 수 있는 속성들은 다음과 같다.

        요청/응답에 필요한 다양한 속성을 커스텀 할 수 있다. (글로벌 설정도 마찬가지이다.)

         

        위 예시에서 봤던 Request.Options 를 만들기 위한 생성자이다.

         

         

        또한, 위와 같이 ErrorDecoder 를 이용하면.. 어떤 Http status 의 응답이 왔을 때.. 새로 정의한 예외를 터트릴수 도 있다.

         

        위는 ErrorDecoder 의 decode 메서드 기본 동작 과정이다.

        retry 관련 처리를 해주기위해서 RetryableException 을 반환하는 로직도 포함되어있는게 특징이다.

         

        <참고>

        @Configuration 개별 설정과 Application.yml 모두 적용을하면.. Application.yml 이 이긴다...

        우선순위를 반대로 돌리기 위해서는..

        spring.cloud.openfeign.client.default-to-properties 설정 값을 false 로 하자..

         

        다음과 같이.. name 이나 url 이 동일한 FeignClient..

        즉, 동일한 서버를 가리키는 FeignClient 인데.. 서로 다른 개별 설정을 하기 위해서는 contextId 를 다르게 줘야한다.

         

         

        기타

        Tomcat 에서 할당된 스레드 그대로 요청 보내고 응답 받으려면 .. 위와 같이 그냥 사용하면 된다. (동기식)

         

        하지만..

        비동기로 요청 보내고 싶을 수도 있다.

        요청을 처리하는 Tomcat 스레드를 사용하지 않고

        외부 API 로 요청을 하는 스레드를 따로 관리하면서 사용하고 싶은 경우

        해당 내용은 다음 포스팅때 다뤄 보겠다.

         

         

        reference

        https://docs.spring.io/spring-cloud-openfeign/docs/current/reference/html/#spring-cloud-feign

        반응형

        'Spring > Client' 카테고리의 다른 글

        Spring 6의 REST Clients 3가지  (0) 2023.03.13
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바