SMALL

정의

RestTemplate은 Spring에서 제공하는 Http Client

REST 서비스를 호출하는 복잡한 과정을 단순한 방식으로 만들어 주는 클래스

( 기계적이고 반복적인 코드를 깔끔하게 만들 수 있도록 도와준다)

 

Http Client 종류 

RestTemplate 뿐만 아니고 다른 종류의 Http Client가 존재하는데 각각의 특징을 간단하게 알아보자.

  • RestTemplate
    • Spring 3.0에서부터 지원
    • REST API 호출 후, 응답을 받을 때까지 기다리는 동기 방식
  • AsyncRestTemplate
    • Spring 4.0에서부터 지원
    • 비동기 RestTemplate
  • WebClient
    • Spring 5.0에서부터 지원
    • 논 블록, 리엑티브 웹 클라이언트
    • 동기, 비동식 방식 모두 지원 

 

사용법(예시)

 

Bean 등록

@RequiredArgsConstructor
@Configuration
public class WebConfig {
	
    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) {
        return restTemplateBuilder
                .requestFactory(() -> 
                    new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory())
                )
                .setConnectTimeout(Duration.ofMillis(5000)) // connection-timeout
                .setReadTimeout(Duration.ofMillis(5000)) // read-timeout
                .build();
    }
}

 

예시

@RequiredArgsConstructor
@Service
public class RestTestService {

    private final RestTemplate template;
    
    private String getLoggerFromActuator(String url) {
    
        ResponseEntity<String> response = 
            template.getForEntity(url + "/actuator/loggers", String.class);
        
        HttpStatus statusCode = response.getStatusCode();   //상태코드확인
        HttpHeaders headers = response.getHeaders();    //헤더정보확인
        String body = response.getBody();   //바디정보확인
        
        return body;
    }
}

( 각 메서드 별 자세한 예시 : https://advenoh.tistory.com/46 )

RestTemplate 메서드

출처 :&nbsp;https://advenoh.tistory.com/46

Connection Pool 사용

기본적으로 제공되는 RestTemplate는 Connection Pool을 사용하지 않는다.

원한다면 추가적인 설정이 필요하다.

Connection Pool이 존재하지 않는다면, 

RestTemplate을 호출할 때마다, TCP 소켓을 열고, 3-way hand shaking이 발생하여 성능에 문제가 될 수 있고, 

요청량이 많아지게 되면 connection을 재활용할 수 없기 때문에 응답이 지연될 수 있다.

@RequiredArgsConstructor
@Configuration
public class WebConfig {
	
    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) {
    
        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(); 
        factory.setReadTimeout(5000); // 읽기시간초과, ms 
        factory.setConnectTimeout(3000); // 연결시간초과, ms 
        HttpClient httpClient = HttpClientBuilder.create()
                .setMaxConnTotal(100) // connection pool 적용 
                .setMaxConnPerRoute(5) 
                .build(); 
        factory.setHttpClient(httpClient); // HttpClient 세팅 
        
        return new RestTemplate(factory);
    }
}

 

추가 참고 사항

RestTemplate 내부에서는 HttpURLConnection, HttpClient 등을 사용하는데,

해당 클래스들의 대한 내용( https://amagrammer91.tistory.com/65 )

LIST

+ Recent posts