MSA

[MSA 3일차] - OpenFeign적용해서 RestTemplate과 차이 알기

주우우우우우우욱 2025. 6. 8. 23:52
728x90
반응형
SMALL

이전 포스팅과 연관된 내용이 많기 때문에 참고용으로 올려두겠다.

 

 

[MSA 2일차] - 스프링 클라우드로 MSA 구조 찍먹하기

MSA에 대한 개념은 이전 포스팅을 참고 바란다.https://seungwon081.tistory.com/118 [MSA 2일차] - 스프링 클라우드 서비스 디스커버리 알아보자MSA구조로 프로젝트를 진행하면 무조건 듣는 필수 단어이다.

seungwon081.tistory.com

 

📜OpenFeign이란?

넷플릭스에서 만들어진 선언적인 HTTP Client 도구로써 외부 API를 쉽게 호출할 수 있도록 도와준다.

선언적이란 어노테이션 사용을 의미하는데 

OpenFeign은 인터페이스에 어노테이션만 붙여주면 구현이 되는 것이다. 

이러한 방식은 JPA방식과 매우 유사하다고 한다.

RestTemplate를 사용하는 방식과는 다르게 호출할 서비스 이름만 붙여주면 되는 것이다.

그럼 마치 내 프로젝트에 있는 메소드 처럼 선언을 할 수 있다.

호출하려는 외부 서비스API명세서에 맞춰서 인터페이스를 정의 한 후, 각 메소드에 HTTP요청 방식에 맞는 어노테이션과 함께 호출할 경로, 파라미터 등을 명시해주기만 하면 된다.

 

그럼 실습을 통해서 알아보자

 

 

 

이미 만들어진 User와 Alim 서비스에 의존성과 어노테이션만 추가해주면 된다.

build.gradle

implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'

 

main메서드

@EnableFeignClients

해당 어노테이션만 추가해주면 FeignClient를 사용할 수 있게 된다.

 

RemoteAlimService.java

package com.welab.backend_user.remote.alim.dto;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

@FeignClient(name = "backend-alim", path = "/backend/alim/v1")
public interface RemoteAlimService {
    @GetMapping(value = "/hello")
    public String sms();
    
    @PostMapping(value = "/sms")
    public SendSmsDto.Response sendSms(@RequestBody SendSmsDto.Request request);
}

엄청 간결해진 것을 알 수 있다.

또한 이렇게 구성을 해두면 backend-alim의 API를 자신것인거마냥 사용할 수 있게된다.

 

📜RestTemplate을 사용했을 때의 서비스 로직 구성을 볼까?

@Service // 비즈니스 레이어에서 사용할 service임을 명시한다.
@RequiredArgsConstructor //final이 붙은 객체의 생성자를 생성해줌
public class RemoteAlimService {
    private final RestTemplate restTemplate;

    public String callAlimHello(){
        return restTemplate.getForObject(
                "http://alim-service/backend/alim/v1/hello",
                String.class
        );
    }
}

RestTemplate을 사용하면서 해당 로직의 서비스 이름과 url을 합쳐서 불러왔어야 됐다.

 

📜다시 OpenFeign이어서 컨트롤러 작성하자

UserController.java

@Slf4j
@RestController
@RequestMapping(
        value = "/api/user/v1",
        produces = MediaType.APPLICATION_JSON_VALUE
)
@RequiredArgsConstructor
public class UserController {
    private final RemoteAlimService remoteAlimService;

    @PostMapping(value = "/sms")
    public String sms(@RequestBody SendSmsDto.Request request){
        var response = remoteAlimService.sendSms(request);
        return "OK";
    }
}

 

컨트롤러 코드도 변한 것 하나 없다. 그냥 인터페이스를 호출해주면 끝인 것이다.

 

그럼 포스트맨으로 확인해보자

호출이 에러없이 잘 뜨는 것을 볼 수 있다.

 

728x90
반응형
LIST