스프링 에서 제공하는 http 통신을 유용하게 쓸 수 있는 템플릿 이며, HTTP 서버와의 통신을 단순화 하고 Restful 원칙을 지킨다. 또한 단순 반복 작업들을 단 몇줄 만으로 작성 할 수 있어서 개발 생산성을 높인다고 생각한다.
RestTemplate 특징
반복적인 코드를 최대한 줄여 준다
Restful 형식에 맞춰져 있다.
json, xml 쉽게 응답 받을 수 있다
RestTemplate 내부 구조
org.springframework.http.client 패키지에 존재 한다. httpclient는 Http를 사용하는 범용 라이브러리 이고
RestTemplate은 httpClient를 추상화(HttpEntity의 json, xml) 해서 제공해준다. 내부 통신은 Apache HttpComponents를 사용한다. 만약 RestTemplate이 없다면 직접 json, xml 라이브러리를 사용해야 했을 것이다.
통신 과정
어플리케이션이 RestTemplate을 생성하고 URL, HTTP 메소드 등의 헤더를 담아 요청을 보낸다
RestTemplate이 HttpMessageConverter 사용하여 requestEntity를 요청 메시지로 변환한다. 즉
json 형태로 변환한다.
RestTemplate은 ClientHttpRequestFactory로 부터 ClientHttpRequest를 가져와 요청을 보낸다
ClientHttpRequest는 요청 메시지를 만들어서 Http 프로토콜을 통해 서버와 통신한다.
RestTemplate은 ResponseErrorHandler 오류를 확인하고 처리 로직을 태운다
ResponseErrorHandler 가 오류 있으면 ClientHttpResponse 에 응답데이터를 가져와 처리 한다.
RestTemplate은 HttpMessageConverter 를 이용해서 응답 메시지를 java Object로 변환한다
어플리케이션을 반환 한다.
나중에 이슈 될 문제
RestTemplate은 connection pool 을 사용하지 않는다. 그 말은 연결 할 때 마다 로컬 포트를 열고 tcp connection을 맺는다 문제는 그 이후인데... close된 이후 소켓은 time_wait 상태가 되는데 트래픽이 많이지게 되면 이런 소켓들이 재사용 하지 못하고 응답 지연이 될 것이다. 왜냐하면 연결을 맺었다 끊었다 하는 작업이 비용이 적지 않은 문제인데 계속 연결을 맺고 끊고 하면 속도가 느려질 것이다. 더군다나 지금 현재 장비 스펙이 그렇게 좋지 않고...
이슈에 대한 생각
커넥션 풀을 사용한다는건 리소스를 잡아서 수행한다는 건데 지금 현재 트래픽이 이상없을거 같고 넥스터즈 홍보때 트래픽이 몰려서 제가 생각하는 것은 홍보 할때 RestTemplate의 커넥션 풀을 지정해주는 것이 좋다고 생각합니다
RestTemplate 이란?
RestTemplate 특징
RestTemplate 내부 구조
통신 과정
나중에 이슈 될 문제
이슈에 대한 생각