Pink Spider/servlet이란?

Created Tue, 29 Apr 2025 20:19:45 +0900 Modified Mon, 08 Dec 2025 08:41:47 +0900
2459 Words 11 min

Servlet이란?

ServletJava를 기반으로 작성된 서버 측 프로그램으로, 클라이언트(주로 웹 브라우저)의 요청을 처리하고, 응답을 생성하는 역할을 합니다. 주로 HTTP 요청과 응답을 처리하기 위해 사용되며, Java EE (이후 Jakarta EE로 이름 변경) 스펙의 일부입니다.

Servlet은 기본적으로 웹 애플리케이션 서버(Tomcat, Jetty 등) 위에서 동작하며, 웹 서버와 클라이언트 간의 중간 처리자로 기능합니다.


Servlet의 주요 특징

  • Java 언어 기반: 플랫폼 독립적이며 객체 지향 프로그래밍의 장점을 가집니다.
  • 요청-응답 처리: HTTP 요청(GET, POST, PUT, DELETE 등)을 받아서 필요한 비즈니스 로직을 수행하고, 결과를 다시 클라이언트에 전송합니다.
  • 확장성: 추가 설정과 라이프사이클 관리가 가능해 복잡한 웹 애플리케이션 개발이 가능합니다.
  • 스레드 기반: 하나의 Servlet 인스턴스가 다수의 요청을 처리하기 위해 여러 스레드와 함께 동작합니다.
  • 라이프사이클 관리: init(), service(), destroy() 메서드를 통해 생명주기를 관리합니다.

Servlet의 동작 방식

  1. 클라이언트 요청: 사용자가 브라우저를 통해 서버로 요청을 보냅니다.
  2. 웹 서버 전달: 요청은 웹 서버(Tomcat 등)에 의해 해당 Servlet에 전달됩니다.
  3. Servlet 요청 처리:
    • service() 메서드가 호출되어 요청을 처리합니다.
    • 요청 방식에 따라 doGet(), doPost() 등의 메서드가 실행됩니다.
  4. 응답 생성: 처리 결과를 HttpServletResponse 객체를 통해 클라이언트로 반환합니다.
  5. 라이프사이클 종료: 서버가 내려가거나 특정 상황에서 destroy()가 호출되어 정리 작업을 합니다.

Servlet의 기본 구조 (예제)

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        resp.setContentType("text/html");
        resp.getWriter().write("<h1>Hello, Servlet!</h1>");
    }
}

이 코드는 /hello 경로로 요청이 오면 “Hello, Servlet!” 이라는 HTML을 클라이언트에 반환합니다.


Servlet과 다른 기술과의 관계

기술 설명
JSP Servlet 기반 위에 HTML과 Java 코드를 섞어 쉽게 동적 웹페이지를 작성하기 위한 기술.
Spring MVC Servlet을 기반으로 더 높은 추상화와 구조화된 웹 애플리케이션 아키텍처를 제공하는 프레임워크. DispatcherServlet이 핵심.
Servlet Filter 요청과 응답에 대해 사전, 사후 처리를 할 수 있도록 도와주는 서블릿 기능 확장 도구.
Servlet Listener 애플리케이션 또는 세션의 라이프사이클 이벤트를 감지하고 처리할 수 있도록 하는 기능.

요약

  • Servlet은 웹 애플리케이션의 핵심 컴포넌트입니다.
  • 요청-응답 흐름을 처리하는 기본 단위이며, Java 기반 웹 서버 프로그래밍의 출발점입니다.
  • 오늘날에는 직접 Servlet을 작성하기보다, Spring MVC 같은 프레임워크를 통해 보다 편리하게 개발하는 경우가 많습니다.

추가로, Servlet 라이프사이클, ServletConfig / ServletContext 차이, 또는 Servlet 3.0 이상에서의 변화(JSP/Annotations 기반 설정) 등도 설명해드릴 수 있습니다.


좋은 질문입니다. 이번에는 “Servlet과 Controller의 관계” 에 대해 깊이 있게 정리해드릴게요.


1. Servlet과 Controller의 기본 이해

항목 Servlet Controller
정의 Java 웹 서버에서 HTTP 요청을 받아 응답하는 기본 단위 웹 프레임워크(Sprint MVC 등)에서 요청을 받아 비즈니스 로직을 연결하는 역할
위치 서버에 직접 배포되는 컴포넌트 프레임워크 내에서 라우팅과 로직 연결을 담당
초점 요청/응답 처리 자체 (낮은 수준) 요청에 따라 알맞은 로직 호출 및 결과 리턴 (고수준)
구현 방식 HttpServlet 클래스를 상속하여 작성 프레임워크 규약에 따라 작성 (@Controller, @RestController)

2. Servlet과 Controller의 관계

정리하면, Controller는 Servlet 위에서 동작하는 추상화된 개념입니다.

구체적으로:

  • Servlet은 HTTP 요청을 가장 먼저 받는 가장 하위(낮은 수준, Low-level)의 컴포넌트입니다.
  • Controller는 Servlet이 받은 요청을 분기 처리하고, 비즈니스 로직을 호출하고, 결과를 가공해 반환하는 역할을 합니다.

즉, Controller는 Servlet 위에서 동작하며, Servlet 덕분에 HTTP 요청/응답의 세부사항을 신경 쓰지 않고, 로직 구현에 집중할 수 있습니다.


3. Spring MVC에서의 실제 흐름 (Servlet과 Controller 연결)

Spring MVC를 예로 들면 다음과 같은 구조입니다:

  1. 클라이언트가 서버에 요청을 보냄 (예: /users).
  2. DispatcherServlet(Spring이 제공하는 특별한 Servlet)이 요청을 가장 먼저 받음.
  3. DispatcherServlet은 HandlerMapping을 통해 어떤 Controller가 요청을 처리할지 결정함.
  4. 요청에 맞는 Controller가 호출되어 비즈니스 로직을 수행.
  5. Controller는 처리 결과를 DispatcherServlet에 반환.
  6. DispatcherServlet은 ViewResolver 등을 통해 최종 HTML(또는 JSON)을 생성하여 클라이언트에게 응답.

DispatcherServlet은 일종의 “Front Controller” 패턴을 따릅니다.

그림으로 표현하면:

[Client] → [DispatcherServlet (Servlet)] → [Controller] → [Service / Business Logic]

4. DispatcherServlet이 하는 역할

Spring에서는 개발자가 직접 Servlet을 다루지 않고, Spring이 제공하는 DispatcherServlet이 대신 HTTP 요청을 받아서 Controller로 전달합니다. 이 DispatcherServlet은 다음을 합니다:

  • 요청 파싱
  • 어떤 Controller로 보낼지 결정
  • 요청/응답 객체(HttpServletRequest, HttpServletResponse) 관리
  • Exception 핸들링
  • 뷰 선택 및 렌더링

이 덕분에 우리는 단순히 @Controller만 작성하면 되고, HTTP 프로토콜 세부사항은 신경 쓰지 않아도 됩니다.


5. 간단한 코드 예시

DispatcherServlet 설정 (Spring Boot에서는 자동 등록)

// Spring Boot에서는 기본적으로 DispatcherServlet이 등록된다
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

Controller 코드

@RestController
@RequestMapping("/hello")
public class HelloController {
    @GetMapping
    public String sayHello() {
        return "Hello, Controller!";
    }
}

여기서 핵심은:HelloController는 직접 Servlet을 만들지 않았지만, 내부적으로 DispatcherServlet이 이 Controller를 호출해주는 것입니다.


6. 요약

  • Servlet: HTTP 요청/응답을 가장 낮은 수준에서 처리하는 Java 컴포넌트.
  • Controller: 비즈니스 로직과 사용자 요청을 연결하는 상위 수준의 컴포넌트.
  • Controller는 Servlet(DispatcherServlet)이 요청을 넘겨준 덕분에 동작하며, 개발자는 더 쉽게 로직에 집중할 수 있다.
  • Spring MVC는 이러한 관계를 “Front Controller” 패턴으로 구조화했다.