OpenFeign 간단 소개 및 사용

Jiyeon·2024년 6월 2일

ninishop

목록 보기
3/6

OpenFeign 이란?

  • HTTP 클라이언트를 작성하기 위해 Netflix에서 개발한 선언적 웹 서비스 클라이언트
  • Java 인터페이스와 어노테이션을 사용하여 RESTful 웹 서비스 호출을 쉽게 작성 및 사용 가능
  • Spring Cloud와 통합하여 사용하는 경우, OpenFeign을 통해 마이크로서비스 간 통신을 간편화

적용하기 전 : 뭔가 어노테이션만 붙이면 알아서 착착 해줄 것 같은 느낌~
적용 후 : 작성할 "코드"가 줄어듦, 정말 코드가 줄어드는게 전부임
✅ 서비스간의 호출이 잦은 경우 생산성 향상 / 코드 한 줄이라도 더 줄여줘서 편함

간단 사용예시

A에서 B를 호출하는 경우

  1. 다른서비스를 호출할 쪽(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}"
        }
    }
  2. OpenFeign을 활성화하기 위해 다른 Spring Cloud 기술들과 비슷하게 @EnableFeignClients를 선언(A)

    @SpringBootApplication
    @EnableFeignClients // <- 여기서 활성화
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }
  3. 다른서비스와 통신할 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;
        }
    }
    
  4. 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);
    }
  5. 요청 받을 서비스(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));
        }
  6. 요청 받을 서비스(B)에 DTO, 메소드 추가 해주면 끝

    ❗요청하는 서비스(A)의 DTO와 요청 받을 서비스(B) 의 DTO의 필드명이 같아야함
    복사+붙여넣기 해주자

profile
개발자

0개의 댓글