본문 바로가기
to Developer/Spring

WAS, Servlet

by EH헌 2024. 2. 1.

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

  • 웹 서버
    • 정적 리소스 파일을 제공하는 서버
      • ex) HTML, CSS, javascript, 이미지, 파일 등 즉시 응답 가능한 컨텐츠
  • 웹 애플리케이션 서버(WAS)
    • 웹 서버가 하는 일 + 애플리케이션 로직(DB 연결, 동작 수행, 데이터 제공)까지 제공하여 동적인 처리를 하는 서버
    • 자바 진영에서는 서블릿 컨테이너 기능을 제공하면 WAS 라고 한다.
    • 위 그림에는 없지만 WAS 안에도 웹 서버가 따로 존재한다.

WAS만 써도 되겠다?

NO. WAS는 DB 조회 및 다양한 로직을 처리하는 데 집중해야 하기에, 단순 정적 컨텐츠는 웹 서버에 맡겨 기능을 분리해 서버 부하를 방지한다.
웹 서버를 WAS 앞에 두고 필요한 WAS들을 웹 서버에 플로그인 형태로 설정하면 더욱 효율적인 분산 처리가 가능!


서블릿 (Servlet)

서블릿은 WAS 안에서 동적인 페이지를 만드는데 사용되는 서버 프로그램이다.
서블릿이 존재하기 전에는 요청이 들어오면 HTTP 요청 메시지를 파싱하는 것부터 여러 부가 작업을 개발자가 수행해야 했다. 하지만 서블릿이 나오면서 부가적인 작업을 대신해주게 되었고, 개발자는 실직적인 메인 로직에만 집중 할 수 있게 되었다.


서블릿 컨테이너

앞서 스프링 컨테이너와 비슷하게 서블릿 컨테이너는 서블릿의 생명주기를 관리한다.

  • init : 서블릿 초기화
  • service : HTTP 요청 유형을 확인하고 맞게 doGet, doPost, doPut 등 메서드를 호출하여 요청 처리
  • destroy : 서블릿 제거
    서블릿 객체도 싱글톤으로 관리되기 때문에 최초 요청 시점에 서블릿 객체를 초기화해서 서블릿 컨테이너에 보관하고 이후에는 같은 서블릿을 공유해서 사용한다.

요청 시 동작 과정

  1. 사용자가 URL을 클릭하면 HTTP Request를 Servlet Container로 보낸다.
  2. Servlet Container는 쓰레드 풀에서 쓰레드를 꺼내 할당 해주고 HttpServletRequest, HttpServletResponse 두 객체를 생성한다.
  3. 사용자가 요청한 URL을 분석하여 어느 서블릿에 대한 요청인지 찾는다.
  4. 서블릿 컨테이너에 존재하지 않으면 초기화하고 있다면 가져와서 service() 메서드를 호출한다.
  5. Spring MVC의 경우 DispatcherServlet이 초기화되고 호출된다.
  6. service 메서드가 수행이 끝나면 HttpServletResponse 객체에 응답을 보낸다.
  7. 응답이 완료되면 HttpServletRequest, HttpServletResponse 객체를 소멸시킨다.

특정 서블릿에 접근하는 n명의 사용자가 있는 경우 이 서블릿은 첫번째 사용자가 처음 엑세스 했을때만 인스턴스화 되는건가요, 아니면 모든 사용자에게 개별적으로 인스턴스화 되는건가요?

웹 애플리케이션이 로드되면 서블릿 컨테이너(아파치 톰캣 같은)는 ServletContext를 한번 생성하여 메모리에 보관한다.
이후 servlet, filter, listener가 발견되면 해당 클래스들은 한번 인스턴스 생성하고 서버의 메모리에 보관한다.
다른 것들은 처음으로 HTTP request가 올때 init 메서드로 생성하여 보관한다.(이 이유로 첫 사용자의 경우 응답속도가 늦다.)


자료 참고
[참고 1] [참고 2] [참고 3]

'to Developer > Spring' 카테고리의 다른 글

Ajax  (0) 2024.02.14
Spring Container, Bean  (0) 2024.01.30
Spring Framework  (1) 2024.01.29
Dispatcher Servlet  (0) 2024.01.26
MVC 패턴  (0) 2024.01.26