[프로젝트] Springcloud Open Feign 으로 주소 API 를 호출해보자

OpenFeign

설명

  • 선언적 웹 서비스 클라이언트를 작성하기 위한 Java HTTP 클라이언트 바인더 라이브러리이다.
  • Feign의 주요 목적은 REST API 를 사용하는 서비스 간의 통신을 단순화하고, MSA 구조상 Service Client 를 쉽게 생성할 수 있도록 등장했다.

Spring Cloud 와의 연관성

  • 스프링 클라우드는 MSA 같은 분산 시스템 패턴을 쉽게 구현할 수 있게 지원하는 프레임워크의 모음중 하나이다.
  • 역사는 Netlix OSS 부터 시작하는데.. 이건 너무 길어서 제외함

공식문서상 호환

Spring Cloud

  • 현재 나는 스프링 부트 2.7.16 버전이기에, 2021.0.x aka Jubilee 버전을 사용하면 될 것같다.

그래들 추가

ext {
    set('springCloudVersion', "2021.0.4")
}
---

디펜던시에

implementation platform("org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}")

implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'

추가가 필요하다.
  • 왜 위와 같이 라이브러리를 추가해주는 걸까?
    • 프로젝트 전체에서 사용할 라이브러리의 버전을 한 곳에서 관리하기 위하여 사용한다.
    • ext 블록을 사용해 프로젝트 전체에서 사용할 라이브러리의 버전을 한 곳에서 관리한다면
      • 버전 업데이트시에 여러 곳을 수정하는 대신 한 곳만 변경해주면 된다.
      • 플랫폼 키워드(platform)를 사용하여 BOM을 들고와서 BOM 에 정의된 의존성을 관리한다.
  • 그럼 아래 방식이랑 뭐가 다른건가요?
    dependencyManagement {
        imports {
            mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
        }
    }
    • OpenFeign 관련 검색중 관련 예제를 찾았는데 해당 예제에서는 dependencyManagement > imports > mavenBom 키워드를 사용중이였는데 아마, 관습적으로 혹은 낮은 버전을 사용하고 있는 경우인 것 같다.
    • Gradle 5 이후부터는 gradle platform 키워드가 등장하여 해당 방식으로 사용하기를 권장하는 것 같다.
      • 아래 링크를 참고하자.

관련 어노테이션 및 설정 추가

Config 설정

@Configuration
@EnableFeignClients(basePackages = "com.psj.itembrowser.security.common.openfeign.service")
public class OpenFeignConfig {

	@Value("${juso.url}")
	private String jusoUrl;

	@Value("${juso.confmKey}")
	private String jusoConfmKey;
}
  • @Configuration
    • 을 통하여 빈으로 등록하고 해당 파일이 설정파일임을 알린다.
  • @EnableFeignClients
    • Feign 클라이언트를 활성화
    • Feign을 사용하여 HTTP 요청을 처리할 인터페이스를 스캔할 기본 패키지를 지정
    • basePackages 의 경우 해당 패키지 위치에 FeignClient 가 위치한다는 의미

OpenFeign에서 타임아웃과 재시도 설정

  • yml 에 설정하는 법과, 자바파일로 설정하는 방법 2가지가 존재하는데, 여기서는 yml 로 설정하겠다.
    • 자바 파일의 경우 일부 메서드가 depreciated 될 상황이라, 대안이 존재하면 사용하는 게 맞을 것 같다.
feign:
  client:
    config:
      default:
        connectTimeout: 5000
        readTimeout: 5000
        loggerLevel: basic
        retryer: full
  • 재시도 관련 설정
    • 재시도를 활성화하려면 기본적으로 Retryer 빈이 명시적으로 선언되어 있어야 한다.
      @Configuration
      @EnableFeignClients(basePackages = "com.psj.itembrowser.security.common.openfeign.service")
      public class OpenFeignConfig {
      
      	@Value("${juso.url}")
      	private String jusoUrl;
      
      	@Value("${juso.confmKey}")
      	private String jusoConfmKey;
      
      	@Bean
      	public Retryer feignRetryer() {
      		return new Retryer.Default(1000, 5000, 3);
      	}
      }
      • 각 인자는
        • 재시도 사이의 초기 간격(밀리초)
        • 재시도 사이의 최대 간격(밀리초)
        • 최대 재시도 횟수

클라이언트 호출부

@FeignClient(name = "AddressApiOpenFeign", url = "${juso.url}")
public interface AddressApiOpenFeign {

	@GetMapping
	AddressResponseDto getAddress(
		@RequestParam("confmKey") String confmKey,
		@RequestParam(value = "currentPage", defaultValue = "1") String currentPage,
		@RequestParam(value = "countPerPage", defaultValue = "10") String countPerPage,
		@RequestParam("keyword") String keyword,
		@RequestParam(value = "resultType", defaultValue = "json") String resultType
	);
}
  • 단순히 선언부 작성만으로, 외부 API 를 호출이 가능해짐.
  • 사용한 단순 서비스 호출식으로 사용하면 된다.

사용

@Service
@RequiredArgsConstructor
public class ShppingInfoValidationService {
	private final AddressApiOpenFeign addressApiOpenFeign;

	@Value("${juso.confmKey}")
	private String confmKey;

	public AddressValidationResult validateAddress(ShippingInfo shippingInfo) {
		AddressResponseDto addressResponseDto = addressApiOpenFeign.getAddress(confmKey, "1", "1",
			shippingInfo.getZipCode(), "json");

	...
	}
}

+) 주소 API 신청

API 신청하기
※ 팝업API의 경우, 도로명주소API 또는 좌표제공API에서 지원합니다.자세한 내용은 'API신청 > 팝업API'메뉴에서 상세주소 팝업API 적용방법을 참고하시기 바랍니다.
https://business.juso.go.kr/addrlink/openApi/apiReqst.do
  • 발급 받은 키를 resource 아래 juso.key 에 담아서 저장
  • 해당 key 파일은 gitignore에 반드시 추가해야한다.

참고

[Spring] OpenFeign 타임아웃(Timeout), 재시도(Retry), 로깅(Logging) 등 설정하기
최근에 있었던 사내 엔지니어링 데이에서 발표를 하였는데, 상당히 편리하지만 많은 분들이 모르시는 OpenFeign을 준비하였습니다. 그리고 발표하면서 준비했던 내용을 블로그 포스팅에서도 적어두었습니다. 아래의 내용은 Spring Cloud OpenFeign 공식 문서를 기반으로 개인적인 경험을 더해 작성한 내용입니다. 1. OpenFeign 타임아웃(Timeout), 재시도(Retry), 로깅(Logging) 등 설정하기 OpenFeign의 설정은 yml과 Java config 모두로 할 수 있다. 만약 yml과 Java config 모두 존재한다면 YML의 정보가 Java config를 덮어씌우며 우선순위를 가진다. 하지만 이러한 우선순위 설정은 바꿔줄 수 있으며, 심지어 Feign Client 별로 ..
https://mangkyu.tistory.com/279


Uploaded by N2T