분산 처리 환경

스프링 분산 처리 환경 17: Feign Client

ohji52 2026. 2. 8. 20:36

 분산 환경에서의 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를 호출했을 때, 다음과 같은 결과

  1. Eureka: 모든 서비스가 정상적으로 등록되어 위치 투명성을 확보
  2. 통합 응답: 유저 정보와 함께, 주문 서비스로부터 받은 빈 리스트("orders": [])가 포함된 JSON 응답을 확인

 

 

feat: OpenFeign을 이용한 서비스 간 통신 및 데이터 통합 구현 by 0hj1hyeon · Pull Request #2 · 0hj1hyeon/msa-l

UserService와 OrderService 간 동기 통신을 위한 OpenFeign 도입 유저 상세 정보 조회 시 주문 내역을 포함하도록 데이터 어그리게이션(Aggregation) 로직 추가 UserRepository에 userId 기반 조회 메서드(findByUserId)

github.com