Web Server/WAS 그리고 Servlet

이완희·2023년 9월 15일

Web Server

  • 클라이언트가 URL로 HTTP 요청을 날리면 정적 컨텐츠(HTML, CSS, JS)를 응답하는 서버(ex) Apache, Nginx…)
  • HTTP로 요청을 날리고 HTTP으로 요청으로 응답

WAS(Web Application Server)

  • 클라이언트의 요청을 받아 동적 컨텐츠를 응답하는 서버(ex) Tomcat, Undertow…)
  • Web Server + Web Container
  • 웹 애플리케이션과 서버 환경을 만들어 동작시키는 기능을 저공

Web Server와 WAS의 차이


WAS에서 정적, 동적 컨텐츠를 수행하는데 굳이 Web Server가 따로 필요할까?

당연히 필요하다. Web Server는 WAS가 제공하지 않는 특별한 기능을 수행한다.

  1. 역할 분리: 웹 서버는 정적, WAS는 비지니스 로직을 처리하는 역할을 나누면 서버는 각자의 역할에 충실할 수 있다. 웹 서버는 리버스 프록시 역할을 수행하게 된다.
  2. 캐싱: 웹 서버는 정적 컨텐츠를 응답하므로 변경이 거의 이루어 지지 않는다. 정적 컨텐츠를 캐싱하면 보다 빠르게 응답하여 WAS의 부담이 줄어든다.
  3. 보안: 웹 서버는 WAS로 가는 모든 요청을 필터링하고 보안 정책을 적용할 수 있다.
  4. 로드 밸런싱: 웹 서버를 사용하여 부하 분산을 수행할 수 있다. 규모가 큰 프로젝트는 웹 서버보단 WAS에서 많은 자원을 사용하게 되므로 보다 많은 WAS를 구동해야 한다. 따라서 로드 밸런서를 웹서버에 배치하여 서버 확장성을 향상 시킨다.

대규모 프로젝트에선 보다 많은 트래픽을 처리 하기 위하여 아래와 같이 Scale Out한 구조를 갖고있다.

물론 구조에 따라 Web Server가 여러대 구동될 수도 있다. 하나의 Request마다 스레드가 생성되어 Servlet을 호출한다.

Servlet

그 이후의 요청방식을 보다 이해하기 위해선 Servlet의 개념도 필수적으로 알아야 한다.

서블릿이란 동적 웹 페이지를 만들 때 사용되는 자바 기반의 웹 애플리케이션 프로그래밍 기술이다.
서블릿은 웹 요청과 응답의 흐름을 간단한 메서드 호출만으로 체계적으로 다룰 수 있게 해준다.

쉽게 말하자면 Client가 productId/15라는 HTTP Request를 날리면 @Controller에서 @GetMapping(productId/15)라는 메소드를 호출시키는 애라고 할수 있다.

그림이 나타내는 동작원리를 풀어서 설명하면 이렇다.

  1. Servlet Container는 Servlet Request / Servlet Response객체를 생성
  2. 설정 파일을(ex *.xml)을 참고하여 매핑할 Servlet을 확인
  3. 해당 서블릿 인스턴스 유무 존재를 확인하고, 없다면 init()
  4. HTTP 요청 메소드에 따라 doGet(), doPost()를 만들고 DisPatcher Servlet을 호출
  5. Destory()하여 객체를 반환. 서블릿은 싱글톤으로 관리된다.

이전에는 요청마다 서블릿이 생성되었고 로직을 수행했다. 이는 불필요하게 중복되는 코드를 만들었다. 이를 개선하기 위해서 Spring Web MVC는 Dispatcher Servlet을 통해 공통 로직을 수행하고 핸들러 매핑을 통해 적절한 컨트롤러를 호출한다. 개발자에게 보다 비지니스 로직에만 집중하게 해주는 큰 장점이 있다.

profile
인생을 재밌게, 자유롭게

0개의 댓글