티스토리 뷰
HTTP Request 부터 HTTP Response 까지의 여정
요즘 여행 가는 것도 힘든데.. HTTP 타고 여행이나 가보자!
먼저 HTTP 는 인터넷에서 데이터를 주고 받을 수 있는 프로토콜을 의미한다.
웹 브라우저에 URL 을 입력한 후 결과 페이지가 보이기까지 어떠한 코스들을 거치는지 구경해 보자. 🌏👀
자리가 얼마 남지 않았다는데.. 빨리 탑승해 보자 !!
참고로 목적지는 @RequestMapping 에 해당하는 Controller Method 이고, Service 와 Repository 등 응답 로직을 거쳐 요청 처리가 완료되면 복귀할 예정이다.

URL 입력
우리가 갈 목적지의 주소는 google.com 이다.
웹 브라우저에 google.com 을 입력해 보자. ⌨
DNS
google.com 행 HTTP에 탑승하긴 했는데.. 정확히 목적지가 어디지?
-73.990494, 40.7569545.. 위도와 경도 정보로는 도저히 찾아갈 수가 없겠는데..?
DNS(Domain Name System) 의 작동 원리를 살펴보기 전에 먼저 가까운 DNS Server를 통해 Hostname의 IP주소를 알아보자.
C:\>ping google.com
Ping google.com [172.217.161.78] 32바이트 데이터 사용:
172.217.161.78의 응답: 바이트=32 시간=34ms TTL=112
172.217.161.78의 응답: 바이트=32 시간=34ms TTL=112
172.217.161.78의 응답: 바이트=32 시간=34ms TTL=112
Google 의 실제 IP는 172.217.161.78 이다. (IP 주소로도 접속해 보자.)
- 이 IP 주소는 국적과 지역에 따라 다르게 나타날 수 있다.
IP 주소(172.217.161.78)를 외우고 다니기는 힘들기 때문에 쉽게 기억할 수 있는 Domain Name을 사용하는 것이다.
IP 를 "위도와 경도(-73.990494, 40.7569545)", Domain Name 을 "미국"으로 생각해 볼 수도 있다.
DNS 작동 원리
- 웹 브라우저에
google.com을 입력 Local DNS에게 Hostname(google.com)에 대한 IP 주소 요청- Local DNS 에 IP 주소가 없다면 다른 DNS Name Server(Root DNS) 정보를 응답
Root DNS서버에게 Hostname 에 대한 IP 주소를 요청- Root DNS 서버는 .com 도메인을 관리하는 TLD(Top-Level Domain) Name Serever 정보 응답
TLD에게 Hostname 에 대한 IP 주소를 요청- TLD 는 Hostname 을 관리하는
DNS Server정보 응답 - google.com 도메인을 관리하는
DNS Server에게 Hostname에 대한 IP 주소를 요청 DNS Server는 Hostname 에 대한 IP 주소(172.217.161.78) 응답Local DNS Server는 응답으로 받은 Hostname에 대한 IP 주소를 캐싱하고 IP 주소 정보로 HTTP 요청
- 참고 이미지
Reference
Internet과 작동 원리 (HTTP, Browser, DNS, Domain, Hosting
HTTP 요청
정확한 목적지를 알아냈으니 이동해보자!
google.com로 요청했지만, 실제로는 DNS 서버를 통해 알아낸 IP주소172.217.161.78와 입력한 URL 정보가 함께 요청으로 전달된다.URL 정보와 전달받은 IP 주소는 HTTP Protocol을 사용하여
HTTP Request Message생성HTTP Request Message
HTTP 요청 Message 는
TCP Protocol을 사용하여 인터넷을 거쳐 해당 IP 주소의 컴퓨터 Web Server 로 전송
컴퓨터 네트워크에서 데이터는 패킷이라는 작은 단위로 전달
Internet
- 인터넷은 내 컴퓨터로 시작해 Router, Modem, ISP1(Internet Service Provider), ... , ISP2, Modem, Router 를 거쳐 해당 IP 주소의 컴퓨터 Web Server 로 도착하게 된다.
- Web Server 로 도착한 HTTP 요청 Message 는 HTTP Protocol을 사용하여 URL 정보로 변환

Reference
Web Server
목적지에 들어가기 전 목적 IP 컴퓨터의 Web Server 에 도착했다.
Web Server 는 요청 URL 정보를 확인하고, 필요한 요청이 여기서 처리되면 돌려보낸다.
여기서 처리할 수 없는 요청이라면 WAS 로 이동해야 한다.
우리는 여행을 더 즐겨야 하니 WAS 로 보내달라고 해보자!
동작
- Web Server는
HTTP 요청을 받고바로컨텐츠를 응답하거나, WAS 에 요청을 전달 - WAS 에 요청이 전달되고, WAS에서 처리된 요청이 있다면 해당
컨텐츠를 응답
기능
- HTTP 요청이 들어오면
요청을 서비스하는 담당- 정적 컨텐츠
- WAS를 거치지 않고 바로 컨텐츠 제공
- 동적 컨텐츠
- 동적 컨텐츠 제공을 위해 WAS 에 요청 전달
- 정적 컨텐츠
ex) Apache Server, Nginx, IIS 등
WAS
Web Server 에서 처리할 수 없는 요청이 있어서 WAS 로 왔다. (사실 우리는 여행✈을 더 즐겨야 한다...!)
여기서 목적지까지 이동하기 위해 요청에 맞는 doGet(), doPost() 라는 자동차🚕 혹은 기차🚝를 이용해야 한다.
동작
- Web Server 로부터 받은 요청과 관련된
Servlet 을 메모리에 로딩 web.xml을 참조하여 해당 Servlet 에 대한Thread 생성(Thread Pool 활용)HttpServletRequest, HttpServletResponse객체를 생성하여 생성된Servlet에 전달- Thread는 Servlet의
service()호출 - service() 는 요청에 맞는
doGet()ordoPost()호출
- Thread는 Servlet의
doGet()ordoPost()는 인자에 맞게 생성된 적절한 동적 컨텐츠를Response 객체에 담아WAS에 전달- WAS는
Response 객체를HttpResponse형태로 바꾸어Web Server에 전달 - 생성된
Thread를 종료하고,HttpServletRequest, HttpServletResponse 객체 제거

기능
- WAS(Web Application Server) 는 Web Server와는 다르게 DB조회 등 다양한 로직 처리를 요구하는
동적인 리소스를 제공- aka. Web Container, Servlet Container
- HTTP를 통해 Application 수행
- JSP, Servlet 구동 환경 제공
ex) Tomcat, JBoss, Jeus, Web Sphere 등
Reference
Servlet Filter
목적지까지 이동하는 길에 여러 인증 절차가 필요하다. 여권을 미리 준비해두자!
- Servlet 이 지원하는 수문장
- 사용자 인증이나 로깅 등과 같은
웹 공통 관심사를 처리
public interface Filter {
//필터 초기화 메서드 (서블릿 컨테이너가 생성될 때 호출)
public default void init(FilterConfig filterConfig) throws ServletException {}
//Client의 요청이 올 때 마다 호출 (필터의 로직 구현)
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;
//필터 종료 메서드 (서블릿 컨테이너가 종료될 때 호출)
public default void destroy() {}
}
Dispatcher Servlet
인증을 마치고 이제 거의 목적지에 도달한 것 같다.
하지만 경로가 너무 많아서 길을 찾기가 어렵다.. 여기서 목적지까지 가는 길을 안내 받아보자.
doGet() or doPost()(WAS 에서 요청에 맞게 호출된 메서드)를 통해 전달된 요청을 확인해서 적합한 Controller 에 위임해주는Front Controller
Spring Interceptor
이제 목적지 입구에 도착했다 !!
목적지에 입장을 하기 위해 예매한 표를 보여주자.
- Servlet Filter 와 동일하게
웹 공통 관심사를 처리 - Spring MVC 구조에 특화된 필터 기능 제공
public interface HandlerInterceptor {
//Controller 호출 전 (Handler Adapter 호출 전) - return true 시 다음으로 진행, false 시 끝
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {}
//Controller 호출 후 (Handler Adapter 호출 후) - Controller에서 예외 발생 시 호출되지 않음.
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {}
//HTTP 요청 종료 후 (View rendering 후) - 예외 여부에 관계없이 호출
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {}
}
Spring MVC
입구를 통과했으니 조금만 더 가면 목적지에 도착하겠다!
Handler 를 Controller 라고 생각하자.

HandlerMapping
- HandlerMapping 을 통해 요청 URL에 매핑되는
Handler 조회- @RequestMapping 기반 Controller 일 경우
RequestMappingHandlerMapping - Spring Bean 기반 Controller 일 경우
BeanNameUrlHandlerMapping
- @RequestMapping 기반 Controller 일 경우
HandlerAdapter
- 조회한 Handler 를 실행할 수 있는
Handler Adapter 조회- @RequestMapping 기반 Controller 일 경우
RequestMappingHandlerAdapter - HttpRequestHandler 처리의 경우
HttpRequestHandlerAdapter - Spring Bean 기반 Controller 일 경우
SimpleControllerHandlerAdapter
- @RequestMapping 기반 Controller 일 경우
- 앞서 조회한
Handler Adapter 를 실행하면 Handler Adapter 가 실제Handler(Controller) 실행- 드디어 목적지에 도달했다. 😆 실컷 구경하고 오자! 😎
- Handler Adapter 는 Handler(Controller) 가 반환하는 정보를
ModelAndView로 변환해서 반환
ViewResolver
- viewResolver 를 찾고 실행
- Bena 이름으로 등록된 View 의 경우
BeanNameViewResolver - Bena 이름으로 등록된 View 가 없을 경우
InternalResourceViewResolver
- Bena 이름으로 등록된 View 의 경우
View
- viewResolver는 View의 논리 이름을 물리 이름으로 바꾸고, 렌더링 역할을 담당하는
View 객체 반환BeanNameViewResolver:BeanNameView반환InternalResourceViewResolver:InternalResourceView반환
View Rendering
- View 객체를 통해 View Rendering
- view.render()
Reference
https://jihunparkme.github.io/Spring-MVC-Part1-MVC/
Servlet 예외 처리 흐름
Controller 에서 예외 발생 시
Spring Boot 를 사용하면 오류 페이지 화면만 BasicErrorController 가 제공하는 룰과 우선순위에 따라서 등록하면 된다.
아래 흐름은 참고만 해보자.

1. WAS(/error-ex, dispatchType=REQUEST) -> 필터 -> 서블릿 -> 인터셉터 -> 컨트롤러
- 컨트롤러에서 예외발생
2. 컨트롤러 -> 인터셉터 -> 서블릿 -> 필터 -> WAS
- WAS 에서 오류 페이지 확인
3. WAS(/error-page/500, dispatchType=ERROR) -> 필터(x) -> 서블릿 -> 인터셉터(x) ->
컨트롤러(/error-page/500) -> View
- 필터, 인터셉터에서 필요 시 중복 호출 제거
HTTP Response
다행히 오류 없이 안전하게 여행을 마치고 돌아갈 시간이다.
왔던 길과 반대로
Spring Interceptor -> Dispatcher Servlet -> Servlet Filter -> WAS -> Web Server
을 거쳐 돌아가면 된다.
...
...
...
집에 도착하니 선물이 있다!! 🎁

'Web' 카테고리의 다른 글
| [IntelliJ] Spring, Maven, Tomcat Setting in Intranet (인트라넷 환경에서 설정) (0) | 2022.02.16 |
|---|---|
| [Kotlin] 코틀린 맛보기 (0) | 2022.01.21 |
| [정규식/RegEx] 특정 문자열 사이 문자열 추출하기 (HTML tag 사이 문자열 추출) (0) | 2021.12.08 |
| [Architecture] Microservice Architecture(MSA) 빠르게 훑어보기 (0) | 2021.11.14 |
| [JavaScript] 클립보드에 텍스트, 이미지 저장하기 (Copy text, image to clipboard in javascript) (5) | 2021.10.24 |