스프링부트로 편하게 개발이 가능하다 보니 그 기반이 되는 기술인 서블릿(servlet) 등에 대해 잘 모르고 있었습니다.
따라서 이번에 서블릿과 WAS에 대해 정리해보고 스프링에서의 구조를 살펴보겠습니다.
먼저 웹 서버와 WAS의 차이를 살펴보겠습니다.
초창기의 웹 서버는 정적인 html만을 보여줄 수 있었습니다. Client가 어떠한 문서를 요청하면 Web Server는 본인에 저장된 문서를 그대로 보여주는 형태였죠.
그러나 접속한 사용자에 맞춰 동적인 페이지를 보여줄 필요성이 있었고, 이러한 동적인 처리를 담당해주는 것이 WAS 입니다.
(개념상 웹 서버가 WAS에 포함될 수 있습니다.)
이제 웹 서버는 사용자의 요청을 받으면 WAS를 통해 동적인 처리를 마친 후, 그 결과를 클라이언트에게 전달해줍니다.
정리하자면 다음과 같습니다.
웹 서버: 클라이언트의 요청을 받고, 반환해주는 프로그램 혹은 기기 그 자체
ex) 아파치
WAS: 동적인 로직을 처리해주는 어플리케이션 서버
ex) Tomcat
WAS를 살펴보기에 앞서, 서블릿이 무엇인지 알아보겠습니다.
개인적으로 서블릿에 대해 알아보면서 '그래서 서블릿이 정확히 뭐지?' 하는 생각이 많이 들었습니다.
이에 대해 제가 이해한대로 쉽게 정리하면, 서블릿은 '동적인 로직을 처리해주는 코드 혹은 class'라고 정리할 수 있을 것 같습니다.
서블릿을 동적인 로직을 처리해주는 코드라고 이해하고, 다음 WAS의 구조를 살펴보면 WAS의 역할을 이해하기 좀 더 수월합니다.
WAS의 구조는 위와 같습니다.
서블릿 컨테이너가 존재하여 서블릿들을 관리하는 구조입니다.
요청에 따라 쓰레드가 할당되고, 적절한 서블릿이 실행되는 것이죠.
서블릿은 앞서 살펴보았고, 그렇다면 서블릿 컨테이너는 무엇일까요?
서블릿 컨테이너의 주요 역할을 다음과 같습니다.
클라이언트와 서버간의 요청과 응답이 이뤄지는 순서를 다시 정리하면 다음과 같습니다.
(1) 클라이언트가 웹 서버에 요청
(2) 웹 서버는 WAS에 동적인 처리 요청
(3) Servlet Container가 적절한 서블릿을 수행할 쓰레드 할당
(4) 서블릿 수행
(5) WAS가 그 결과를 웹 서버에 전달
(6) 웹 서버가 사용자에게 최종 결과를 전달
이렇게 WAS에 대해 정리하고 나니 '그럼 스프링의 역할은 뭐고, Controller는 뭐지?'하는 의문이 들었고, 따라서 스프링과 서블릿에 대해서도 알아보겠습니다.
위의 WAS 구조는 단점이 있습니다.
서블릿 별로 공통로직이 많고, 또 각 요청에 맞춰 하나하나 서블릿을 작성해줘야 됩니다.
이를 해결하기 위해 스프링은 단 하나의 서블릿, Dispatcher Servlet 만을 두는 방식을 사용합니다.
Dispatcher Servlet을 검색하면 자주 볼 수 있는 그림입니다.
위 그림에서 볼 수 있듯이 스프링은 모든 요청에 대해 DispatcherServlet을 통해 처리하고, DispatchServlet 안에 핸들러 매핑과 컨트롤러 등을 호출하는 로직이 포함된 구조입니다.
이제 스프링을 통해 개발할 때, 컨트롤러 부분이 어떤 파트를 작성하는 것인지 이해할 수 있습니다.