ecommerce 프로젝트에서 order측에서 새로운 주문 등록을 진행할 때, 서비스간 통신을 통해 customer에서 사용자 이름을 가져오는 예제를 RestTemplate 방식과 FeignClient 방식으로 수행해 보자!
- 스프링에서 제공하는 http 통신에 유용하게 쓸 수 있는 템플릿
- HTTP 서버와의 통신을 단순화하고 RESTful 원칙을 지킴
@GetMapping(value = "/rest/customers/{userid}")
public int selectCustomerByUserid(@PathVariable("userid") String userid) throws Exception{
return customerService.selectCustomerByUserid(userid);
}
@Value("${customer.api.url}")
String customer_api_url;
@Bean // @Bean 지정하여 자동으로 메서드 호출
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
@Autowired // @Bean에서 생성된 RestTemplate을 주입받는다.
RestTemplate restTemplate;
@Override
public int insertOrder(Order order) throwx Exception {
// Order 안에 고객명이 누락된 상태
String url = customer_api_url + "/rest/customers/" + order.getUserId();
Customer cust = restTemplate.getForObject(url, Customer.class);
order.setName(cust.getName());
return orderRepository.insertOrder(order);
}
@Autowired
OrderService orderService;
@PostMapping(value="insertOrder")
public int insertOrder(@RequestBody Order order)throws Exception{
order.setOrderId(UUID.randomUUID().toString());
return orderService.insertOrder(order);
}
- Netflix 에서 개발된 Http client binder
- Spring Cloud에서 제공
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
@SpringBootApplication
@EnableFeignClients
public class EcommerceOrderApplication {
public static void main(String[] args) {
SpringApplication.run(EcommerceOrderApplication.class, args);
}
}
@FeignClient(name = "ecommerce-custommer", url = "http://localhost:{customer 포트번호}/ecommerce/customer")
public interface CustomerFeignClient {
@GetMapping(value = "/rest/customers/{userid}")
public Customer retrieveCustomer(@PathVariable("userid") String userid) throws Exception;
}
http://localhost:{customer 포트번호}/ecommerce/customer/rest/customer/{userid}
가 된다.// Fein Client 주입
@Autowired
CustomerFeignClient customerFeignClient;
@Override
public int inserOrderFeign(Order order) throws Exception {
Customer cust = customerFeignClient.retrieveCustomer(order.getUserId());
order.setName(cust.getName());
return orderRepository.insertOrder(order);
}