공부하기/ETC

Servlet 이해하기 (Web Server, WAS, Servlet)

다섯자두 2025. 1. 22. 20:47

Web Server

HTTP 기반으로 동작하며 정적 리소스를 제공한다.

대표적인 웹 서버

  • Apache
  • NGINX
  • 등등

WAS (Web Application Server)

웹 서버의 기능에 + DB 조회를 포함하여 다양한 로직에 대한 처리를 함께 한다.
추가적인 코드 실행을 통해 어플리케이션 로직을 수행하고 동적 컨텐츠를 생성한다.

대표적인 WAS

  • Apache Tomcat (Spring Boot에 내장)
  • Eclipse Jetty
  • 등등

실제 웹 시스템 구성 (Web Server과 WAS의 관계)

  1. 정적 데이터에 대한 요청은 Web Server에서 바로 처리하여 응답한다.
    • ex) 요청 경로가 `/public/images/logo.png` -> 정적 리소스로 처리, 바로 응답
  2. 그 외의 경우 Web Server가 Http Request를 Web Container(Servlet Container를 포함)로 전달한다.
  3.  Web Container는 애플리케이션의 비즈니스 로직을 수행하거나 동적 데이터를 생성하여 요청에 대한 응답을 생성한다.

Servlet이란?

JAVA EE 사양의 일부분으로 HTTP 프로토콜 기반 요청과 응답을 처리하는 데 사용되는 소프트웨어이다.

서블릿은 기능을 정의한 표준 API이고, 웹 애플리케이션을 만드는 주체가 실제 구현 구현하여 배포한다. (ex. Apache Tomcat이 Servlet API를 구현)

표준 API 예시

package javax.servlet;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
 
public interface Servlet {
    public void init();    
 
    public void service(HttpServletRequest request, HttpServletResponse response)
        throws IOException;  
 
    public void destroy();
}
  • 기능을 정의한 표준 API
  • interface 형태로 제공

서블릿 구현체 예시

package javax.servlet.http;
 
import javax.servlet.Servlet;
import java.io.IOException;
 
public class HttpServlet implements Servlet {  
    @Override
    public void init() {
 
    }
 
    @Override
    public void service(HttpServletRequest request, HttpServletResponse response) throws IOException {     <===== ❷
        if ("GET".equals(request.getMethod())) {
            doGet(request, response);     
        } else {
            doPost(request, response);
        }
    }
 
    @Override
    public void destroy() { }
 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { }
 
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {}
}
  • 표준 API를 구현하여 WAS에서 제공 (ex. Tomcat)
  • `HttpServlet`, `HttpServletRequest`, `HttpServletResponse` 등등을 구현함

개발자의 서블릿 구현

  • WAS에서 구현해 놓은 `HttpServlet`을 상속함으로써 구현 가능하다.
public class ExampleServlet extends HttpServlet { // HttpServlet을 상속받아 구현한다.
	
	@Override
	protected void service(
		HttpServletRequest request,  // HTTP 요청 정보를 쉽게 사용할 수 있게 만드는 Servlet
		HttpServletResponse response // HTTP 응답 정보를 쉽게 제공할 수 있게 만드는 Servlet
	) {
		// application logic
	}

}

Servlet Container

  • 여러 서블릿을 생성, 관리, 종료하는 역할을 한다.
    • 각 Servlet 객체는`싱글톤`으로 관리
  • 동시 요청 처리를 위해 `멀티 스레드` 사용

템플릿 엔진 Template Engine

정적인 데이터(HTML, CSS, 이미지 등)를 단순 렌더링하는 것이 아니라, 동적인 데이터를 삽입할 수 있도록 하는 소프트웨어

서버 사이드 템플릿 엔진

  • 클라이언트가 요청을 보내면, 서버 측에서 HTML 템플릿에 동적으로 데이터를 삽입하여 완성된 HTML을 클라이언트에 전송한다.
  • 클라이언트는 전송 받은 HTML을 사용자에게 렌더링
    • `Q` 그렇다면 클라이언트는 단순히 HTML을 그려내는 역할만 하는가?
    • `A` YES. 데이터 처리 없이 렌더링 역할만 함.
  • 서버가 데이터 처리와 UI 생성을 모두 책임지므로 서버 부하가 클 수 있음

대표적인 템플릿 엔진

  • Thymleaf
  • JSP(Java Server Pages)
  • Mustache 
  • 등등

클라이언트 사이드 템플릿 엔진

  • 클라이언트에서 HTML 구조를 template화 (DOM을 구성), 주로 JavaScript 기반 동작
    • `Q` 이 때 공통 프레임(HTML)은 어디에서 가져오는가? 클라이언트에서 가지고 있는가?
    • `A` 템플릿은 보통 클라이언트 쪽 코드에 미리 포함되어 있음 (그렇지만 필요에 따라 별도의 요청을 통해 받아올 수도 있음. 불가능한 것은 X)
  • 필요한 데이터를 서버에 요청
  • 클라이언트는 받아온 데이터를 템플릿에 동적으로 삽입 후 렌더링
  • 브라우저(클라이언트)가 자바스크립트와 템플릿 엔진을 실행할 수 있어야 함

대표적인 템플릿 엔진

  • Mustache
  • EJS
  • 현대에는 React, Vue.js, Angular와 같은 프레임워크에서 템플릿 엔진 역할을 포함함.