1 minute read

서블릿

서블릿 이전의 CGI

이전의 웹 프로그램들은 클라이언트의 요청에 대한 응답으로 정적인 리소스만 넘겨주었다.

웹 프로그래밍은 점점 발전하게 되었고, 사용자의 요청에 맞게 동적인 페이지를 작성할 수 있게 되었는데 이 역할을 CGI라는 인터페이스가 해주었다.

image

하지만 CGI는 단점이 있었다. CGI는 클라이언트에서 요청이 올 때마다 각각에 대한 처리 프로세스를 만들어냈다. 들어오는 요청들이 같은 CGI 구현체를 사용할지라도 다른 요청이라면 그 때마다 구현체를 만들어서 처리해주었다.

대량의 요청이 들어온다고 가정했을 때, 각 요청마다 프로세스를 만든다는 것은 정말 비효율적이지 않은가?

이 문제를 서블릿이 해결해준다.


서블릿

서블릿이란 클라이언트 요청을 처리하고, 결과를 처리해서 반환해주는 Java 인터페이스다.

image

Servlet에 정의된 HttpServletRequest나 ServletResponse 객체들을 사용하면 HTTP 요청 정보를 쉽게 사용할 수 있고, 처리결과를 쉽게 응답할 수 있다.

서블릿이 요청 HTTP 메시지를 읽고 응답 HTTP 메시지를 만들어주니 개발자는 처리 로직에만 집중할 수 있다.

image-20220621165631171

또한 서블릿은 싱글톤 패턴으로 CGI의 문제점을 해결해주었다.

서블릿은 각 요청에 대한 프로세스를 생성하는 것이 아니라, 프로세스 1개가 있고 그 내부에 스레드들을 생성하여 처리했다.


서블릿 라이프 사이클 흐름

서블릿에는 init(), service(), destroy() 메서드가 정의되어 있다.

image

웹 어플리케이션 서버를 실행시키면, 서블릿이 생성되고 톰캣과 같은 서블릿 컨테이너에 등록된다.

클라이언트에서 요청이 들어오면 서블릿이 실행되면서 요청에 대한 처리를 해주고 응답값을 반환해준다.

웹 어플리케이션 서버를 중지시키면, 서블릿은 소멸된다.

image

위의 콘솔창을 보면/hello 경로로 2번 요청이 들어온 것을 볼 수 있다.

여기서 중요한게 2번째 요청이 들어올 때, init 메서드가 호출되는 것이 아니라, 이전에 메모리에 남겨두었던 것을 재사용한다.

생성된 Servlet 객체는 메모리에 남겨두고 동일한 서블릿에 대해 요청이 온다면 재사용한다. Servlet은 싱글톤 패턴을 통해 사용되기 때문에 하나의 구현체를 통해 동작할 수 있다.


서블릿 컨테이너

서블릿은 스스로 작동하는 것이 아니고 서블릿을 생성, 소멸 및 관리해주는 것이 필요하다. 이런 서블릿을 관리해주는 역할을 하는 것이 서블릿 컨테이너이다. 톰캣이 서블릿 컨테이너의 대표적인 예시다.

서블릿 컨테이너의 대표적인 역할로는 서블릿의 생명주기를 관리해주고, 클라이언트의 요청을 받고 응답할 수 있도록 웹 서버와 소켓으로 통신해준다.

또한 서블릿 컨테이너는 요청마다 자바 스레드를 생성해주고, 요청이 완료되면 스레드를 죽이는 멀티 스레드 지원 및 관리 역할을 한다.



참고
스프링 핵심 원리 - 기본편 (김영한 님)

Categories:

Updated: