REST 엔드포인트 사용

김우진·2026년 2월 21일

Spring

목록 보기
12/17
post-thumbnail

[Spring] 11. REST 엔드포인트 사용 (외부 API 호출)

실제 백엔드 솔루션 구축 시, 하나의 백엔드 앱이 다른 백엔드 앱이 노출한 엔드포인트를 호출해야 하는 경우가 빈번합니다. 이를 구현하기 위한 스프링의 주요 방법론을 정리했습니다.


1. REST 엔드포인트를 호출하는 3가지 방법

  1. OpenFeign: 스프링 클라우드(Spring Cloud) 프로젝트에서 제공하는 도구입니다.
  2. RestTemplate: 현재까지도 스프링 앱에서 자주 사용되는 방식입니다. 하지만 OpenFeign이 더 좋은 대안이므로 신규 프로젝트에서는 OpenFeign 사용을 권장합니다.
  3. WebClient: 비동기/논블로킹 처리를 위한 리액티브(Reactive) 방식의 도구입니다.

2. OpenFeign (권장 방식)

OpenFeign은 인터페이스와 애너테이션 기반으로 동작하며, 개발자가 메서드를 직접 구현할 필요가 없다는 것이 가장 큰 장점입니다.

  • 주요 메커니즘: 애너테이션으로 인터페이스 메서드를 정의하고 위치를 지정하면, OpenFeign이 이를 직접 구현하여 의존성 주입(DI)으로 제공합니다.
  • 주요 특징:
    • OpenFeign 클라이언트: OpenFeign을 통해 정의된 인터페이스를 일컫는 용어입니다.
    • @FeignClient: REST 클라이언트를 구성하는 핵심 애너테이션으로, 프록시 이름과 기본 URI를 정의합니다.
    • 설정 관리: 환경마다 달라질 수 있는 URI 및 세부 정보는 항상 프로퍼티(property) 파일에 저장하여 관리하는 것이 원칙입니다.
    • 활성화: 구성 클래스에서 @EnableFeignClients를 사용하여 기능을 활성화하고 스캔할 위치를 지정합니다.
    • 주입: 컨트롤러 등에서 해당 인터페이스를 주입받아 일반 메서드처럼 사용합니다.
@FeignClient(name = "payments", url = "${name.service.url}")
public interface PaymentsProxy {

    @PostMapping("/payment")
    Payment createPayment(
        @RequestHeader String requestId,
        @RequestBody Payment payment
    );
}
@Configuration
@EnableFeignClients(basePackages = "com.example.spring_test.proxy")
public class ProjectConfig {
}
@RestController
public class PaymentsController {

    private final PaymentsProxy paymentsProxy;

    public PaymentsController(PaymentsProxy paymentsProxy) {
        this.paymentsProxy = paymentsProxy;
    }

    @PostMapping("/payment")
    public Payment payment(
            @RequestBody Payment payment
    ){
        String requestId = UUID.randomUUID().toString();
        return paymentsProxy.createPayment(requestId,payment);
    }
}

3. RestTemplate (전통적 방식)

직접 HTTP 요청 구성 요소들을 인스턴스화하여 호출을 전송하고 응답을 수신하는 방식입니다.

  • 구현 프로세스:
    1. HttpHeader: 인스턴스를 생성 및 구성하여 HTTP 헤더를 정의합니다.
    2. HttpEntity: 요청 데이터인 헤더와 본문을 하나로 나타내는 인스턴스를 생성합니다.
    3. exchange() 메서드: 실제 HTTP 호출을 전송하고 응답을 수신합니다.
  • 구성 방식: 컨트롤러에서 사용하며, 구성 클래스에서 RestTemplate 빈(Bean)을 직접 생성하거나 스캔 위치를 알려주어야 합니다.
@Component
public class PaymentsProxy {

    private final RestTemplate rest;

    @Value("${name.service.url}")
    private String paymentsServiceUrl;

    public PaymentsProxy(RestTemplate rest) {
        this.rest = rest;
    }

    public Payment createPayment(Payment payment){
        String uri = paymentsServiceUrl + "/payment";

        HttpHeaders headers = new HttpHeaders(); //1)
        headers.add("requestId", UUID.randomUUID().toString());

        HttpEntity<Payment> httpEntity = new HttpEntity<>(payment,headers); //2)

        ResponseEntity<Payment> response = rest.exchange(uri, HttpMethod.POST,httpEntity,Payment.class);
				//3)

        return response.getBody();
    }
}
@RestController
public class PaymentsController {

    private final PaymentsProxy paymentsProxy;

    public PaymentsController(PaymentsProxy paymentsProxy) {
        this.paymentsProxy = paymentsProxy;
    }

    @PostMapping("/payment")
    public Payment createPayment(
           @RequestBody Payment payment
    ){
        return paymentsProxy.createPayment(payment);
    }
}
@Configuration
public class ProjectConfig {

  @Bean
  public RestTemplate restTemplate() {
    return new RestTemplate();
  }
}

🎯 오늘의 요약

  • OpenFeign은 구현 코드를 줄여주어 생산성이 높고 유지보수에 유리하다.
  • RestTemplate은 명시적으로 요청 과정을 관리할 수 있으나 상대적으로 번거롭다.
  • 모든 외부 서비스 연동 정보는 설정 파일로 관리하여 유연성을 확보해야 한다.

#Spring #OpenFeign #RestTemplate #WebClient #API_Call #백엔드공부

0개의 댓글