어느 분의 기술 블로그를 보게 되었는데 글 제목이 클라이언트 요청부터 서버 응답 흐름에 대한 설명이었다. 그때 엇?!! 나는 스프링으로 서버 개발하는데 설명을 제대로 풀어나가지 못할 것 같았다. 프레임워크에 너무 의존한 탓도 있었고 필요한 부분만 구글 검색해서 알아보는 습관이 생활화되었기 때문인 것 같다. 숲을 봐야 하는데 나무만 본 느낌이랄까? 아무튼 내 머릿속을 정리할 겸 기억할 겸 공부할 겸 기록장에 정리하는 시간을 가져보자.
출발지는 클라이언트 목적지는 Spring Framework의 @RequestMapping Controller Method가 될 것이다 이것이 편도이고 왕복을 하는 과정을 정리해보려고 한다. 출발해보자!
1. 가까운 DNS(Domain Name System) 서버를 통해 호스트 이름으로 IP주소 알아오기
google.com의 IP 주소인 142.250.196.142를 알아 올 수 있다. 웹 브라우저에 IP 주소 값을 입력해도 동일하게 google.com으로 접속된다.
2. DNS로 알아온 IP 주소로 입력한 URL 정보와 함께 TCP Protocol을 이용하여 HTTP를 IP주소의 WebServer로 요청하기
여기서 잠깐! TCP Protocol
TCP는 애플리케이션 간의 신뢰성, 오류 체크, 데이터 패킷을 보내는 방법을 정의
- SYN : 클라이언트가 서버에 SYN를 전송한다. 클라이언트는 세그먼트의 시퀀스 번호를 임의의 값으로 설정
- SYN-ACK : 응답으로 서버는 SYN-ACK로 응답을 한다. 수신된 시퀀스보다 많은 숫자로 설정
- ACK : 마지막으로 클라이언트가 서버에 다시 ACK를 보낸다.
- 이 과정을 통해서 서버와 클라이언트는 연결을 맺으며 3 Way HandShake라고 한다.
3. 라우터(Router)를 통하여 패킷 전송
라우터(Router)는 컴퓨터 네트워크 간에 데이터 패킷 경로를 설정하고 전송하는 네트워크 장치로 OSI 7 계층의 네트워크 계층에 해당된다.
4. WebServer
라우터를 통하여 WebServer에 도착을 했다. 최종 목적지에 들어가기 전에 WebServer는 요청 URL 정보를 확인하고 처리가 가능한 요청이면 여기서 클라이언트로 응답을 돌려보내고 WebServer에서 처리할 수 없는 요청이라면 WAS(Web Application Server)로 요청한다.
- 정적 컨텐츠(.html .jpeg .css 등) : WAS는 거치지 않고 콘텐츠 제공
- 동적 컨텐츠 : AWS에 동적 콘텐츠 요청 전달
- WebServer 종류 : Nginx, Apache, IIS
5. WAS(Web Application Server)
DB 조회 및 다양한 로직 처리를 요구하는 동적 콘텐츠를 제공하기 위한 Application Server로 Spring은 Tomcat을 사용한다.
WebServer에서 처리하지 못한 요청 건이 있어서 WAS로 들어왔다. 여기서 세부적인 내용에 대해서 다뤄보자.
- Web Server에서 처리하지 못한 요청 건을 WAS의 WebContainer에게 위임하며 요청에 대한 Servlet을 메모리에 로딩한다.
- web.xml을 참조하고 Servlet에 대한 Thread Pool에 Thread를 생성한다.
- HttpServletRequest, HttpServletResponse 객체를 생성하여 Servlet의 Service를 호출하고 Service는 요청에 맞는 doGet(), doPost()를 호출한다.
- Response 객체를 HttpResponse로 변환하여 Web Server에 다시 전달한다.
- Servlet의 Thread를 정료하고 Request, Response 관련 객체를 제거한다.
위의 1~5번의 동작 과정을 거쳐 WebServer로 데이터를 제공해 주는데 실제 Spring Framework에서 동작하는 과정에 대해서 살펴봐야 하는데 이번 글은 여기서 마치고 Dispatcher Servlet에 대해 정리해보도록 해야겠다.
'Spring' 카테고리의 다른 글
[Spring] Querydsl Gradle 설정 (Gradle 7.X) (0) | 2022.11.18 |
---|---|
[Spring] Dispatcher Servlet (0) | 2022.11.13 |
[Spring] Javers로 자바 객체 비교 쉽게 하자! (0) | 2022.11.11 |
[Spring] Amazon MQ (Active MQ) : Virtual Destinations 기능 (0) | 2022.11.10 |
[Spring] Amazon MQ (Active MQ) : Consumer 운영 (1) | 2022.11.10 |
댓글