Servlet이란?
Servlet은 Java를 기반으로 작성된 서버 측 프로그램으로, 클라이언트(주로 웹 브라우저)의 요청을 처리하고, 응답을 생성하는 역할을 합니다. 주로 HTTP 요청과 응답을 처리하기 위해 사용되며, Java EE (이후 Jakarta EE로 이름 변경) 스펙의 일부입니다.
Servlet은 기본적으로 웹 애플리케이션 서버(Tomcat, Jetty 등) 위에서 동작하며, 웹 서버와 클라이언트 간의 중간 처리자로 기능합니다.
Servlet의 주요 특징
- Java 언어 기반: 플랫폼 독립적이며 객체 지향 프로그래밍의 장점을 가집니다.
- 요청-응답 처리: HTTP 요청(
GET,POST,PUT,DELETE등)을 받아서 필요한 비즈니스 로직을 수행하고, 결과를 다시 클라이언트에 전송합니다. - 확장성: 추가 설정과 라이프사이클 관리가 가능해 복잡한 웹 애플리케이션 개발이 가능합니다.
- 스레드 기반: 하나의 Servlet 인스턴스가 다수의 요청을 처리하기 위해 여러 스레드와 함께 동작합니다.
- 라이프사이클 관리:
init(),service(),destroy()메서드를 통해 생명주기를 관리합니다.
Servlet의 동작 방식
- 클라이언트 요청: 사용자가 브라우저를 통해 서버로 요청을 보냅니다.
- 웹 서버 전달: 요청은 웹 서버(Tomcat 등)에 의해 해당 Servlet에 전달됩니다.
- Servlet 요청 처리:
service()메서드가 호출되어 요청을 처리합니다.- 요청 방식에 따라
doGet(),doPost()등의 메서드가 실행됩니다.
- 응답 생성: 처리 결과를
HttpServletResponse객체를 통해 클라이언트로 반환합니다. - 라이프사이클 종료: 서버가 내려가거나 특정 상황에서
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를 예로 들면 다음과 같은 구조입니다:
- 클라이언트가 서버에 요청을 보냄 (예:
/users). - DispatcherServlet(Spring이 제공하는 특별한 Servlet)이 요청을 가장 먼저 받음.
- DispatcherServlet은 HandlerMapping을 통해 어떤 Controller가 요청을 처리할지 결정함.
- 요청에 맞는 Controller가 호출되어 비즈니스 로직을 수행.
- Controller는 처리 결과를 DispatcherServlet에 반환.
- 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” 패턴으로 구조화했다.