2023. 5. 28. 05:22ㆍSpring 기초
Intro
최근에 https://thecatapi.com/ 사이트에서 제공하는 데이터를 이용해서,
고양이 사진 정보를 제공하는 API 서버를 만들었습니다.
아 고양이 키우고싶다
제 SpringBoot 서버에서 고양이 사진 정보를 가져올 때, Spring Cloud 라이브러리의 Openfeign를 사용했습니다.
또, 최근에 본 MSA 관련 영상에서도 Openfeign을 이용해 내부 서비스들 간 데이터를 주고받는 것을 보고, 이참에 Openfeign을 포스팅해야겠다 싶었습니다.
theCatApi가 제공하는 데이터는 아래 링크에 잘 나와 있습니다.
https://developers.thecatapi.com/view-account/ylX4blBYT9FaoVd6OhvR?report=bOoHBz-8t
Openfeign이란
feign은 Netflix 에서 개발된 Http client binder 입니다. Spring Cloud의 Restful 통신용 라이브러리로,
Rest Call을 하는 클라이언트를 쉽게 작성할 수 있도록 도와줍니다.
현재는 openfeign인 만큼 오픈소스가 되었습니다.
https://github.com/OpenFeign/feign
Openfeign의 장점
인터페이스와 어노테이션을 이용해 Rest Call을 하는 클라이언트를 쉽게 구현할 수 있습니다.
Spring Data JPA가 Interface만 지정해서 쿼리실행 구현체를 만드는 것과 유사합니다.
사용법과 소스코드를 보시면 쉽게 이해하실 수 있을 것입니다.
소스코드 및 사용법
1. 의존성 추가
//build.gradle
ext {
set('springCloudVersion', "2021.0.4")
...
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
}
springCloudVersion의 경우, 사용하시는 SpringBoot의 버전에 따라 달라지게 됩니다.
저는 2.7x 버전을 사용했으므로 아래 표에 맞는 Spring Cloud의 버전을 추가했습니다.
2. Feign 설정하기
1) @EnableFeignClients 추가하기
Root package 에 있어야 하며, 그렇지 않은 경우 basePackages 또는 basePackageClasses 를 지정해야 합니다.
저는 Config 클래스를 따로 생성한 뒤 basePackages를 지정했습니다.
해당 packages를 돌면서 @FeignClient가 붙은 인터페이스를 찾아 구현체를 생성하게 됩니다.
@Configuration
@EnableFeignClients("com.prgrms.thecatapi")
class OpenFeignConfig {
@Value("${cat.api-key}")
private String apiKey;
@Bean
public RequestInterceptor requestInterceptor() {
return template -> {
template.header("x-api-key", apiKey);
template.header("Accept", "application/json");
};
}
}
2) 기타 설정 추가
인터셉터를 추가하는 것은 Feign이 제공하는 또 다른 유용한 기능입니다.
Openfeign의 Request Interceptor는 요청 전/후에 특정한 기능을 수행하는 기능을 제공합니다.
theCatApi에서 제공하는 api를 호출하기 위해서는 헤더에 "x-api-key"라는 이름으로 발급받은 Key값을 추가해야 합니다. 따라서 Request Interceptor를 구현하여 헤더에 값을 추가하고 Bean으로 등록했습니다.
호출하는 메소드마다 각각 header값을 설정할 수 있지만, 제가 호출하는 API는 공통으로 "x-api-key" 값이 필요하기 때문에 config에서 일괄로 설정했습니다.
Config 클래스에서는 인터셉터 외에도 Logging 설정을 통해 로거를 등록하고 로깅 레벨도 지정할 수 있습니다.
3. FeignClient 작성
Openfeign에 기본적으로 설정되어있는 SpringMvcContract를 이용한다면
Spring MVC의 어노테이션을 이용해 요청 매핑을 처리할 수 있습니다.
@FeignClient(name = "thecatapi", url = "https://api.thecatapi.com/v1")
public interface CatApiFeignClient {
@GetMapping("/images/{id}")
DetailDto getById(@PathVariable("id") String id);
@GetMapping("/images/search")
List<PhotoDto> getRandomImage(@RequestParam("limit") int limit);
@GetMapping("/images/search")
List<PhotoDto> getByBreedName(@RequestParam("breed_ids") String breed, @RequestParam("limit") int limit);
}
각각의 메소드는 아래의 API를 호출하게 됩니다.
https://api.thecatapi.com/v1/images/0XYvRd7oD
https://api.thecatapi.com/v1/images/search?limit=1
https://api.thecatapi.com/v1/images/search?breed_ids=beng&limit=1
각각의 호출을 RestTemplate으로 작성했다면 코드가 몇 배는 길어졌을 것입니다.
Openfeign 짱
참고
https://techblog.woowahan.com/2630/
https://mangkyu.tistory.com/278
https://docs.spring.io/spring-cloud-openfeign/docs/current/reference/html/
'Spring 기초' 카테고리의 다른 글
SpringBoot + GraphQL (2/2) (0) | 2023.07.22 |
---|---|
SpringBoot + GraphQL (1/2) (0) | 2023.07.13 |
WebSocket & STOMP 그룹 채팅방 구현하기 (4) | 2023.05.16 |
[SpringBoot] Annotation을 이용해 Slack에 Error log 남기기 (0) | 2023.03.18 |
UUID란, UUID vs 자동증가 pk (1) | 2022.11.12 |