적용하기 전 : 뭔가 어노테이션만 붙이면 알아서 착착 해줄 것 같은 느낌~
적용 후 : 작성할 "코드"가 줄어듦, 정말 코드가 줄어드는게 전부임
✅ 서비스간의 호출이 잦은 경우 생산성 향상 / 코드 한 줄이라도 더 줄여줘서 편함
A에서 B를 호출하는 경우
다른서비스를 호출할 쪽(A)에서 OpenFeign 의존성을 추가
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign:4.1.0'
버전을 통일시키기 위해 이렇게 작성해 줌
ext {
set('springCloudVersion', "2023.0.0")
}
dependencies {
...
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
OpenFeign을 활성화하기 위해 다른 Spring Cloud 기술들과 비슷하게 @EnableFeignClients를 선언(A)
@SpringBootApplication
@EnableFeignClients // <- 여기서 활성화
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
다른서비스와 통신할 response DTO 생성(A)
@Getter
@Setter
@NoArgsConstructor
public class ProductClientResponse {
@Getter
@Setter
@NoArgsConstructor
public static class DetailForCartList{
private long productId;
private String productName;
private String optionName;
private long optionPrice;
private long optionId;
}
}
OpenFeign 인터페이스 작성(A)
➡️ 필요한 곳에서 private final ProductClient productClient 선언 후 메소드 호출 해주면됨
@FeignClient(name = "product-service")
public interface ProductClient {
@GetMapping("/api/internal/products/{optionId}")
ProductClientResponse.DetailForCartList getDetailForCart(@PathVariable("optionId") long optionId);
}
요청 받을 서비스(B)에 컨트롤러 작성
@RestController
@RequestMapping("/api/internal/products")
@RequiredArgsConstructor
public class ProductInternalController {
private final OptionService optionService;
@GetMapping("/{optionId}")
public ResponseEntity<OptionResponse.OptionProductDetailsForCart> getDetailsForCartList(@PathVariable("optionId") long optionId) {
return ResponseEntity.ok(optionService.findByOptionId(optionId));
}
요청 받을 서비스(B)에 DTO, 메소드 추가 해주면 끝
❗요청하는 서비스(A)의 DTO와 요청 받을 서비스(B) 의 DTO의 필드명이 같아야함
복사+붙여넣기 해주자