BackEnd/Spring

서블릿 / 서블릿 컨테이너

bora-ovo 2025. 6. 30. 22:53

서블릿이란?

쉽게 말하면 자바로 작성된 웹 요청 처리기 이다.

 

클라이언트가 자바 클래스(HttpServlet)으로 작성된 HTTP 요청을 보낸다면,

서블릿은 해당 요청을 받아 내부적으로 처리한 후 동적인 웹페이지를 생성한다.

 

 

서블릿은 정적인 웹페이지와 다르게 동적인 웹페이지라는 특징을 가진다.

예를 들어 사용자의 입력, 세션 정보, 데이터베이스 조회 결과 등에 따라 매번 다른 결과를 만들어낼 수 있다.

이는 정적인 웹페이지와 다르게 사용자 및 상황 별로 상호작용이 가능한 맞춤 페이지를 만들어낼 수 있다는 장점이 있다.

 

 

또한 서블릿은 HTML, JSON, XML 등 다양한 형식의 응답을 지원한다.

기본적으로는 HTML의 응답을 지원하는데, 이는 웹 브라우저가 바로 렌더링 할 수 있기 때문이다. 

보통 HTML은 전통적인 서버 렌더링 웹페이지를 만들 때 사용되고,

JSON은 AJAX 요청이나 SPA 프론트와 데이터를 교환시 사용되며,

XML은 레거시 시스템 연동이나 SOAP 기반 웹 서비스를 만들 때 사용된다.

 

 

서블릿은 JAVA 스레드를 이용하여 동시처리를 진행할 수 있다.

컨테이너가 하나의 서블릿 객체를 만들고, 요청이 올 때마다 별도 스레드를 할당하여 service()를 호출하는 방식으로 동작되는데,

이를 통해 여러 클라이언트에게서 오는 요청에 대해 동시에 처리가 가능하다.

 

 

만약 우리가 서블릿을 쓰지 않는다면 HTTP Request Message를 직접 파싱해야하며,

이에 대해  HTTP Response Message 또한 파싱해야한다.

이러한 복잡한 과정을 거치지 않고 서블릿 API는 HTTP 요청 메시지를 자동으로 파싱하기 때문에

서블릿은 개발자들의 편의를 위해 필수적인 요소가 되었다.

 


서블릿 컨테이너

서블릿 컨테이너는 자바 기반 웹 서버 측 애플리케이션이다.

서블릿 혼자서는 동작할 수 없기에 이를 관리해주는 툴이라고 생각하면 편하다.

서블릿 인터페이스를 구현한 자바 클래스를 관리(CRUD)해주고, HTTP 요청 및 응답을 편리하게 다룰 수 있다.

 

또한 웹서버와의 소켓 통신을 지원하는데, 여기서 소켓이란 네트워크 상에서 두 프로그램이 데이터를 주고받기 위한 EndPoint 이다.

보통 TCP/IP 프로토콜을 사용하고 IP주소와 포트번호를 조합하여 연결한다.

 

 

웹서버와의 통신을 지원

브라우저가 요청을 하면, 웹서버가 이 요청을 서블릿 컨테이너로 넘기고, 컨테이너는 적당한 서블릿에 해당 요청을 전달하여 처리하게 한다.

이 과정에서 우리는 서블릿 컨테이너가 없다면 모든 과정을 복잡하게 진행해야하지만 서블릿 컨테이너 덕분에 알아서 연결, 전달, 응답을 생각하지 않고 진행할 수 있다.

 

 

멀티스레드 지원 및 관리

서블릿 컨테이너는 정해진 수의 작업용 스레드를 만들어, 새로운 요청이 들어올 때마다 이 중 하나를 꺼내 service() 메소드를 호출한다.

요청 처리가 끝나면 해당 스레드는 다시 풀에 반환된 상태로 다음 작업을 기다리기 때문에 매번 만들거나 버리는 상황이 없어진다.

이에 따라 응답속도가 빨리지고, 메모리 사용도 효율적으로 관리할 수 있다.

 

그럼에도 컨테이너는 단 한 개의 서블릿 인스턴스만 만들어 여러 스레드가 동시에 호출하기 때문에,

서블릿 내부에 변수 값을 저장할 시, 스레드간 데이터 충돌이 발생할 수 있다.

따라서 상태를 유지해야하는 상황에서는 메소드 내의 지역변수만 사용하거나 synchronized 블록 또는 ThreadLocal 같은 방식으로 동기화 처리를 해야한다.

 

 

선언적 보안관리

서블릿 컨테이너의 선언적 보안 관리는 개발자가 소스코드를 건드리지 않고도 보안 정책을 설정할 수 있도록한다.

web.xml 파일에 security-constraintlogin-config를 정의하거나, 자바 코드 위에 @ServletSecurity 어노테이션을 달면

로그인 필요 여부나 사용자 역할 별 URL 접근권한 등 보안규칙을 적용할 수 있다.

 

이렇게 설정된 보안 정책은 컨테이너에서 자동으로 검사하고 적용한다. 

따라서 개발자는 로직에 손대지 않고도 보안 요구사항을 빠르게 바꾸고 배포할 수 있다.

 


서블릿 생명주기 

init()

객체가 처음 생성할 때만 호출되는 것으로 서블릿이 사용할 설정값을 읽거나 초기화 매개변수를 설정하고 자원(예시: DB)을 준비한다.

 

service()

서블릿이 초기화된 후 요청이 올 때마다 호출된다. 여기서는 HttpServletRequestHttpServletResponse 객체를 매개변수로 받아 실제 요청 처리할 코드를 처리하고 응답을 생성한다. 

 

destroy()

서버를 내리거나 서블릿이 더이상 필요없을 때 호출된다. 

 


서블릿 내부 동작 흐름

서블릿과 서블릿 컨테이너의 동작 과정

 

 

1. 클라이언트 요청 

: 브라우저나 REST 클라이언트가 특정 URL로 요청을 보내면, 이 HTTP 메시지는 웹 애플리케이션 서버로 전달된다.

 

2. 서블릿 처리 대상 판별

: 서버는 해당 요청이 서블릿으로 처리해야 하는지에 대하여 검사한다. 만약 정적 리소스라면 바로 파일 시스템에서 응답하지만, 서블릿 매핑이 걸린 URL이라면 컨테이너로 넘긴다.

 

3. URL 매핑 검색

: 컨테이너는 요청된 경로와 web.xml 또는 @WebServlet 어노테이션에 정의된 매핑 정보를 대조한다. 가장 구체적으로 일치하는 패턴을 찾아 어떤 서블릿이 담당해야하는지 결정한다.

 

4. Request/Response 객체 생성

: 원시 HTTP 헤더와 바디는 곧바로 다루기 힘들기 때문에, 컨테이너가 HttpServletRequestHttpServletResponse 인스턴스를 만들어 요청정보를 캡슐화하고, 응답을 작성할 빈 객체를 준비한다.

 

5. 서블릿 인스턴스 확인 및 로드

: 컨테이너 내부에 이미 해당 서블릿 객체가 있는지 확인한다. 만약 없다면 클래스 로더를 통해 .class 파일을 로드하고 new 연산자를 호출하여 인스턴스를 생성한다.

 

6. 초기화(init())

: 위의 과정에서 생성된 서블릿 객체에 대해 init() 메서드를 한 번 실행한다. 이 단계에서 데이터베이스 커넥션, 리소스 로딩 같은 1회성 시작 준비 작업이 이루어진다.

 

7. 요청처리 (service -> doGet or doPost)

: 준비가 끝났다면 컨테이너는 service(request, response) 를 호출하고, 이 메소드가 내부적으로 HTTP 메서드(GET, POST 등)를 판단해 doGet(), doPost() 등으로 비즈니스 로직을 수행하도록 만든다.

 

8. 응답 작성 

: 서블릿은 resonse.getWriter()response.getOutputStream()을 이용하여 HTML, JSON, 이미지 등 원하는 바디를 채운다. 동시에 setStatus(), setHeader() 호출로 상태코드와 헤더도 설정한다

 

9. 응답 직렬화 및 전송

: 다 채워진 HttpServletResponse 객체를 컨테이너가 받아 HTML 프로토콜 형태로 바이트 스트림으로 바꿔, 원래 연결된 소켓을 통해 클라이언트로 되돌려 보낸다.

 

10. 커넥션 정리 또는 재활용

: 응답이 끝나면 Connection 헤더를 보고 소켓을 닫을지, 아니면 다음 요청을 위해 남겨둘지 결정한다.

 

11. 서블릿 종료(destroy)

: 애플리케이션이 언로드되거나 서버가 종료될 때, 컨테이너는 각 서블릿의 destroy() 메서드를 호출하여 열린 자원(파일, 스레드, DB 커넥션 등)을 깔끔하게 정리한다.

 


 

<출처>

https://wildeveloperetrain.tistory.com/372

 

서블릿과 서블릿 컨테이너 이해하기(Servlet, ServletContainer)

서블릿과 서블릿 컨테이너 이해하기(Servlet, ServletContainer)서블릿(Servlet)과 서블릿 컨테이너(ServletContainer)는 자바 기반 웹 애플리케이션을 개발하는데 기본이 되고 또 자주 만나게 되는 개념입니

wildeveloperetrain.tistory.com

 

https://programmer-may.tistory.com/202

 

서블릿 생명주기와 서블릿의 내부 동작 방식

개요웹 애플리케이션이 인터넷 환경에서 널리 사용되기 시작하면서, 서버 측에서 동적인 콘텐츠를 생성하고 사용자 요청을 처리하는 효율적인 방법이 필요해졌습니다. 초기의 웹 서버는 정적

programmer-may.tistory.com

 

https://velog.io/@yoho98/%EC%84%9C%EB%B8%94%EB%A6%BFServlet%EA%B3%BC-%EC%84%9C%EB%B8%94%EB%A6%BF-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88Servlet-Container-y88kny7g

 

서블릿(Servlet)과 서블릿 컨테이너(Servlet Container)

클라이언트의 요청을 처리하고, 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술자바 서블릿(Java Servlet)은 자바를 사용하여 웹페이지를 동적으로 생성하는 서버측

velog.io