Spring Boot와 Feign Client로 마이크로서비스 통신 구현
Spring Boot 기반 서비스들 간에 Feign Client를 활용한 REST 통신 구조와 설정, 예제 코드, 장애 대응 패턴을 이해하기 위한 기술적 설명
목차
소개
마이크로서비스 환경에서는 서비스 간 통신이 핵심이다. REST 호출을 직접 구성하면 코드가 분산되고 중복이 발생한다. Spring Cloud OpenFeign은 선언적 HTTP 클라이언트를 제공해 인터페이스만으로 원격 호출을 간결하게 만든다. 이 글은 spring cloud feign 사용법과 feign client spring boot example, microservice feign spring boot 관점에서 실무에 적용 가능한 패턴과 코드 예제를 정리한다.
개념 이해
Feign이란
Feign은 인터페이스에 애너테이션을 붙여 원격 HTTP API를 호출할 수 있는 선언적 클라이언트다. 내부적으로 HTTP 요청과 응답을 직렬화/역직렬화하고, 로드밸런서나 서킷브레이커와 연동할 수 있다.
장점
- 코드가 단순해지고 가독성이 높아진다.
- Spring과 자연스럽게 통합된다.
- 로깅, 인터셉터, 에러 처리 확장이 용이하다.
프로젝트 설정
Maven을 기준으로 필요한 의존성을 추가한다. Spring Boot와 Spring Cloud OpenFeign을 함께 사용하면 된다.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
Feign Client 정의
인터페이스에 @FeignClient를 붙이면 원격 API 매핑이 끝난다. 간단한 예제를 먼저 살펴본다.
package com.example.client;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient(name = "user-service")
public interface UserClient {
@GetMapping("/users/{id}")
UserDto getUserById(@PathVariable("id") Long id);
}
class UserDto {
private Long id;
private String name;
// getters, setters
}
이제 UserClient를 주입 받아 사용하면 된다. 호출은 로컬 메서드 호출처럼 보이지만 내부적으로는 HTTP 요청이 발생한다.
컨트롤러에서 사용하기
package com.example.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserProxyController {
private final UserClient userClient;
public UserProxyController(UserClient userClient) {
this.userClient = userClient;
}
@GetMapping("/proxy/users/{id}")
public UserDto proxyUser(@PathVariable Long id) {
return userClient.getUserById(id);
}
}
설정 파일 (application.yml)
서비스 디스커버리나 로드밸런서와 함께 사용할 경우 설정을 추가한다. 예시에서는 단순한 URL 매핑과 로깅 수준 조정을 보여준다.
feign:
client:
config:
default:
loggerLevel: full
user-service:
ribbon:
listOfServers: http://localhost:8081
에러 처리와 폴백 전략
Feign은 에러 디코더를 통해 예외를 변환할 수 있다. 또한 서킷 브레이커와 연계하거나 폴백 구현체를 만들어 재시도 전략과 장애 격리를 구현한다.
public class CustomErrorDecoder implements feign.codec.ErrorDecoder {
private final feign.codec.ErrorDecoder defaultDecoder = new Default();
@Override
public Exception decode(String methodKey, feign.Response response) {
if (response.status() == 404) {
return new NotFoundException("Resource not found: " + methodKey);
}
return defaultDecoder.decode(methodKey, response);
}
}
테스트 전략
Feign을 테스트할 때는 MockWebServer나 WireMock을 사용하면 외부 API를 흉내 내기 쉽다. 통합 테스트에서는 SpringBootTest와 함께 실제 포트를 바인딩해 검증할 수 있다.
운영 시 고려사항
- 타임아웃과 재시도 설정을 반드시 구성한다.
- 로깅 수준을 적절히 조절해 요청/응답을 모니터링한다.
- 서비스 디스커버리(Eureka 등)와 연동하면 스케일링에 유리하다.
마무리
spring cloud feign 사용법은 선언적 인터페이스 설계와 적절한 설정만으로도 생산성을 크게 높인다. feign client spring boot example을 통해 기본 사용법과 에러 대응, 테스트 방법을 살펴보았다. 마이크로서비스 간 통신을 안정적으로 운영하려면 타임아웃, 재시도, 폴백, 로깅 정책을 함께 설계하는 것이 중요하다.