[ZB_BOOK STUDY] 스프링 부트 핵심 가이드 (12)

Dreamer·2024년 5월 5일
0
post-thumbnail

📖 스프링 부트 핵심 가이드

: 스프링 부트를 활용한 애플리케이션 개발 실무


📝 목차

12장. 서버 간 통신

12-1. RestTemplate이란?
- RestTemplate의 동작 원리
- RestTemplate의 대표적인 메서드

12-2. RestTemplate 사용하기
- 서버 프로젝트 생성하기
- RestTemplate 구현하기
- RestTemplate 커스텀 설정

12-3. WebClient란?
- WebClient 구성

12-4. WebClient 사용하기
- WebClient 구현

12-5. 정리


12장.서버 간 통신

다른 서버로 웹 요청을 보내고 응답을 받을 수 있게 도와주는 RestTemplate과 WebClient에 대해서 공부해보자

12-1. RestTemplate이란?

: 스프링에서 HTTP 통신 기능을 손쉽게 사용하도록 설계된 템플릿이다.
서버와의 통신을 단순화한 RestTemplate을 이용하면 RESTful 원칙을 따르는 서비스를 편리하게 만들 수 있다.

RestTemplate은 기본적으로 동기 방식으로 처리 된다.
비동기 방식으로 사용하고 싶을 경우 ➡️ AsyncRestTemplate을 사용하면 된다.

RestTemplate은 현업에서 많이 쓰이나 지원이 중단(deprecated)된 상태

RestTemplate의 특징

  • HTTP 프로토콜의 메서드에 맞는 여러 메서드를 제공한다.
  • RESTful 형식을 갖춘 템플릿이다.
  • HTTP 요청 후 JSON, XML, 문자열 등의 다양한 형식으로 응답을 받을 수 있다.
  • 블로킹(blocking) I/O 기반의 동기 방식으로 사용한다.
  • 다른 API를 호출할 때 HTTP 헤더에 다양한 값을 설정할 수 있다.

RestTemplate의 동작 원리

RestTemplate의 동작 방식

  1. 애플리케이션에서 RestTemplate를 선언 ➡️ URI, HTTP 메서드, Body등을 설정

  2. 외부로 API 요청 ➡️ RestTemplate에서 HttpMessageConverter를 통해 RequestEntity 요청 메세지로 변환

  3. 변환된 메세지를 ClientHttpRequestFactory를 통해 ClientHttpRequest로 가져온 후 ➡️ 외부 API로 요청

  4. 외부에서 요청에 대한 응답을 받으면 RestTemplate은 ResponseErrorHandler로 오류 확인하고 오류가 있다면 ClientHttpResponse 에서 응답 데이터를 처리

  5. 받은 응답 데이터가 정상이라면 다시 한번 HttpMessageConverter를 거쳐 자바 객체로 변환해서 애플리케이션으로 반환

RestTemplate의 대표적인 메서드

메서드HTTP 형태설명
getForObjectGETGET 형식으로 요청한 결과를 객체로 반환
getForEntityGETGET 형식으로 요청한 결과를 ResponseEntity 형식으로 반환
postForLocationPOSTPOST 형식으로 요청한 결과를 헤더에 저장된 URI로 반환
postForObjectPOSTPOST 형식으로 요청한 결과를 객체로 반환
postForEntityPOSTPOST 형식으로 요청한 결과를 ResponseEntity 형식으로 반환
deleteDELETEDELETE 형식으로 요청
putPUTPUT 형식으로 요청
patchForObjectPATCHPATCH 형식으로 요청한 결과를 객체로 반환
optionsForAllowOPTIONS해당 URI에서 지원하는 HTTP 메서드를 조회
exchangeanyHTTP 헤더를 임의로 추가할 수 있고, 어떤 메서드 형식에서도 사용할 수 있음
executeany요청과 응답에 대한 콜백을 수정

12-2. RestTemplate 사용하기

서버 프로젝트 생성하기

RestTemplate 구현하기

  • GET 형식의 RestTemplate 작성하기
  • POST 형식의 RestTemplate 작성하기

RestTemplate을 생성하고 사용하는 방법은 아주 다양하다.
그 중 가장 보편적인 방법은 UriComponentsBuilder를 사용하는 방법

✅ UriComponentsBuilder는 스프링 프레임워크에서 제공하는 클래스로서 여러 파라미터를 연결해서 URI 형식으로 만드는 기능을 수행한다.

RestTemplate 커스텀 설정

RestTemplate는 기본적으로 커넥션 풀을 지원하지 않음
이 기능을 지원하지 않으면 매번 호출시 포트를 열어 커넥션을 생성하게 되는데, TIME_WAIT 상태가 된 소켓을 다시 사용하려고 접근 ➡️ 재사용 불가

이를 방지하지 위해 커넥션 풀 기능을 활성화 ➡️ 재사용할 수 있게 하는 것이 좋다.
이 기능 활성화하는 대표적인 방법이 아파치에서 제공하는 HTTPClient로 대체해서 사용하는 방식이다. HTTpClient 사용시 의존성을 추가해야 한다.

12-3. WebClient란?

: Spring WebFlux는 HTTP 요청을 수행하는 클라이언트로 WebClient를 제공한다.
WebClient는 리액터 기반으로 동작하는 API여서 스레드아 동시성 문제를 벗어나 비동기형식으로 사용할 수 있다.

WebClient 특징

  • 논블로킹(Non-Blocking) I/O를 지원한다.
  • 리액티브 스트림(Reactive Streams)의 백 프레셔(Back Pressure)를 지원한다.
  • 적은 하드웨어 리소스로 동시성을 지원한다.
  • 함수형 API를 지원한다.
  • 동기, 비동기 상호작용을 지원한다.
  • 스트리밍을 지원한다.

WebClient 구성

WebClient를 사용하려면 WebFlux 모듈에 대한 의존성을 추가해야 한다.

⬇️ Gradle

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-webflux'
}

⬇️ Maven

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>
</dependencies>

WebFlux는 클라이언트와 서버 간 리액티브 애플리케이션 개발을 지원하기 위해 스프링 프레임워크 5에서 새롭게 추가된 모듈이다.

12-4. WebClient 사용하기

WebClient 구현

WebClient를 생성하는 방법은 다음과 같이 크게 두 가지가 있다.
1. create() 메서드를 이용한 생성
2. builder()를 이용한 생성

WebClient는 객체를 우선 생성한 후 요청을 전달하는 방식으로 동작
builder() 를 통해 baseUrl() 메서드에서 기본 URL을 설정하고
defaultHeader() 메서드로 헤더의 값을 설정

일반적으로는 WebClient 객체를 생성한 후 재사용하는 방식으로 구현하는 것이 좋다.

⬇️ builder()를 사용할 경우 확장할 수 있는 메서드

✅ defaultHeader() : WebClient의 기본 헤더 설정
✅ defaultCookie() : WebClient의 기본 쿠키 설정
✅ defaultUriVariable() : WebClient의 기본 URI 확장값 설정
✅ filter() : WebClient에서 발생하는 요청에 대한 필터 설정

빌드 된 WebClient는 변경할 수 없다.
하지만 복사해서 사용은 가능 ➡️ webClient.mutate() 로 복제해 사용할 수 있다.

  • GET요청과 POST요청 예제

자세한 WebClient의 사용법은 공식 문서에서 확인할 수 있다.
https://docs.spring.io/spring-framework/reference/web/webflux-webclient.html

profile
Moving forward based on records

0개의 댓글