1. OpenFeign란?
Spring Cloud OpenFeign은 넷플릭스가 개발한 Feign이라는 선언형 HTTP 클라이언트를 확장한 오픈 소스 프로젝트입니다. REST API 기반의 마이크로서비스 아키텍처에서 서로 다른 서비스 간의 통신을 더욱 간결하고 선언적으로 처리할 수 있도록 도와줍니다.
OpenFegin은 선언형 방식으로 되어있어 인터페이스와 어노테이션을 정의하기만 하면, Spring이 실행 시점에 자동으로 해당 인터페이스의 구현체를 제공하여 API 통신을 손쉽게 수행할 수 있게 해줍니다. 이를 통해 개발자는 복잡한 HTTP 통신 로직을 신경 쓸 필요 없이, 마치 메서드 호출을 하듯이 외부 API와 통신할 수 있습니다.
2. Gradle 의존성 추가
OpenFeign을 사용하기 위해 사용중인 스프링 버전에 맞는 의존성을 추가해 줍니다.
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign:4.1.0'
3. OpenFeign을 사용하기 위해 어노테이션 추가
@SpringBootApplication
@EnableFeignClients
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@EnableFeignClients를 붙이면 @FeignClient 애노테이션이 붙은 클래스를 찾아 구현체를 만들어 줍니다.
4. 간단한 인터페이스 정의
OpenFeign을 사용하면 복잡한 HTTP 통신 로직을 신경 쓰지 않아도 됩니다. 대신, 인터페이스와 어노테이션을 통해 외부 API를 호출할 수 있습니다.
@FeignClient(name = "paymentClient", url = "${spring.payment.base-url}", configuration = PaymentFeignConfig.class)
public interface PaymentClient {
@PostMapping(value = "/confirm", consumes = MediaType.APPLICATION_JSON_VALUE)
PaymentConfirmResponse confirmPayment(@RequestBody PaymentConfirmRequest paymentConfirmRequest);
}
interface에 @FeignClient를 지정하고 url 속성을 통해 요청할 host를 지정하고 필요한 곳에서 사용하면 스프링이 구현체를 만들어 주어 편리하게 사용할 수 있습니다.
5. 로깅 설정
OpenFeign은 HTTP 요청과 응답에 대한 로그를 남길 수 있는 로깅 기능을 제공합니다.
이를 통해 API 통신 중 발생하는 문제를 추적하거나, 요청/응답 데이터를 검토할 수 있습니다. 로깅 설정은 Feign의 Logger.Level을 사용해 각기 다른 로깅 수준을 지정할 수 있습니다.
- NONE : 로깅 안함 (기본 값)
- BASIC : 요청 방법과 URL, 응답 상태 코드, 실행 시간 기록
- HEADERS : 요청 및 응답 헤더와 함께 기본 정보 기록
- Full : 요청과 응답 모두에 대한 헤더, 본문, 메타데이터를 기록
public class PaymentFeignConfig {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
logging:
level:
패키지이름~~~~: DEBUG
이 때 cofing 클래스에 로그 래벨을 설정했더라도 yml파일에서 로그 레벨을 설정해줘야 로그가 실제로 출력됩니다.
6. Interceptor
RequestInterceptor 인터페이스를 구현하면 HTTP 요청이 전송되기 전 특정 로직을 수행할 수 있습니다.
(ex 공통 헤더 추가, 인증 토큰 삽입)
public class PaymentAuthInterceptor implements RequestInterceptor {
@Override
public void apply(final RequestTemplate template) {
template.header("Authorization", "헤더에 추가 가능하다!");
}
}
7. Error Decoder
feign 클라이언트는 예외가 발생하면 기본적으로 FeignException이 발생하는데 ErrorDecoder를 빈으로 등록해 사용하면 별도로 에러 처리가 가능합니다.
import feign.Response;
import feign.codec.ErrorDecoder;
public class CustomErrorDecoder implements ErrorDecoder {
private final ErrorDecoder defaultDecoder = new Default();
@Override
public Exception decode(String methodKey, Response response) {
if (response.status() == 404) {
return new CustomNotFoundException("에러 발생!!");
}
return defaultDecoder.decode(methodKey, response);
}
}
8. Configuration
동일한 서비스에서 여러 외부 API를 호출하는 경우, API마다 요구 사항이 다를 수 있기 때문에 다른 설정이 필요할 수 있는데 Feign은 각 클라이언트별로 개별적인 설정을해줄 수 있습니다.
클라이언트별로 설정을 적용하려면 다음과 같이 @FeignClient 어노테이션에서 configuration 속성을 사용해 적용할 수 있습니다.
@FeignClient(name = "paymentClient", url = "${spring.payment.base-url}", configuration = PaymentFeignConfig.class)
public class PaymentFeignConfig {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
@Bean
CustomErrorDecoder customErrorDecoder() {
return new CustomErrorDecoder();
}
@Bean
PaymentAuthInterceptor paymentAuthInterceptor() {
return new PaymentAuthInterceptor();
}
}
위에서 만든 인터셉터, decoder 등을 빈으로 등록해줍니다.
(이 때 class에 @Configuration을 적용하면 모든 client에 적용됩니다.)
이를 통해서 해당 클라이언트만을 위한 로깅, 타임아웃, 인터셉터 등등을 커스터마이징할 수 있습니다.
9. Timeout
아래와 같이 요청에 대한 타임아웃 설정 또한 가능합니다.
@Bean
public Request.Options requestOptions() {
return new Request.Options(2, TimeUnit.SECONDS, 60, TimeUnit.SECONDS, true);
}
+ 뿐만 아니라 yml 파일을 통해서도 위와 같은 설정들이 가능한데 자세한 것은 공식문서를 참고하면 되겠습니다.
참고
https://docs.spring.io/spring-cloud-openfeign/reference/spring-cloud-openfeign.html
'Backend > spring' 카테고리의 다른 글
[Spring]스프링 이벤트를 이용한 도메인 의존성 분리 및 고려할 점 (2) | 2024.09.09 |
---|---|
[Spring] 서블릿 필터(Filter), 인터셉터(Interceptor) 개념과 차이점 (0) | 2024.08.05 |
[Spring] Dispatcher Servlet이란?? (1) | 2024.06.08 |
[Spring] 의존성 주입의 3가지 방법 (0) | 2024.05.28 |
[Spring] Rest Docs으로 API 문서화하기 (1) | 2023.06.30 |