Skip to content

Instantly share code, notes, and snippets.

@taekwon-dev
Last active May 17, 2022 08:41
Show Gist options
  • Save taekwon-dev/69fe9a40ab8720ac0eceadc4e177dbd5 to your computer and use it in GitHub Desktop.
Save taekwon-dev/69fe9a40ab8720ac0eceadc4e177dbd5 to your computer and use it in GitHub Desktop.

Servlet, Servlet Container

Servlet, Servlet Container ◀︎ 현재 글
How the Servlet Container Handles a request
How the Servlet Container Handles multithreading
How to maintain a user state - HttpSession
Servlet Scopes

Spring Framework의 Web Framework인 Spring MVC 와 인증, 인가 등 보안 관련 기능을 제공하는 Spring Security 를 각각 정리하던 중 공통적으로 중요한 키워드를 따로 정리하는 것이 좋을 것 같아서 이번 시리즈를 준비하게 됐다.

Spring MVC, Spring Secutiry 내부 동작 원리에서 가장 중요한 키워드를 각각 Servlet, Servlet Filter 라고 생각한다. 사실 서블릿을 이해한다고 해서 두 Framework를 모두 이해하게 되는 것은 당연히 아니지만, 앞서 언급한 Framework에 보다 체계적이고 논리적인 관점을 갖고 접근할 수 있게 해줄 것으로 생각한다.


Servlet, Servlet Container

자바 서블릿(Java Servlet)은 자바를 사용하여 웹페이지를 동적으로 생성 하는 서버측 프로그램으로, 흔히 서블릿으로 불린다.

웹 페이지를 동적 생성하기 위해서 웹 서버 + 웹 애플리케이션 서버 구조를 두고, 웹 애플리케이션 서버를 통해서 동적으로 생성한 웹 페이지를 클라이언트에 응답한다. 예를 들어 로그인 유저 별로 좋아요 누른 포스트 리스트를 조회하는 페이지를 생각할 수 있다.

image

[ 그림 1 ]

[ 그림 1 ]에서 볼 수 있듯이 동적 웹 페이지를 생성하기 위해서 웹 애플리케이션 내에는 서블릿(들이) 존재하는데, 위에서 예로 든 상황을 처리하는 과정을 예상해보면, 아래와 같다.

  1. 클라이언트가 (로그인 유저) 좋아요 누른 포스트 리스트를 조회 요청한다.
  2. 웹 서버는 이 요청을 웹 애플리케이션 서버에 위임한다.
  3. 웹 애플리케이션 서버는 해당 요청을 처리할 수 있는 서블릿을 찾고, 위임한다.
  4. 서블릿은 해당 요청을 처리하고 동적 웹 페이지를 생성한다.
  5. 웹 서버는 서블릿을 통해 생성된 웹 페이지를 클라이언트에 반환한다.

클라이언트의 요청에 대한 동적 웹 페이지 응답이 생성되는 과정 속에서 서블릿의 역할을 확인할 수 있었다. (웹 페이지를 동적 생성)


여기서 잠깐 !

국내외를 막론하고 웹 서버, 웹 애플리케이션 서버, 그리고 웹 컨테이너에 대한 개념 차이에 대해서 많은 질문-답을 구글에서 찾아볼 수 있다. 이 글에서 언급하는 웹 애플리케이션 서버는 Apach Tomcat로 가정하고 글을 작성한 것이고, 아파치 톰캣은 웹 애플리케이션 서버 + 웹 컨테이너 역할을 모두 겸하는 기능을 갖고 있어서 다소 혼동되는 부분이 있지만 이 글에서는 웹 애플리케이션 서버 + 웹 (또는 서블릿) 컨테이너 역할을 모두 할 수 있는 컴포넌트로 이해하면 된다.


이 글의 또 하나의 토픽인 서블릿 컨테이너와 관련해 서블릿 컨테이너는 왜 필요할까? 이 질문에 대해서 고민하면서 서블릿 컨테이너의 역할에 대해서 이해해보자. 이 지점부터 [ 그림 1 ] 에서 웹 애플리케이션으로 표기된 것을 서블릿 컨테이너로 보자.

image

[ 그림 2 ]

  1. 클라이언트가 (로그인 유저) 좋아요 누른 포스트 리스트를 조회 요청한다.
  2. 웹 서버는 이 요청을 웹 애플리케이션 서버에 위임한다.**
  3. 웹 애플리케이션 서버는 해당 요청을 처리할 수 있는 서블릿을 찾고, 위임한다.
  4. 서블릿은 해당 요청을 처리하고 동적 웹 페이지를 생성한다.
  5. 웹 서버는 서블릿을 통해 생성된 웹 페이지를 클라이언트에 반환한다.

위 프로세스에서 2), 3) 을 보면, 클라이언트의 요청을 받은 웹 서버는 직접적으로 서블릿에 해당 요청을 위임하지 않고 서블릿 컨테이너에 요청을 위임한 뒤, 서블릿 컨테이너가 직접 해당 요청을 처리할 적절한 서블릿을 찾아서 서블릿에 해당 요청을 위임하는 것을 알 수 있다.

서블릿 컨테이너는 웹 서버와 서로 소통하는 관계를 갖고 있다. 이와 같이 서블릿 컨테이너가 웹 서버와의 소통을 담당하는 역할을 수행하는데, 만약 서블릿 컨테이너와 같은 역할이 없다면, 웹 서버와 서블릿은 직접적으로 소통을 해야 하고 각 서블릿은 모두 웹 서버와의 통신을 위한 코드들이 각 서블릿에 침투되는 구조가 생길 수 밖에 없다. 이는 크게 두 가지 관점에서 문제가 있는데, 중복 코드가 발생하는 구조이고, 또한 웹 서버와의 소통 방식을 바꾸는 등의 문제에 있어서 소요되는 리소스가 크다는 점이다. (사실 일반적으로 우리가 걱정할 문제가 아닐 수 있지만)

웹 서버로부터 요청을 위임 받는다 -> 서블릿 컨테이너 해당 요청을 처리한 뒤, 반환 할 (동적 웹 페이지) 응답을 생성한다 -> 서블릿 웹 서버에 응답 한다 -> 서블릿 컨테이너

웹 서버와의 소통 부분을 서블릿 컨테이너가 담당해주면서 서블릿은 클라이언트 요청 처리 및 응답 생성에만 집중할 수 있게 됐다.


이 번 글을 통해서 서블릿, 서블릿 컨테이너의 역할에 대해서 다뤘다. 다음 글 주제인 How the Servlet Container Handles a request 를 통해서 서블릿, 서블릿 컨테이너에 보다 상세한 내용을 다룰 예정이다.


Reference

Jakarta Servlet - Wikipedia

Introduction to Java Servlets | Baeldung

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment