웹 서버, WAS, Servlet 정리

스프링 MVC 1편 강의 정리

웹 서버(Web Server)

  • HTTP 기반으로 동작하는 서버
  • 정적 리소스 제공, 기타 부가 기능
  • 정적 (파일) HTML, CSS, JS, 이미지, 영상
  • 예: NGINX, APACHE

웹 애플리케이션 서버(WAS - Web Application Server)

  • HTTP 기반으로 동작
  • 웹 서버 기능 포함하여 정적 리소스 제공 가능
  • 코드를 실행해서 애플리케이션 로직 수행
    • 사용자에 따라 다른 화면을 보여줄 수 있음
    • 동적 HTML, HTTP API(JSON)
    • Servlet, JSP, Spring MVC
  • 예: Tomcat, Jetty, Undertow

웹 서버와 웹 애플리케이션 서버의 차이

  • 웹 서버는 정적 리소스, WAS는 애플리케이션 로직
  • 웹 서버도 프로그램을 실행하는 기능을 포함하기도 하며 WAS도 웹 서버의 기능 제공
  • WAS는 애플리케이션 코드 실행에 특화

웹 시스템 구성 - WAS & DB

  • WAS, DB만으로 시스템 구성 가능
  • WAS는 정적 리소스, 애플리케이션 로직 모두 제공 가능함
  • WAS가 너무 많은 역할을 담당하게 되면 서버 과부하 위험
  • 정적 리소스 때문에 비싼 애플리케이션 로직 수행이 어려울 수 있음
  • WAS 장애시, 오류 화면 노출 불가능

웹 시스템 구성 - WEB & WAS & DB

  • 정적 리소스는 웹 서버가 처리
  • 웹 서버에서 애플리케이션 로직같은 동적 처리가 필요할 때 WAS에 요청 위임
  • WAS는 중요한 애플리케이션 로직 처리 전담
  • 효율적 리소스 관리 가능
    • 정적 리소스가 많이 사용되면 웹 서버 증설
    • 애플리케이션 리소스가 많이 사용되면 WAS 증설
  • 정적 리소스만 제공하는 웹 서버는 잘 죽지 않지만, 애플리케이션 로직이 동작하는 WAS는 잘 죽음
  • WAS 또는 DB 장애시 웹 서버에서 오류 화면 제공 가능

Servlet

  • 비즈니스 로직 처리를 제외한 기능 처리
  • TCP/IP, 소켓 연결
  • HTTP 요청 파싱
  • HTTP method, URL 확인
  • 응답 메세지 생성
  • TCP/IP 응답 전달 및 소켓 종료
@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
  @Override
  protected void service(HttpServletRequest request, HttpServletResponse response) {
    // 비즈니스 로직
  }
}
  • urlPatterns의 url이 호출되면 서블릿 코드가 실행됨
  • HttpServletRequest: HTTP 요청 정보 사용 가능
  • HttpServletResponse: HTTP 응답 정보 제공 가능
  • 개발자는 HTTP 스펙을 편하게 사용할 수 있음

원리

  • 브라우저에서 요청
  • WAS 내부에서 request, response 객체 생성
  • 서블릿 컨테이너에서 생성된 request, response 객체와 함께 서블릿 실행
  • 서블릿이 종료되면서 response 객체 정보로 HTTP 응답 생성

Servlet Container

  • 톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라 함
  • 서블릿 컨테이너가 서블릿 객체를 생성, 호출, 관리함
  • 서블릿 객체는 싱글톤으로 관리
    • 요청이 올 때마다 객체를 생성하는 것은 비효율
    • 최초 로딩 시점에 서블릿 객체를 미리 만들고 재사용
    • 모든 요청은 동일한 서블릿 객체 인스턴스에 접근
    • 공유 변수 사용 주의해야 함
    • 서블릿 컨테이너 종료시 함께 종료
  • JSP도 서블릿으로 변환되어 사용
  • 동시 요청을 위한 멀티 스레드 처리 지원