[Java] 서블릿이란? 서블릿 컨테이너란? Servlet 감잡기

Junseo Kim·2021년 6월 19일
1

[Java]자바 기초

목록 보기
35/35

서블릿과 서블릿 컨테이너

서블릿에 대해 위키 백과에 검색해보면 아래와 같이 나온다.

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

솔직히 무슨 말인지 잘 와닿지 않는다.

내가 이해한 서블릿은 서블릿 컨테이너에 의해 관리되는, 자바를 사용하여 웹 프로그래밍을 하기 위한 인터페이스이며, 클라이언트의 HTTP 요청에 따라 동적인 처리를 해주는 것이다.

서블릿 컨테이너는 서블릿을 관리하며, 클라이언트의 HTTP 요청을 처리할 때 반복되는 전처리, 후처리 과정을 대신 처리해주는 것이다.

클라이언트의 요청

클라이언트에서 요청이 오면 어떤 과정이 일어날까?

1) 서버 TCP/IP 대기, 소켓 연결
2) HTTP 요청 메세지를 파싱해서 읽기
3) 요청 메세지, 요청 url 확인
4) Content-Type 확인
5) HTTP 메세지 바디 내용 파싱
6) url에 따른 프로세스 실행
7) 실제 비즈니스 로직 실행
8) HTTP 응답 메세지 생성
9) TCP/IP에 응답 전달, 소켓 종료

매번 요청이 올 때마다 위의 과정이 필요하다. 실제 비즈니스 로직 처리는 7)번 한 곳에서만 일어나고, 나머지 전처리와 후처리 과정들이 너무 많다.

클라이언트의 요청이 왔을 때, 비즈니스 로직을 제외한 전처리, 후처리를 처리해주는 것이 바로 서블릿을 지원해주는 WAS(서블릿 컨테이너)이다.

서블릿 컨테이너

톰캣과 같은 WAS 내부에는 서블릿 컨테이너라는 것이 존재한다. 서블릿 컨테이너는 서블릿 객체를 관리해주는 녀석이다.

서블릿 컨테이너의 역할

서블릿 컨테이너는 아래와 같은 역할을 한다.

  • 통신 지원 - 요청에 따라 서블릿과 웹서버의 통신을 지원해준다.(클라이언트의 요청의 7)을 제외한 나머지 통신 부분 처리)
  • 서블릿 객체 생성, 초기화, 호출, 종료하는 생명주기를 관리
  • 서블릿 객체를 싱글톤으로 관리
  • 동시 요청을 위한 멀티 스레드 처리를 지원 -> 개발자는 따로 멀티 쓰레드에 대해 신경 쓸 필요가 없다.

이 중 동시 처리에 대해 서블릿 컨테이너는 어떻게 처리를 해주는 것일까?

동시 처리

실제 서블릿 객체를 호출해주는 것은 스레드가 담당한다. 우리가 자바 코드를 짜고 실행시키면, 애플리케이션의 코드가 하나하나 순차적으로 진행되는 걸 볼 수 있다. 이런식으로 코드를 순차적으로 실행해주는 것이 스레드이다.(프로그램 자체를 실행하는 것은 프로세스고 프로세스 내부에서 여러 갈래로 나뉘는 것이 스레드!)

즉 자바의 main 메서드 실행 시, main이라는 이름의 쓰레드가 순차적으로 한 번에 하나의 코드 라인을 실행한다. 따라서 스레드가 없다면 자바 애플리케이션 실행은 불가능한 것이다. 즉, 여러 사용자의 요청에 대한 동시 처리가 필요할 땐, 스레드가 추가적으로 생성되어야 한다.

2가지 스레드 생성 방법을 설명하려고 한다.

Case 1) 요청 마다 새로운 스레드 생성!

가장 단순하게 생각해보면, 요청 마다 새로운 스레드를 생성하는 방법을 떠올릴 수 있을 것이다.

이렇게 해주면, 모든 요청을 별개의 스레드가 처리하므로 동시 요청을 처리할 수 있게 되며, 하나의 스레드에 문제가 생겨 쓰레드가 지연되어도, 나머지 요청은 별개의 스레드가 처리하기 때문에 다른 요청에 대해서는 문제가 일어나지 않는다.

그러나 이 방법은 몇 가지 단점이 존재한다.
1) 비싼 비용 - 스레드 생성 비용은 비싼 비용이다.
2) 스레드 생성 제한이 없음 - CPU, 메모리 임계점을 넘어버리는 요청이 오면 서버 자체가 죽을 수 있다.
3) 컨택스트 스위칭 비용 - 동시 처리라고 해도 실제로 동시에 요청을 처리해주는 것은 아니고, CPU를 스레드마다 차례로 배정해서 요청을 처리해주는데, 스레드마다 CPU를 배정해줄때 컨택스트 스위칭 비용이 발생한다. 요청마다 스레드를 생성해 준다면, CPU, 메모리가 허용할 때 까지 스레드가 생성되기 떄문에, 쓰레드 수와, 컨택스트 스위칭 비용은 비례해서 커진다.

Case 2) 스레드 풀 사용!

스레드 풀에 미리 일정량의 스레드를 만들어놓고, 요청마다 가져다 쓰고 반납하는 방법이다. 이때 스레드 풀에 존재하는 스레드보다 더 많은 요청이 온다면, 해당 요청은 대기시키거나 거절한다.

스레드를 얼마나 만들어놔야 하냐에 대해서는 애플리케이션에 따라 다르기 때문에 성능 테스트를 통해 적정값을 찾아야한다.(톰캣 같은 경우는 기본 설정이 스레드 200개) 최대 스레드 수를 너무 낮거나, 높게 설정하면 좋지 않다. 최소 CPU 사용률 50% ~ 70% 정도는 사용해도 괜찮다고 한다.

WAS의 요청 응답

마지막으로 클라이언트의 요청과 응답이 코드레벨로 어떤식으로 동작하는 지에 대해 설명하려고 한다.

1) HTTP 요청이 오면, WAS에서는 HTTP 요청 메세지를 기반으로 HttpServletRequest(Request)객체를 만들어주고, HttpServletResponse(Response) 객체를 만들어준다.
2) 만들어준 Request, Response 객체를 서블릿 컨테이너 내부의 서블릿 객체에 주입해준다.
3) 개발자는 Request 객체에서 HTTP 요청 정보를 꺼내서 비즈니스 로직 처리를 한다.
4) 비즈니스 로직 처리 후 Response 객체에 응답 값을 입력한다.
5) WAS는 채워진 Response 객체에 담겨있는 내용을 바탕으로 HTTP 응답 정보를 생성한다.
6) HTTP 응답을 내보낸다.

reference

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
자바 서블릿

0개의 댓글