Servlet 이란?
Servlet은 Java 클래스의 일종으로, 웹 서버에서 실행되는 서블릿 컨테이너(Servlet Container) 내에서 동작하며, 클라이언트(주로 웹 브라우저)의 요청을 처리하고 응답을 생성합니다. Servlet은 HTTP 요청 및 응답을 처리하기 위해 HTTP 프로토콜을 사용하며, 데이터베이스와의 상호작용, 비즈니스 로직 처리, 데이터 연산 등을 수행하여 클라이언트에게 동적인 HTML 페이지나 JSON 데이터를 전달할 수 있습니다.
Servlet의 주요 개념
- 서블릿 컨테이너: Servlet은 서블릿 컨테이너(Servlet Container)라고 불리는 서버 환경에서 동작합니다. 서블릿 컨테이너는 웹 서버와 함께 작동하며, 클라이언트의 요청을 받아 적절한 서블릿 인스턴스를 호출하고, 응답을 생성하여 클라이언트에게 전달하는 역할을 합니다. Tomcat, Jetty 등이 대표적인 서블릿 컨테이너입니다.
- 라이프 사이클: Servlet은 일정한 **생명주기(Lifecycle)**를 갖습니다. 컨테이너는 Servlet이 처음 요청을 받을 때 생성하고, 종료 시점에 삭제합니다.
- HttpServlet: 대부분의 웹 애플리케이션에서 사용하는 Servlet 클래스는 HttpServlet 클래스입니다. HttpServlet은 javax.servlet.http.HttpServlet을 상속하여 생성하며, HTTP 요청을 처리하기 위해 주로 doGet()과 doPost() 메서드를 오버라이드하여 요청을 처리합니다.
Servlet의 주요 특징
- HTTP 요청 및 응답 처리: Servlet은 HTTP GET, POST, PUT, DELETE 등의 요청을 처리하여 다양한 응답을 생성할 수 있습니다.
- Java 코드로 구현: Servlet은 Java 코드로 작성되며, javax.servlet과 javax.servlet.http 패키지를 통해 요청과 응답 객체를 사용할 수 있습니다.
- 컨트롤러 역할: Servlet은 클라이언트의 요청을 받아 필요한 로직을 처리한 뒤, JSP와 같은 뷰 페이지로 데이터를 전달합니다. 따라서 MVC 패턴에서 컨트롤러 역할을 수행할 수 있습니다.

Servlet의 기본 구조
Servlet은 Java 클래스이기 때문에 HttpServlet을 상속받아 만들어지며, 요청을 처리하기 위해 doGet()과 doPost() 메서드를 오버라이드합니다.
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 MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
response.getWriter().println("<h1>Hello, Servlet!</h1>");
}
}
Servlet의 동작 과정
Servlet은 클라이언트 요청이 있을 때마다 컨테이너에 의해 호출되고, 다음과 같은 절차로 동작합니다.
- 클라이언트 요청: 사용자가 웹 브라우저에서 특정 URL로 요청을 보냅니다. 이 요청은 웹 서버를 통해 서블릿 컨테이너로 전달됩니다.
- 요청 처리: 서블릿 컨테이너는 URL 매핑을 통해 요청을 처리할 적절한 서블릿을 찾고, service() 메서드를 호출합니다. 이때 요청 방식에 따라 doGet() 또는 doPost() 메서드를 호출하여 요청을 처리합니다.
- 응답 생성: Servlet은 요청에 따라 데이터를 처리하고, HTML, JSON 등 형식의 응답을 생성하여 클라이언트에게 전송합니다.
- 응답 반환: 클라이언트는 Servlet에서 생성된 응답을 웹 페이지 또는 데이터로 받아 볼 수 있습니다.
Servlet과 JSP의 관계
Servlet은 주로 비즈니스 로직과 데이터를 처리하는 컨트롤러 역할을 수행하며, JSP는 사용자에게 보여줄 프론트엔드 화면을 생성하는 역할을 수행합니다. 이러한 구조에서 Servlet은 데이터를 처리한 후 JSP 페이지로 전달하여 최종 HTML 응답을 생성하는 방식으로, MVC 패턴을 통해 역할을 분리하는 것이 일반적입니다.
- Java Servlet API Documentation - Java Servlet 공식 API 문서
- Java EE Tutorial (Oracle) - Java EE 튜토리얼, Servlet 관련 부분 포함
JSP (JavaServer Pages) 란?
JSP는 HTML 내에 Java 코드를 삽입하여 동적인 웹 페이지를 생성하는 기술입니다. JSP는 웹 페이지의 레이아웃이나 디자인을 정의하는 동시에 Java 코드를 삽입하여 서버에서 데이터를 처리하고 표시할 수 있게 합니다. JSP는 Servlet으로 변환되어 실행되기 때문에, 기본적으로 Servlet의 기능을 확장한 형태로 볼 수 있습니다.
JSP의 주요 특징
- HTML과 Java의 결합: JSP는 HTML 내에 Java 코드를 삽입할 수 있는 방식으로, 동적인 콘텐츠를 HTML에 손쉽게 통합할 수 있습니다. 이를 통해 정적인 HTML과 동적인 데이터를 함께 표현할 수 있습니다.
- 서버 측에서 동작: JSP는 클라이언트가 요청을 보내면 서버에서 실행되고, 최종적으로 HTML 형태로 클라이언트에게 전송됩니다. 클라이언트는 JSP 페이지가 아닌 JSP가 생성한 HTML 페이지를 받아보게 됩니다.
- Servlet으로 변환: JSP는 실제로 Servlet으로 변환되어 실행됩니다. 즉, JSP 파일은 최초 요청 시 서블릿 코드로 컴파일되고, 그 이후에는 컴파일된 서블릿이 사용됩니다. 따라서 JSP와 Servlet은 본질적으로 동일한 기능을 수행할 수 있으며, JSP는 Servlet의 문법을 좀 더 간편하게 만든 형식이라고 볼 수 있습니다.
- MVC 패턴에서 View 역할: JSP는 MVC 패턴에서 주로 View 역할을 수행합니다. 컨트롤러(Servlet)가 데이터를 처리하고, 그 데이터를 JSP로 전달하면, JSP는 HTML 페이지를 생성하여 사용자에게 데이터를 표시합니다.
JSP의 기본 구조
JSP 페이지에서는 HTML과 함께 <% %> 문법을 사용하여 Java 코드를 작성할 수 있습니다.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>JSP Example</title>
</head>
<body>
<h1>Hello, JSP!</h1>
<%
String name = "홍길동";
out.println("<p>안녕하세요, " + name + "님!</p>");
%>
</body>
</html>
JSP의 기본 문법 요소
JSP는 HTML 코드 내에 Java 코드를 삽입할 수 있도록 여러 가지 특별한 태그를 제공합니다. 이 태그들을 통해 Java 코드를 작성하고, 동적인 콘텐츠를 HTML에 삽입할 수 있습니다.
1. 스크립트릿(Scriptlet) <% ... %>
스크립트릿은 JSP에서 Java 코드를 작성할 때 사용되는 기본 문법입니다. <%와 %> 사이에 Java 코드를 삽입하여, 서버에서 실행할 수 있습니다.
<%
String name = "홍길동";
out.println("안녕하세요, " + name + "님!");
%>
2. 표현식(Expression) <%= ... %>
표현식은 값을 출력할 때 사용하며, 표현식 내의 값을 HTML로 바로 출력합니다. out.println() 메서드 없이 간단하게 사용할 수 있습니다.
<p>현재 시간: <%= new java.util.Date() %></p>
3. 선언문(Declaration) <%! ... %>
선언문은 JSP 페이지에서 사용될 메서드나 변수를 선언할 때 사용합니다. 선언된 변수나 메서드는 JSP 페이지 내에서 사용할 수 있습니다.
<%!
public String getGreeting() {
return "Hello, JSP!";
}
%>
<p><%= getGreeting() %></p>
4. 주석(Comment) <%-- ... --%>
JSP 주석은 HTML 소스 코드에 포함되지 않고 서버에서만 보이는 주석입니다.
<%-- 이 부분은 주석으로, HTML 소스에 나타나지 않습니다 --%>
5. JSP 페이지 디렉티브 (Directives) <%@ ... %>
디렉티브는 JSP 페이지의 설정을 정의하는 데 사용됩니다. JSP 페이지 상단에 작성되며, 페이지의 속성을 설정하거나 다른 리소스를 포함하는 등의 역할을 합니다.
page 디렉티브
page 디렉티브는 JSP 페이지의 전반적인 속성을 정의합니다.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
include 디렉티브
include 디렉티브는 다른 JSP 페이지나 HTML 파일을 포함할 때 사용됩니다. 주로 헤더나 푸터와 같은 공통 영역을 포함할 때 유용합니다.
<%@ include file="header.jsp" %>
taglib 디렉티브
taglib 디렉티브는 커스텀 태그 라이브러리를 사용할 때 필요합니다. JSP 표준 태그 라이브러리(JSTL)과 같은 외부 태그 라이브러리를 JSP 페이지에서 사용하기 위해 선언합니다.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
JSP 내장 객체 (Implicit Objects)
JSP는 개발자가 자주 사용하는 객체들을 기본적으로 제공하여 편리하게 사용할 수 있게 합니다. 이러한 객체들은 내장 객체라고 하며, JSP 페이지에서 직접 사용할 수 있습니다.
request
- 클라이언트의 요청 정보를 담고 있는 객체로, 폼 데이터와 쿼리 파라미터 등을 가져올 수 있습니다.
<p>사용자 이름: <%= request.getParameter("username") %></p>
- 요청 파라미터 가져오기
- 요청 헤더 가져오기
- 클라이언트 정보 가져오기
- 요청 디스패칭과 포워딩
response: 서버의 응답 정보를 담고 있는 객체로, 클라이언트에게 전송할 정보나 응답 상태를 설정할 수 있습니다.
response.setContentType("text/html;charset=UTF-8");
out: 클라이언트에게 데이터를 출력하는 데 사용되는 객체로, HTML 콘텐츠를 출력할 수 있습니다.
out.println("Hello, JSP!");
session: 사용자 세션을 관리하는 객체로, 사용자별로 데이터를 저장하고 유지할 수 있습니다.
session.setAttribute("username", "홍길동");
application: 애플리케이션 전역에서 사용할 수 있는 객체로, 모든 사용자에게 공유되는 데이터를 저장할 수 있습니다.
application.setAttribute("appName", "MyJSPApp");
- config, pageContext, exception: JSP에서 페이지와 애플리케이션 설정을 가져오거나 예외를 처리할 때 사용하는 객체들입니다.
| 내장 객체 | 설명 |
| request | 클라이언트 요청 정보 (HTTP 요청 데이터, 폼 데이터 등) |
| response | 서버 응답 정보 (HTTP 응답 데이터, 리다이렉트 등) |
| out | 클라이언트에게 데이터 출력 |
| session | 사용자 세션 관리 |
| application | 애플리케이션 전역 데이터 관리 |
| config | 서블릿 설정 정보 |
| pageContext | JSP 페이지의 컨텍스트 관리 |
| page | 현재 JSP 페이지 (this와 동일) |
| exception | 예외 정보 (오류 페이지에서 사용) |
JSP 폼 데이터 처리
기본적인 JSP 폼 데이터 처리 과정
- HTML 폼 작성: 클라이언트 측에서 데이터를 입력할 수 있는 HTML 폼을 만듭니다.
- 폼 데이터 전송: 사용자가 폼을 제출하면 서버로 데이터가 전송됩니다.
- JSP에서 데이터 받기: JSP 페이지에서 request.getParameter()를 사용하여 데이터를 가져와 처리합니다.
예제: JSP에서 폼 데이터 처리
1. HTML 폼 작성 (form.jsp)
아래는 사용자가 이름과 나이를 입력하고 제출할 수 있는 HTML 폼입니다. 이 폼은 hello.jsp 페이지로 데이터를 전송합니다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>폼 데이터 전송</title>
</head>
<body>
<h2>폼 데이터 전송</h2>
<form action="hello.jsp" method="post">
이름: <input type="text" name="username"><br>
나이: <input type="number" name="age"><br>
<input type="submit" value="제출">
</form>
</body>
</html>
2. JSP 페이지에서 데이터 받기 (hello.jsp)
아래는 form.jsp에서 전송된 데이터를 받아 출력하는 hello.jsp 페이지입니다.
<%@ page contentType="text/html;charset=UTF-8" %>
<!DOCTYPE html>
<html lang="ko">
<head>
<title>폼 데이터 처리 결과</title>
</head>
<body>
<h2>폼 데이터 처리 결과</h2>
<%
// 폼 데이터 가져오기
String username = request.getParameter("username"); // 이름 가져오기
String age = request.getParameter("age"); // 나이 가져오기
// 폼 데이터가 없는 경우 기본 값 설정
if (username == null || username.isEmpty()) {
username = "손님";
}
if (age == null || age.isEmpty()) {
age = "알 수 없음";
}
%>
<p>안녕하세요, <%= username %>님!</p>
<p>나이: <%= age %>세</p>
</body>
</html>
폼 데이터 처리 시 유의 사항
- 빈 값 확인: 사용자가 입력하지 않거나 잘못된 데이터를 입력했을 때 기본값이나 오류 메시지를 출력하는 로직을 추가하는 것이 좋습니다.
- 데이터 타입 변환: getParameter() 메서드는 모든 데이터를 문자열로 반환합니다. 숫자와 같은 데이터를 처리할 때는 형변환이 필요합니다. 예를 들어, 나이를 int로 변환하려면 Integer.parseInt(request.getParameter("age"))를 사용할 수 있습니다.
int age = Integer.parseInt(request.getParameter("age"));
1. POST와 GET 방식 차이: method="post"와 method="get"은 전송 방식이 다릅니다. POST 방식은 데이터가 HTTP 메시지의 본문에 포함되기 때문에 URL에 노출되지 않으며, 주로 로그인이나 개인정보 입력 시 사용됩니다. 반면 GET 방식은 데이터를 URL 쿼리 스트링으로 전송하기 때문에, URL에 노출되며 데이터 전송량이 제한적입니다.
2. Apache-Tomcat 9 이전 버전 다국어처리 : Tomcat 9 이전 버전에서는 다국어 처리를 위해 서버와 애플리케이션의 문자 인코딩 설정을 수동으로 지정해야 했습니다. Tomcat 10 이후 버전에서는 기본 인코딩 설정이 UTF-8로 개선되어, 다국어 처리 시 인코딩 문제 발생 가능성이 줄어들었습니다. `
request.setCharacterEncoding("utf-8");'Backend > Web' 카테고리의 다른 글
| 인텔리제이 Apache Tomcat 설정하기 (0) | 2024.11.08 |
|---|---|
| [JSP] JDBC 연동 (3) | 2024.11.08 |
| [JavaScript] DOM 폼 (1) | 2024.11.06 |
| [JavaScript]배열 / 객체 / 내장클래스 (3) | 2024.11.06 |
| [JavaScript] 기본문법 / 함수 / 이벤트 (1) | 2024.11.06 |