URL-CHOP / Chop-Api

🔪App Server for URL shortener
https://www.nexters.me/
6 stars 1 forks source link

[RestTemplate] RestTemplate 정리 #81

Closed choitaehoon closed 5 years ago

choitaehoon commented 5 years ago

RestTemplate 이란?

  • 스프링 에서 제공하는 http 통신을 유용하게 쓸 수 있는 템플릿 이며, HTTP 서버와의 통신을 단순화 하고 Restful 원칙을 지킨다. 또한 단순 반복 작업들을 단 몇줄 만으로 작성 할 수 있어서 개발 생산성을 높인다고 생각한다.
  • RestTemplate 특징

  • 반복적인 코드를 최대한 줄여 준다
  • Restful 형식에 맞춰져 있다.
  • json, xml 쉽게 응답 받을 수 있다
  • RestTemplate 내부 구조

    image

  • org.springframework.http.client 패키지에 존재 한다. httpclient는 Http를 사용하는 범용 라이브러리 이고 RestTemplate은 httpClient를 추상화(HttpEntity의 json, xml) 해서 제공해준다. 내부 통신은 Apache HttpComponents를 사용한다. 만약 RestTemplate이 없다면 직접 json, xml 라이브러리를 사용해야 했을 것이다.
  • 통신 과정

    1. 어플리케이션이 RestTemplate을 생성하고 URL, HTTP 메소드 등의 헤더를 담아 요청을 보낸다
    2. RestTemplate이 HttpMessageConverter 사용하여 requestEntity를 요청 메시지로 변환한다. 즉 json 형태로 변환한다.
    3. RestTemplate은 ClientHttpRequestFactory로 부터 ClientHttpRequest를 가져와 요청을 보낸다
    4. ClientHttpRequest는 요청 메시지를 만들어서 Http 프로토콜을 통해 서버와 통신한다.
    5. RestTemplate은 ResponseErrorHandler 오류를 확인하고 처리 로직을 태운다
    6. ResponseErrorHandler 가 오류 있으면 ClientHttpResponse 에 응답데이터를 가져와 처리 한다.
    7. RestTemplate은 HttpMessageConverter 를 이용해서 응답 메시지를 java Object로 변환한다
    8. 어플리케이션을 반환 한다.

    나중에 이슈 될 문제

  • RestTemplate은 connection pool 을 사용하지 않는다. 그 말은 연결 할 때 마다 로컬 포트를 열고 tcp connection을 맺는다 문제는 그 이후인데... close된 이후 소켓은 time_wait 상태가 되는데 트래픽이 많이지게 되면 이런 소켓들이 재사용 하지 못하고 응답 지연이 될 것이다. 왜냐하면 연결을 맺었다 끊었다 하는 작업이 비용이 적지 않은 문제인데 계속 연결을 맺고 끊고 하면 속도가 느려질 것이다. 더군다나 지금 현재 장비 스펙이 그렇게 좋지 않고...
  • 이슈에 대한 생각

  • 커넥션 풀을 사용한다는건 리소스를 잡아서 수행한다는 건데 지금 현재 트래픽이 이상없을거 같고 넥스터즈 홍보때 트래픽이 몰려서 제가 생각하는 것은 홍보 할때 RestTemplate의 커넥션 풀을 지정해주는 것이 좋다고 생각합니다
  • aj1155 commented 5 years ago

    내가 만든 브랜치에다가 이어서 작업하면 됨

    aj1155 commented 5 years ago

    조사 잘했어~~