배경
현재 우리 프로젝트는 시스템은 Spring Cloud 기반의 MSA 구조로 구성되어 있다.
내가 구상한 게이트웨이 역할은 모든 요청의 진입점이며, JWT검증을하고, 접근 제어 수행을 해주기로 생각을 했다.
그리고 유저 서비스에서는 회원 가입과, 로그인, 권한 관리, 사용자 상태 관리, JWT토큰을 발급해주기로 역할을 분명하게 나누었다.
그리고 게이트웨이는 각 요청이 들어올 때 사용자의 상태를 확인해 가입 대기인 사용자 즉 "PENDING"이라는 값을 가지고 있으면 유저 서비스를 제외한 모든 서비스는 이용하지 못하도록 서비스 접근을 할 생각이다.
그래서 게이트웨이에서 유저 서비스 내부 API 요청을 사용하려고 함
이슈
자연스럽게 @FeingClient를 사용했다.
@FeignClient(name = "user-service")
public interface UserClient {
@GetMapping("/v1/users/internal/{userId}/status")
UserStatus getUserStatus(@PathVariable UUID userId);
}
게이트웨이에서 userClient.getUserStatus(userId) 를 호출하면 될 거라 생각했는데 애플리케이션 실행 즉시 에러가 터졌다.

순환참조(circular referene) 에러가 발생한 것이다.
원인
게이트웨이도 Eureka Client로 등록이 되어있다. 그리고 FeignClient도 Eureka를 통해 user-service 주소를 찾아야 한다.
결국 게이트웨이 애플리케이션이 실행될 때 gateway -> feignclient -> eureka -> gateway 이런 순환적인 의존 구조가 생긴다는 것이다.
게이트 웨이는 다른 서비스와 다르게 webflux 기반이고, feignclient는 mvc기반이라 내부적으로 호환이 불안정하다고 한다.
이로 인해 애플리케이션 컨텍스트 초기화 시점에서 빈 주입 순환이 발생한다고 한다.
요약하자면,
게이트웨이가 자기 자신이 라우티하는 서비스(user-service)를 feign을 통해 다시 호출하려고 하다 보니 자기 자신을 참조하는 구조가 되어버린 것이다.
문제
게이트웨이 실행 불가(순환 참조로 인한 Bean 생성 실패)
Gateway가 Eureka와 FeignClient를 동시에 참조함으로써 의존성 충돌
Webflux 환경에서는 Feign이 호환되지 않아 동기 블로킹 문제도 발생 가능
FeignClient로 user-service를 호출 하는 것 자체가 아키텍처적으로 잘못된 선택이었다.
해결 방안
해결의 핵심은 FeignClient가 아닌 WebClient(비동기)로 전환하는것이었다.
@Service
@RequiredArgsConstructor
public class AuthService {
private final WebClient.Builder webClientBuilder;
public Mono<UserStatus> getUserStatus(UUID userId) {
return webClientBuilder.build()
.get()
.uri("http://user-service/v1/users/internal/{userId}/status", userId)
.retrieve()
.bodyToMono(BaseResponseDto.class)
.map(response -> {
Object data = ((BaseResponseDto<?>) response).getData();
return UserStatus.valueOf(data.toString());
})
.doOnError(e -> System.err.println("[User-service error] : " + e.getMessage()));
}
}
WebClient는 비동기 논블로킹 방식으로 동작한다.
Eureka와의 순환참조 문제도 제거된다.
결과
Gateway 서비스 정상 구동
User 상태 조회 정상 동작
API호출 시 사용자 상태에 따라 접근 제한 성공
요약
| 배경 | Gateway에서 사용자 상태(UserStatus)를 조회하여 접근 제어 |
| 이슈 | FeignClient 사용 시 순환참조(Circular Reference) 발생 |
| 원인 | Gateway와 UserService가 Eureka를 통해 서로 참조 |
| 문제 | Bean 생성 실패 + MVC/Flux 환경 충돌 |
| 해결 방안 | FeignClient → WebClient 전환 |
| 결과 | Gateway 정상 구동 + 비동기 흐름 유지 + 성능 향상 |
'BACKEND & SERVER > Trouble Shooting' 카테고리의 다른 글
| [Trouble Shooting] MSA + Spring Secuirty 환경에서 FeignClient 호출 시 403/401 발생 원인과 해결 (0) | 2025.12.08 |
|---|---|
| [Trouble Shooting] Kafka Connect No suitable driver found (0) | 2025.11.21 |
| [Thouble Shooting] CORS (0) | 2025.11.05 |
