반응형
이번 포스트에서는 Spring에서 사용되는 서블릿에 대한 기본기를 설명한다.
1. 서블릿이란
- 서블릿(Servlet)은 웹 서버에서 실행되는 자바 프로그램으로, 클라이언트로부터의 요청을 처리하고 그 결과를 다시 클라이언트에게 전송하는 역할을 한다. 이는 주로 동적인 웹 페이지를 생성하기 위한 용도로 사용된다. 즉, 사용자가 웹 페이지를 요청할 때마다 새롭게 생성되는 콘텐츠를 만드는데 사용되는 도구 중 하나이다.
- 서블릿은 일반적인 자바 클래스와 마찬가지로 자바 코드로 작성된다. 하지만 일반적인 자바 프로그램과는 다르게 웹 서버 내에서 실행되며, HTTP 프로토콜을 이용하여 클라이언트와 통신한다. 이를 위해, 서블릿은 보통 HTTP 요청을 처리하는 메소드를 구현한다. 대표적인 예로는 doGet()과 doPost() 메소드가 있다.
- doGet() 메소드는 클라이언트로부터 GET 요청이 들어왔을 때 호출되며, doPost() 메소드는 POST 요청이 들어왔을 때 호출된다. 각 메소드는 요청에 대한 처리를 수행한 후, 결과를 클라이언트에게 전송하는 응답을 생성한다. 응답은 HTML, JSON, XML 등 다양한 형태의 데이터를 포함할 수 있다.
- 서블릿은 클라이언트에게 고정된 콘텐츠를 제공하는 정적 웹 페이지와는 대조적으로, 사용자의 요청 내용이나 서버의 상태에 따라 다양한 콘텐츠를 동적으로 생성하고 제공한다.
- 예를 들어, 사용자가 로그인을 요청하면 서블릿은 사용자의 아이디와 비밀번호를 확인하고, 그 결과에 따라 사용자에게 표시되는 웹 페이지의 내용을 변경할 수 있다.
서블릿의 기본적인 형태를 보여주는 코드
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
public class MyServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 클라이언트의 GET 요청에 대한 처리 로직
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 클라이언트의 POST 요청에 대한 처리 로직
}
}
이처럼 서블릿은 웹 애플리케이션에서 중요한 역할을 하는 동적 처리를 담당한다. 자바를 기반으로 하는 웹 애플리케이션 개발에서는, 서블릿을 이용하여 사용자의 요청을 처리하고 그에 따른 적절한 응답을 생성하는 역할을 수행한다.
2. 서블릿은 언제 사용되는가?
- 동적인 웹 페이지 생성:
- 서블릿은 동적인 웹 페이지를 생성하기 위해 사용된다.
- 클라이언트의 요청에 따라 데이터베이스 조회, 비즈니스 로직 실행, 외부 API 호출 등의 작업을 수행하여 동적으로 웹 페이지를 생성한다.
- 폼 데이터 처리:
- 서블릿은 클라이언트로부터 전송된 폼 데이터를 받아 처리하는데 사용된다.
- 폼 데이터를 추출하고, 유효성 검사를 수행하거나 데이터를 저장하는 등의 작업을 수행할 수 있다.
- 세션 관리:
- 서블릿은 클라이언트의 세션을 관리하는데 사용된다.
- 세션을 생성하고, 세션에 데이터를 저장하거나 조회하는 등의 작업을 수행할 수 있다.
- 인증과 보안:
- 서블릿은 인증과 보안을 처리하는데 사용된다.
- 클라이언트의 인증 정보를 확인하고, 접근 권한을 검사하여 보안 요구사항을 충족시킬 수 있다.
3. 서블릿의 특징
- 자바로 작성:
- 서블릿은 자바 언어로 작성되므로 자바의 모든 기능을 사용할 수 있다.
- 서블릿은 자바 언어로 작성되므로 자바의 모든 기능을 사용할 수 있다.
- 서버에서 실행:
- 웹 서버 안에서 돌아가며, 사용자의 요청을 받아 처리하고 응답을 보낸다.
- 웹 서버 안에서 돌아가며, 사용자의 요청을 받아 처리하고 응답을 보낸다.
- 동적 처리:
- 사용자마다 다른 정보를 보여주거나, 사용자의 입력에 따라 다르게 반응한다.
- 사용자마다 다른 정보를 보여주거나, 사용자의 입력에 따라 다르게 반응한다.
- 서블릿 컨테이너에서 실행 (생명주기 관리):
- 특별한 프로그램(예: Tomcat) 안에서 돌아가며, 이 프로그램이 서블릿의 생성, 실행, 삭제 등을 관리한다.
- 특별한 프로그램(예: Tomcat) 안에서 돌아가며, 이 프로그램이 서블릿의 생성, 실행, 삭제 등을 관리한다.
- Thread Safety (스레드 안전성):
- 여러 사람이 동시에 서블릿에 접근해도 잘 동작해야 한다.
- 여러 사람이 동시에 서블릿에 접근해도 잘 동작해야 한다.
- HTTP Protocol Support (HTTP 프로토콜 지원):
- 웹 브라우저와 서블릿 사이의 대화는 HTTP라는 규칙을 사용한다.
4. 서블릿과 JSP, Thymeleaf
JSP(JavaServer Pages):
- 서블릿 기술을 좀 더 쉽게 사용할 수 있게 해주는 자바 기술이다. HTML 코드 안에 자바 코드를 넣어 동적인 웹 페이지를 만들 수 있다.
- JSP 파일은 .jsp 확장자를 가지며, 실제로는 서블릿으로 변환되어 실행됩니다.
- JSP를 사용하면, 웹 페이지의 내용을 동적으로 생성할 수 있으며, 자바 코드를 사용하여 db와의 통신, 조건부 렌더링, 반복 렌더링 등 복잡한 로직을 처리할 수 있다.
간단한 예시
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>Hello World</title>
</head>
<body>
<h1>Hello, <%= request.getParameter("name") %>!</h1>
</body>
</html>
- 웹 브라우저에서 해당 JSP페이지에 접근하면 URL에 name 파라미터를 전달해서 다른 이름을 출력할수가 있다.
- 예를 들어, URL이 http://example.com/hello.jsp?name=Jinan이면, 웹 페이지에는 "Hello, jinan!"이 출력된다.
- JSP는 이러한 동적인 처리를 가능하게 하며, 자바코드와 HTML을 결합하여 웹페이지를 생성하는 역할을 한다.
Thymeleaf:
- HTML 템플릿 엔진으로, 서버 측에서 동적으로 HTML을 생성할 수 있게 해준다.
결론
- 서블릿은 웹 서버에서 돌아가는 자바 프로그램으로, 사용자의 요청을 받아 동적으로 처리하고 응답을 보내주는 역할을 한다. JSP는 서블릿을 좀 더 쉽게 사용할 수 있게 해주는 기술이며, Thymeleaf는 HTML을 동적으로 생성하는 데 사용되는 템플릿 엔진이다.
5. 비유를 통한 서블릿 설명
서블릿은 웹 사이트에서 특정 작업을 처리하는 '요리사'와 같다. 웹 브라우저는 '손님'이고, 웹 사이트는 '레스토랑'이라고 생각해 보자.
- 손님의 주문:
- 손님이 메뉴판(웹 페이지)에서 음식(기능)을 선택하고 주문(요청)한다.
- 손님이 메뉴판(웹 페이지)에서 음식(기능)을 선택하고 주문(요청)한다.
- 요리사의 역할:
- 요리사(서블릿)는 주문을 받아 음식을 만든다. 각 요리사는 특정 음식만 만들 수 있으며, 그 레시피는 자바 파일에 적혀 있다.
- 요리사(서블릿)는 주문을 받아 음식을 만든다. 각 요리사는 특정 음식만 만들 수 있으며, 그 레시피는 자바 파일에 적혀 있다.
- 음식 서빙:
- 요리사가 만든 음식(응답)은 웨이터(서블릿 컨테이너)가 손님에게 가져다 준다.
- 요리사가 만든 음식(응답)은 웨이터(서블릿 컨테이너)가 손님에게 가져다 준다.
- 다양한 요리:
- 요리사는 손님마다 다른 음식을 만들 수 있으며(동적 처리), 여러 손님의 주문을 동시에 처리할 수 있다(스레드 안전성).
- 요리사는 손님마다 다른 음식을 만들 수 있으며(동적 처리), 여러 손님의 주문을 동시에 처리할 수 있다(스레드 안전성).
조금 더 쉬운 설명
- 서블릿:
- 웹 사이트의 '요리사'로, 특정 작업을 수행한다.
- 웹 사이트의 '요리사'로, 특정 작업을 수행한다.
- 자바 파일:
- 요리사의 '레시피북'으로, 어떻게 작업을 할지가 적혀 있다.
- 요리사의 '레시피북'으로, 어떻게 작업을 할지가 적혀 있다.
- 웹 브라우저:
- '손님'으로, 웹 사이트에서 원하는 것을 선택하고 요청한다.
- '손님'으로, 웹 사이트에서 원하는 것을 선택하고 요청한다.
- 서블릿 컨테이너:
- '웨이터'로, 요리사와 손님 사이(서블릿과 웹 브라우저의 사이)를 연결해 주며, 요리사(서블릿이)가 잘 작업할 수 있도록 도와준다.
- '웨이터'로, 요리사와 손님 사이(서블릿과 웹 브라우저의 사이)를 연결해 주며, 요리사(서블릿이)가 잘 작업할 수 있도록 도와준다.
이렇게 서블릿은 웹 사이트에서 특별한 작업을 수행하는 '요리사' 역할을 하며, 각각의 작업은 하나의 '레시피북'(자바 파일)에 따라 수행된다. 웹 브라우저의 요청에 따라 서블릿은 응답을 만들어 보내고, 이 과정은 서블릿 컨테이너가 관리한다.
6. 서블릿 API 설명
- 서블릿 API는 자바 웹 개발을 위해 제공되는 API(Application Programming Interface)이다.
- 이 API는 HTTP 요청을 처리하고 응답을 생성하는데 필요한 인터페이스와 클래스를 정의한다.
- 가장 핵심적인 클래스와 인터페이스로는 javax.servlet.Servlet 인터페이스와 javax.servlet.http.HttpServlet 클래스가 있다.
예를 들어, javax.servlet.http.HttpServlet 클래스를 확장하여 새로운 서블릿을 생성할 수 있다. 다음은 간단한 서블릿 예제이다.
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloWorldServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.getWriter().println("Hello, World!");
}
}
- 이 예제에서는 doGet 메소드를 오버라이드하여, HTTP GET 요청이 들어오면 "Hello, World!"라는 메시지를 응답으로 보내도록 구현했다.
- 여기서 HttpServletRequest 객체는 요청 정보를, HttpServletResponse 객체는 응답을 생성하는데 사용된다.
- 하지만, 대부분의 웹 애플리케이션 프레임워크에서는 이러한 낮은 수준의 API를 직접 다루는 대신, 더 높은 수준의 추상화를 제공하여 개발자가 더 편리하게 웹 애플리케이션을 개발할 수 있도록 돕는다.
- 예를 들어, Spring MVC에서는 @Controller와 @RequestMapping 어노테이션을 통해 요청을 처리하는 메소드를 정의할 수 있다.
@Controller와 @RequestMapping 어노테이션을 통해 요청을 처리하는 메소드를 정의할 수 있다는건 이 어노테이션을 사용하면 HttpServlet을 알아서 만들어준다는 말일까?
- 맞다. @Controller와 @RequestMapping 어노테이션을 사용하면, 개발자는 HTTP 요청을 처리하는 로직만 구현하면 된다.
- Spring 프레임워크가 내부적으로 해당 클래스와 메소드를 HTTP 요청 처리를 위한 서블릿처럼 동작시킨다. 이를 통해, 개발자는 낮은 수준의 서블릿 API를 직접 다루는 대신, 비즈니스 로직에 집중할 수 있게 된다.
예를 들어, 다음과 같이 컨트롤러를 정의할 수 있다.
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class HelloWorldController {
@RequestMapping("/hello")
@ResponseBody
public String helloWorld() {
return "Hello, World!";
}
}
- 이 예제에서 HelloWorldController 클래스는 @Controller 어노테이션으로 표시되어 있어, Spring이 이 클래스를 컨트롤러로 인식하게 된다. 그리고 helloWorld() 메소드는 @RequestMapping("/hello") 어노테이션에 의해서 "/hello" 경로로 들어오는 HTTP 요청을 처리하도록 설정되어 있다.
- 따라서 "/hello" 경로로 요청이 들어오면, "Hello, World!" 문자열이 응답으로 반환된다.
- 이렇게 하면, HttpServlet을 직접 상속받아 doGet, doPost 등의 메소드를 오버라이딩하는 대신, 간단하게 HTTP 요청을 처리할 수 있게 된다.
그럼 @Controller랑 @RequestMapping이 알아서 서블릿 역할을 처리해준다는 것인가?
- 맞다. @Controller와 @RequestMapping 어노테이션은 Spring MVC 프레임워크에서 제공하는 기능으로, 개발자가 HTTP 요청을 처리하는 메소드를 간편하게 작성할 수 있도록 도와준다.
- 이러한 어노테이션은 Spring MVC가 내부적으로 해석하여 요청을 적절한 핸들러 메소드로 라우팅하고 처리한다.
- 즉, 개발자는 HttpServlet을 직접 상속받아서 doGet, doPost 등의 메소드를 오버라이딩하여 구현하는 번거로움을 덜 수 있고, 더 추상화된 레벨에서 웹 애플리케이션을 개발할 수 있게 된다.
- Spring MVC 프레임워크가 어노테이션을 해석하고 필요한 처리를 수행하기 때문에, 개발자는 비즈니스 로직에 집중할 수 있다.
- 따라서, @Controller와 @RequestMapping 어노테이션은 Spring MVC의 핵심 개념으로, 개발자가 보다 간결하고 직관적인 방식으로 웹 애플리케이션을 구현할 수 있도록 도와준다.
- 이를 통해 개발자는 HTTP 요청에 대한 처리에 더욱 집중할 수 있고, 코드의 가독성과 유지보수성을 향상시킬 수 있다.
서블릿에 대한 기본적인 이해는 웹 애플리케이션의 동작 원리를 이해하는데 도움이 된다.
2023.08.08 - [Spring 기초/서블릿] - Spring Boot 서블릿 연동: Spring과 서블릿의 관계 (2편)
반응형
'Spring 기초 > Spring 기초 지식2' 카테고리의 다른 글
[Spring] AOP: 횡단 관심사 쉽게 이해하기 (0) | 2023.11.13 |
---|---|
Spring Boot 웹 개발: JSP와 JSTL 활용하기 (3편) (0) | 2023.08.08 |
Spring Boot 서블릿 연동: Spring과 서블릿의 관계 (2편) (0) | 2023.08.08 |