분산 환경에서의 Feign Client
단일 서비스(Monolith) 환경에서는 모든 데이터가 하나의 DB에 있어 JOIN 쿼리 한 번으로 해결 가능. 하지만 서비스를 기능별로 쪼갠 분산 환경에서는 다음과 같은 문제에 직면
- 데이터의 격리 (Data Silos): 유저 정보는 UserService DB에, 주문 내역은 OrderService DB에 각각 물리적으로 분리
- 물리적 JOIN 불가능: 네트워크로 분리된 두 DB를 직접 JOIN 할 수 없음
- API Composition 패턴: 유저 상세 정보를 보여주려면 각 서비스의 API를 호출해 데이터를 수집하고 조립(Aggregation)하는 주체가 필요
- 위치 투명성 (Location Transparency): 각 서비스가 동적으로 확장되거나 위치가 바뀌더라도, 고정된 IP가 아닌 '서비스 이름'만으로 서로를 찾아낼 수 있어야 함
OpenFeign은 Netflix에서 개발한 선언적 HTTP 클라이언트
- 인터페이스 기반: 단순히 인터페이스를 선언하고 어노테이션을 붙이는 것만으로 외부 서비스 호출이 가능
- Eureka 연동: 별도의 주소 설정 없이 유레카에 등록된 서비스 이름(orderservice)만으로 통신
UserDto
@Data
public class UserDto {
private String email;
private String userId;
// ... 중략 ...
// [추가]
private List<ResponseOrder> orders;
}
기본 유저 정보만 있던 UserDto에 주문 정보를 담을 수 있는 필드를 추가
OrderSeviceClient
@FeignClient(name = "orderservice")
public interface OrderServiceClient {
@GetMapping("/orders/{userId}")
List<ResponseOrder> getOrders(@PathVariable("userId") String userId);
}
userservice 내부에서 orderservice를 어떻게 부를지 인터페이스를 생성
UserService
@Service
public class UserService {
private final UserRepository userRepository;
private final OrderServiceClient orderServiceClient;
public UserDto getUserByUserId(String userId) {
User user = userRepository.findByUserId(userId).orElseThrow();
List<ResponseOrder> ordersList = orderServiceClient.getOrders(userId);
UserDto userDto = modelMapper.map(user, UserDto.class);
userDto.setOrders(ordersList);
return userDto;
}
}
UserService에서 두 서비스의 데이터를 합치는 비즈니스 로직을 구현
결과 확인 및 성과
모든 설정을 마치고 API를 호출했을 때, 다음과 같은 결과
- Eureka: 모든 서비스가 정상적으로 등록되어 위치 투명성을 확보
- 통합 응답: 유저 정보와 함께, 주문 서비스로부터 받은 빈 리스트("orders": [])가 포함된 JSON 응답을 확인
feat: OpenFeign을 이용한 서비스 간 통신 및 데이터 통합 구현 by 0hj1hyeon · Pull Request #2 · 0hj1hyeon/msa-l
UserService와 OrderService 간 동기 통신을 위한 OpenFeign 도입 유저 상세 정보 조회 시 주문 내역을 포함하도록 데이터 어그리게이션(Aggregation) 로직 추가 UserRepository에 userId 기반 조회 메서드(findByUserId)
github.com
'분산 처리 환경' 카테고리의 다른 글
| 스프링 분산 처리 환경 19: Spring Cloud Config 설정 분리 및 Docker + GitHub Actions CI/CD 트러블슈팅 (1) | 2026.03.24 |
|---|---|
| 스프링 분산 처리 환경 18: Github Action (0) | 2026.02.10 |
| 스프링 분산 처리 환경 16: Config Server (0) | 2026.01.23 |
| 스프링 분산 처리 환경 15: MSA (0) | 2026.01.15 |
| 스프링 분산 처리 환경 14: Nginx 로드밸런싱 (1) | 2026.01.02 |