RestTemplate 은 스프링에서 제공하는 HTTP 요청 및 응답을 위한 라이브러리입니다.
HTTP 프로토콜을 사용하는 외부 웹 서버와의 통신의 복잡한 과정을 매번 구현하는 대신, 확장성이 높은 API를 개발자에게 제공함으로써 반복되는 코드를 줄여 생산성을 높이고 더해, 원하는 데이터 타입으로 리턴받을 수 있도록 합니다. .
따라서 개발자는 RestTemplate에게 HTTP 요청할 URI를 지정하고, 어떤 객체를 사용하여 상호작용할지에만 집중할 수 있습니다.
하지만 이런 효과적인 기능들을 잘 사용하기 위해서는 RestTemplate이 개발자에게 제공하는 API에 대한 이해와 기능적인 특징들을 숙지해야 합니다.
이 포스팅에서는 RestTemplate의 특성, 작동 방식, 개발자에게 제공하는 API에 집중해 설명하겠습니다.
[1] RestTemplate Property
1. Property
Http 프로토콜 메소드를 제공합니다. (GET, POST, DELETE, PUT, ...)
RESTful 형식을 갖췄습니다.
다양한 형식으로 요청, 응답 받을수 있습니다.
블로킹 기반의 동기적인 통신을 지원합니다.
2. Operation Flow
RestTemplate은 내부적으로 다음과 같이 동작합니다.
1. 어플리케이션이 RestTemplate의 메소드를 호출 합니다.
2. RestTemplate은 어플리케이션이 파라미터로 제공한 URI와 객체를 HttpMessageConverter를 이용해 HttpMessage객체로 변환합니다.
3. RestTemplate의 내부 인스턴스 필드로 존재하는 ClientHttpRequestFactory의 createRequest()를 호출하여 ClientHttpRequest 객체를 받습니다. 이 객체는 RestTemplate내에서 RequestCallback에 의해 요청처리 됩니다. 이렇게 바디, 헤더, 메소드가 담긴 HTTP 요청메시지가 외부 웹 서버로 전송됩니다.
( 이때, 이를 실행하던 쓰레드는 여기서 블록되며, 후에 응답으로 인한 이벤트가 발생하면 다시 스케줄되어 실행 됩니다 )
4. 응답을 받은 RestTemplate은 이를 ResponseErrorHandler를 통해 오류를 확인하며 오류가 없다면 ClientHttpResonse로부터 응답을 가져옵니다.
5. 응답을 다시 HttpMesageConverter를 통해 파라미터로 주어진 클래스에 맞게 수정합니다.
6. 응답을 어플리케이션에 리턴합니다.
HttpComponentClientHttpRequestFactory 커스텀 하고 RestTemplate에 주입함으로써 RestTemplate의 기본설정을 바꿀 수 있습니다. 바꿀 수 있는 설정은 위 그림에서 등장한 클래스들에 대한 수정을 포함하여 외부 웹서버와의 통신에 대한 설정까지 (특히 3번에서 해당 스레드가 몇초동안 waitingstate로 존재하게 할것인지) 설정할 수 있습니다. 뒤에서 예시와 함께 설명 하겠습니다.
[2] RestTemplate API
1. RestTemplate Method Parameters
RestTemplate 메소드는 HTTP요청을 위해 url, 반환받을 클래스 타입, body 및 header 등등을 파라미터로 전달받습니다. 이를 이용해 RestTemplate는 위와 같은 내부 동작을 거쳐 어플리케이션에게 객체를 리턴합니다.
RestTemplate의 메소드는 두 가지 유의사항이 있습니다.
1. RestTemplate 메소드는 RestTemplate의 각각의 기본 메소드에 대해 총 세가지 방식의 메소드를 제공합니다.
위의 두 메소드는 1번째 파라미터로 주어진 url 템플릿 변수( {} 로 감싸진 )에 대해 urlVariables를 통해 인자를 주입할 수 있습니다.
이를 이용해 자주 사용되어질 변수들을 Map 자료구조에 담아 재사용할 수 있습니다. 또한, 단일 url을 지정하는 메소드도 제공합니다.
2. RestTemplate 메소드는 인자로 주어지는 문자열(java.lang.String)을 URL인코딩 합니다.
이로 인해 아래와 같이 의도하지 않은 방식으로 요청될 수 있습니다.
이런 자동 인코딩을 원하지 않는다면, URI 파라미터(java.net.uri)를 사용하는 메소드(1번의 세번째 메소드)를 사용하면 됩니다.
2. RestTemplate Object Convertions
RestTemplate은 파라미터 객체, 그리고 리턴값 객체에 대해 HTTPMessageConverter를 적용하여 파싱합니다.
파라미터로 전달한 클래스 타입으로 HttpMessageConverter가 변환해줍니다.
HttpMessageConverter에 대해서 다음에 자세히 알아보겠습니다.
3. RestTemplate Constructor
RestTemplate의 생성자는 두가지 종류가 있습니다.
1. 기본 설정을 이용하는 RestTamplate을 이용하는 방법
이는 RestTemplate의 기본설정을 그대로 유지하여 사용하는 방법입니다.
RestTemplate은 기본적으로 풀 제한 및 타임아웃 제한이 없습니다.
RestOperations restClientDefault = new RestTemplate();
2. ClientRequestFactory를 파라미터로 받아 변경하는 방법이 있습니다.
이를 활용해 RestTemplate을 이용하는 모든 Http 요청에 대해 어플리케이션이 원하는 설정을 적용할 수 있습니다.
아래와 같이 연결성정을 바꿀 수 있습니다.
@Configuration
public class RestClientConfig {
@Bean
RestTemplate restTemplate(HttpComponentsClientHttpRequestFactory factory) {
return new RestTemplate(factory);
}
@Bean
HttpComponentsClientHttpRequestFactory httpComponentsClientHttpRequestFactory() {
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
factory.setConnectTimeout(Duration.ofSeconds(5));
// 클라이언트가 서버에 연결을 시도하고 5초 이내에 성공하지 못할 경우 타임아웃이 발생함을 의미합니다.
factory.setConnectionRequestTimeout(Duration.ofSeconds(5));
// 클라이언트가 연결 풀에서 사용 가능한 연결을 기다리는 최대 시간을 의미합니다. 이 시간이 초과되면 타임아웃 예외가 발생합니다
return factory;
}
}
'SpringBoot' 카테고리의 다른 글
[SpringBoot] 스프링의 에러처리 탐구 (0) | 2024.01.17 |
---|---|
[Spring] Spring Security 인증 구성 (0) | 2024.01.02 |
[Spring] 다수의 SecurityFilterChain 구성 방법 (0) | 2024.01.01 |
[Spring] Spring Security Architecture (1) | 2023.12.29 |
SpringBoot의 작동원리를 직접 구현 해보며 이해하자(1) - Servlet (0) | 2023.12.22 |