1 분 소요

FeignClient

  • FeignClient -> HTTP Client
    - REST Call을 추상화한 Spring Cloud Netflix 라이브러리
  • 사용 방법
    - 호출하려는 HTTP Endpoint에 대한 Interface를 생성
    - @FeignClient 선언
  • Load balanced 지원

user-service

pom.xml

<!-- Feign Client -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

UserServiceApplication.java

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients // 🌟 추가
public class UserServiceApplication {
    ...
}

OrderServiceClient.java - 인터페이스 생성

@FeignClient(name = "order-service") // 호출하려는 마이크로 서비스 이름
public interface OrderServiceClient {

    @GetMapping("/order-service/{userId}/orders") // prefix + uri
    List<ResponseOrder> getOrders(@PathVariable String userId);
}

UserServiceImpl.java

UserServiceImpl에서 Feign Client를 사용한다.
코드에서는 생략했지만, OrderServiceClient는 생성자 주입을 통해 주입받았다.

@Service
public class UserServiceImpl implements UserService {
    ...
    @Override
    public UserDto getUserByUserId(String userId) {

        UserEntity userEntity = userRepository.findByUserId(userId);
        UserDto userDto = new ModelMapper().map(userEntity, UserDto.class);

        // 주문 생성
        /* Using RestTemplate */
        // String orderUrl = String.format(env.getProperty("order-service.url"), userId);
        // ResponseEntity<List<ResponseOrder>> orderListResponse =
        //     restTemplate.exchange(orderUrl, HttpMethod.GET, null,
        //                           new ParameterizedTypeReference<List<ResponseOrder>>() {});
        // List<ResponseOrder> orderList = orderListResponse.getBody();

        /* 🌟 Using FeignClient */
        List<ResponseOrder> orderList = orderServiceClient.getOrders(userId);

        userDto.setOrders(orderList);

        return userDto;
    }
}

RestTemplate를 사용할 때 보다 코드 양이 훨씬 줄어들고, 직관적이다.

테스트

이전과 마찬가지로, 유레카 서버 -> config-service -> gateway-service -> user-service -> order-service 순으로 기동하자.
사용자 회원가입부터 마친 후 테스트해보자.

아까처럼 주문을 한 뒤에 사용자 단건 조회를 해보면, 아래와 같이 orderList의 1개의 데이터를 가지고 오는 것을 확인할 수 있다.
스크린샷 2022-10-07 오후 5 02 00
resume 버튼을 클릭하게 되면 “사용자 단건 조회” 시에도 사용자의 “주문 정보”까지 가져왔음을 확인할 수 있다.
스크린샷 2022-10-07 오후 5 03 24

🤔 RestTemplate과 FeignClient 중 어떤 것을 사용하는게 좋을까?

당연하겠지만, 각각 장단점이 존재한다.

FeignClient 방식을 사용했을 때, 코드가 간결해지는 것은 맞지만 그렇다고 무조건 FeignClient 방식이 좋은 것은 아니다.
왜냐하면 FeignClient 방식을 사용하게되면,
user-serviceorder-service를 개발한 사람이 아니라면, 다른 마이크로 서비스와 통신을 하고 있다는 것을 파악하기 어려울 수 있기 때문이다.

반면 RestTemplate 방식은 http의 ip, 포트번호, uri, end point, http method, parameter 등등을 가지고 전달하기 때문에
전통적으로 많이 사용해오고 있지만, 코드가 복잡해진다는 단점이 있다.



💛 개인 공부 기록용 블로그입니다. 👻

맨 위로 이동하기