Web/Spring & Spring Boot

🍃 Servlet이란?

개발자 오리 2025. 4. 22. 20:44

📢 들어가면서

학교 강의 중 웹 서비스 프로그래밍이란 과목을 들으면서 Servlet에 대해 배운 적이 있다. 그러나 여느 학교 강의와 똑같이 시험때만 기억을 하고 이후에는 까먹게 된다. 때문에 이번에 다시 정리를 해보면서 그때 배웠던 내용들과 조금 더 자세한 내용들에 대해서 알아보려고 한다!

 

 

🐺 WAS란?

Servlet에 대해서 얘기를 해야하는데 갑자기 WAS가 무엇이길래 나왔을까? Servlet은 단일의 개념으로만 보기엔 이해하기 어려운 부분들이 존재한다. WAS에 대해 먼저 이해를 한 뒤에 Servlet에 대해서 알아보자.

 

📌 정의는?

Web Application Server의 약자로, 인터넷 상에서 http 프로토콜을 통해 사용자 컴퓨터나 장치에 어플리케이션을 수행해주는 미들웨어이다.

 

조금 더 쉽게 얘기를 해보면 Web Server와 Web Container가 합쳐진 형태로 Web Server에서 단독으로 처리할 수 없는 다양한 로직의 처리가 필요한 동적 컨텐츠를 제공한다. 덕분에 우리가 원하는 다양한 요구에 맞춰 Web Service를 제공할 수 있는 것이다!

 

이때 WAS는 JSP, Servlet 구동 환경을 제공해주기 때문에 Web Container 혹은 Servlet Container라고 불린다.

이 WAS의 대표적인 예로 Tomcat이 있다. 이 Tomcat에 대해서는 조만간 따로 정리를 할테니 지금은 이런 게 있구나~ 만 알고 넘어가면 좋을 것 같다.

 

 

🦁 Servlet이란?

📌 정의는?

클라이언트의 요청을 처리하고, 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 Java 웹 프로그래밍 기술

 

WAS과 Servlet의 정의를 봤다면 Servlet이 왜 필요한지 조금은 이해가 될 것 같다! 이해가 안된다고 해도 다시 차근차근 설명을 할 예정이니 너무 걱정하지 않아도 된다 ^^

 

이 Servlet이라는 것은 Java 기반의 웹 어플리케이션을 개발하기 위해 사용되는 기술이다. 이 Servlet을 사용하여 클라이언트의 HTTP 요청을 처리하고 응답을 생성해서 반환하는 역할을 한다.

 

이 역할이 필요한 이유는 HTTP 프로토콜을 사용하는 웹 서버를 개발하기 위해선 HTTP 프로토콜을 처리할 수 있어야 하고, 어느 웹 앱이든 HTTP 프로토콜을 처리하는 부분은 동일하다. 하지만 이러한 공통적으로 처리하게 되는 작업을 매 프로젝트마다 각각의 서비스마다 반복을 하게 된다.

 

이는 매우 귀찮고 비효율적이다. 때문에 이러한 공통 작업을 대신 해줄 수 있는 것이 필요했고, 그것이 바로 Servlet이다. 즉, Servlet은 요청과 응답에 메소드 호출이라는 간단한 작업만으로 다룰 수 있도록 해주는 기술이 되는 것이다!

 

이에 대한 간단한 예시로 로그인이 있다! 로그인을 시도할 때 서버가 클라이언트에서 넘어온 아이디와 비밀번호를 확인하고 결과를 응답하게 되는데 이러한 역할을 수행하는 것이 바로 Servlet이다!

 

📌 특징은?

그렇다면 이 Servlet의 주요 특징들에는 무엇이 있을까?

  • 클라이언트의 요청(Request)에 대해서 동적으로 작동하는 웹 어플리케이션 컴포넌트
    : Servlet은 클라이언트의 요청을 받아 동적으로 처리하여 실시간으로 응답을 생성하며, 이를 통해 동적 웹 콘텐츠를 제공할 수 있다.
  • 클라이언트의 요청에 대해서 HTML을 사용하여 응답(Response)
    : 서블릿은 HTML, XML, JSON 등 다양한 형식의 응답을 생성할 수 있지만 주로 HTML을 사용하여 웹 페이지를 동적으로 생성한다.
 💡 HTML을 사용하는 이유는?
HTML은 웹 페이지의 기본 표현 형식이며, 모든 웹 브라우저와 호환이 되고, 사용자와 상호작용을 하기 위한 필수적인 요소이기 때문이다. Servlet은 동적으로 작동하는 웹 콘텐츠를 제공하는데 HTML을 사용하여 응답한다면 이러현 응답을 사용자에게 표시하는데 유용하다.

 

  • 기존의 정적 웹 프로그램의 문제점을 보완하여 동적인 여러가지 기능을 제공
    : 기존 정적인 웹 페이지의 콘텐츠의 변경이 어렵다는 한계를 넘어 사용자의 입력에 따라 동적으로 콘텐츠를 생성하고 처리할 수 있도록 한다.

  • Java의 Thread를 이용
    : Servlet Container는 각 요청을 독립적인 Thread에서 처리하기 때문에 많은 클라이언트의 요청을 동시에 처리할 수 있다. 이를 통해 동시성을 지원한다.
💡 Thread란?
프로세스 내부에서 실행되는 작은 작업의 단위로 모든 프로세스에는 최소 한 개 이상의 Thread가 존재하며 둘 이상 가진 프로세스를 Multi Thread라고 한다.

 

  • MVC 패턴에서의 컨트롤러로 이용
    : 여기서 Servlet은 웹 어플리케이션에서 Controller의 역할을 수행하며 클라이언트의 요청을 처리하고, 비즈니스 로직을 수행한 뒤 적절한 View를 선택하여 응답한다.
💡 MVC 패턴이란?
Model, View, Controller의 약자이다.
Model, View, Controller 라는 개념으로 나누어 일련의 작업을 처리하는 방법으로,
Model은 Controller에서 받은 데이터를 조작(가공)한다.
View는 Model의 데이터를 사용자에게 시각적으로 보여주는 역할을 한다.
Controller는 View와 Model 사이에서 데이터의 흐름을 제어한다.

 

  • HTML 변경시 Servlet을 재컴파일해야함
    : Servlet은 Java의 코드로 작성이 되기 때문에 HTML의 내용 변경이 필요하다면 Servlet 코드를 수정하고 재컴파일을 해야한다. 이유는 Servlet이 서버 측에서 실행이 되기 때문이다.

 

 

🦊 Servlet Container란?

📌 정의는?

구현이 되어있는 Servlet Class의 규칙에 맞게 Servlet을 담고 관리해주는 Container

 

위에 얘기했던 것처럼 Servlet을 우리가 만들었다고 했을 때 이 Servlet을 관리해주는 어떠한 것이 필요한데 이 역할을 Servlet Container가 하게 된다. 즉, Servlet Class의 규칙에 맞도록 Servlet을 관리한다!

Servlet Conatiner는 클라이언트의 요청을 받고 응답을 할 수 있다. 그 이유는 웹서버와 소켓을 사용하여 통신을 하기 때문이다.

이때 클라이언트에서 요청을 하게되면 Container는 HttpServletRequest, HttpServletResponse 두 객체를 생성하여 post, get에 따라 동적인 페이지를 생성하여 응답한다.

 

💡 HttpServletRequest와 HttpServletResponse란?
HttpServletRequset는 http 프로토콜의 request 정보를 Servlet에게 전달하기 위해 사용하며, 헤더정보, 파라미터, 쿠키, URI/URL 등의 정보를 읽어들이는 메소드를 포함한다.

HttpServletResponse는 요청을 보낸 클라이언트에게 응답을 보내기 위해 WAS에서 생성되어 Servlet에게 전달이 되며, Servlet은 이 객체를 이용하여 content type, 응답 코드 등을 전송한다.

 

📌 주요 기능은?

  • Servlet 생명주기 관리
    :
    Servlet의 생명 주기를 관리한다. Servlet Container가 실행되면 Servlet Class를 로딩하여 인스턴스화하고, 초기화 메소드를 호출한다.
    이후 요청이 들어오면 적절한 Servlet 메소드를 호출한다. 또한 수명이 끝난 Servlet은 가비지 콜렉터를 통해 제거하여 자원을 효율적으로 관리할 수 있도록 한다.

  • 통신 지원
    :
    실제 클라이언트가 서버와 통신을 하기 위해서는 소켓을 연결하고 HTTP 요청을 받아와서 읽고 HTTP 메소드를 확인하는 등의 과정을 거쳐야한다. 하지만 Servlet Container는 이러한 기능들을 API로 제공하여 복잡한 과정을 줄이고, 개발자가 비즈니스 로직에만 집중할 수 있도록 도와준다.

  • 멀티 스레드 지원, 관리
    :
    Servlet Container는 Thread를 사용하여 작업을 수행한다. 때문에 여러 요청이 들어와도 Multi Threading 환경으로 동시다발적으로 작업을 관리할 수 있으며, Multi Thread에 관한 부분은 WAS가 처리를 해주기 때문에 개발자는 이와 관련된 코드는 신경쓰지 않아도 된다.

  • 선언적인 보안 관리
    :
    Servlet Container는 보완과 관련된 기능을 지원한다. 따라서 개발자는 보안과 관련된 기능을 따로 구현하지 않아도 된다.

 

 

🐻 Servlet의 생명주기란?

📌 정의는?

말 그대로 Servlet이 생성되고 사용되고 소멸되기까지의 일련의 과정을 뜻한다.

Servlet의 생명주기는 다음과 같다!

  1. WAS는 클라이언트로부터 Servlet 요청을 받으면 해당 Servlet이 메모리에 있는지 확인
  2. (만약 해당 Servlet이 처음 실행되어 메모리에 없다면) Servlet Class를 메모리에 올리고 init() 메소드와 service() 메소드를 실행
  3. (만약 해당 Servlet이 메모리에 있다면) service() 메소드를 실행
  4. WAS가 종료되거나 웹 어플리케이션이 갱신되어 서블릿 종료 요청이 있을 경우 destroy() 메소드를 실행

 

📌 메소드는?

생명주기에 대해서 얘기할 때 나온 메소드들이 있다. 각각의 메소드들이 어떤 역할을 하는지 하나씩 살펴보자!

  • init() : Servlet을 처음 메모리에 올릴 때 실행이 되어 Servlet을 초기화하며 처음에 한번만 실행
  • service() : 요청과 응답을 처리하며 요청이 GET인지 POST인지 구분하여 doGet() 또는 doPost() 메소드로 나뉘어짐
  • destroy() : Servlet 종료요청이 있을 경우 destory() 메소드가 실행

 

 

🐨 Servlet의 동작방식은?

지금까지 Servlet에 대한 전반적인 내용을 알아보았다. 결국 이 동작방식을 설명하기 위한 발판이었다고 생각하면 좋을 것 같다. 위에서 배웠던 개념들을 바탕으로 Servlet의 동작방식에 대해서 알아보자!

 

  1. 사용자(클라이언트)가 URL을 입력하면 HTTP Request가 Servlet Container로 전송
  2. 요청을 전송받은 Servlet Container는 HttpServletRequest, HttpServletResponse 객체를 생성
  3. web.xml을 기반으로 사용자가 요청한 URL이 어느 서블릿에 대한 요청인지 찾음
  4. 해당 서블릿에서 service메소드를 호출한 후 클리아언트의 GET, POST여부에 따라 doGet() 또는 doPost()를 호출
  5. doGet() or doPost() 메소드는 동적 페이지를 생성한 후 HttpServletResponse객체에 응답을 보냄
  6. 응답이 끝나면 HttpServletRequest, HttpServletResponse 두 객체를 소멸
💡 web.xml이란?
웹 애플리케이션의 배포 설명자로 XML 형식의 파일이다. Servlet 매핑되는 방법, 인증이 필요한 URL 등의 정보를 확인한다.

 

 

 

🪄 정리하자면

Servlet은 Java를 사용하여 동적 웹 페이지를 만들기 위해 필요한 기술이다!

Servlet은 Servlet Container가 관리하며 이 Servlet Container의 역할을 하는 것이 WAS이다!

'Web > Spring & Spring Boot' 카테고리의 다른 글

🍃 WAR & JAR란?  (1) 2025.04.27
🍃 JSP란?  (1) 2025.04.23
🍃 Maven & Gradle이란?  (1) 2025.04.21
🍃 Spring & Spring Boot란?  (1) 2025.04.20