1. 서블릿(Servlet)이란?
서블릿(Servlet)은 Java 기반의 웹 애플리케이션 프로그래밍 기술로, 클라이언트의 요청을 처리하고 동적인 웹 페이지를 생성하는 서버측 프로그램입니다. 서블릿은 javax.servlet.http.HttpServlet 클래스를 상속받아 구현되며, Java EE(Enterprise Edition) 스펙의 일부로 정의되어 있습니다.
1.1 서블릿의 기본 개념
1.1.1 웹 서버와 WAS의 관계
- 웹 서버(Web Server): 정적 리소스(HTML, CSS, 이미지 등) 제공
- WAS(Web Application Server): 서블릿 컨테이너를 포함하여 동적 컨텐츠 처리
- 예: Tomcat, JBoss, WebLogic, WebSphere 등
- 동작 과정: 클라이언트 요청 → 웹 서버 → WAS → 서블릿 컨테이너 → 서블릿
1.1.2 서블릿 컨테이너 아키텍처
1
2
3
4
5
| [클라이언트] → [웹 서버] → [WAS (서블릿 컨테이너)]
↓
[서블릿 인스턴스 풀]
↓
[스레드 풀 관리]
|
1.2 서블릿의 특징
1.2.1 플랫폼 독립성
- 자바 기반: Write Once, Run Anywhere 철학 준수
- 크로스 플랫폼: 다양한 운영체제에서 동일하게 동작
- 이식성: 다른 WAS로 손쉽게 이전 가능
1.2.2 서버측 처리
- 서버 자원 활용: 데이터베이스 연동, 파일 처리 등 서버 자원 직접 사용
- 보안성: 비즈니스 로직이 서버에서 실행되어 클라이언트에 노출되지 않음
- 확장성: 다양한 비즈니스 요구사항 구현 가능
1.2.3 상태 관리
1
2
3
4
5
6
7
| // 세션 관리 예시
HttpSession session = request.getSession();
session.setAttribute("user", userObject);
// 쿠키 관리 예시
Cookie cookie = new Cookie("username", "홍길동");
response.addCookie(cookie);
|
1.2.4 효율적인 자원 관리
- 싱글톤 패턴: 서블릿 인스턴스는 한 번만 생성되어 재사용
- 스레드 풀: 요청마다 새로운 스레드 할당으로 동시 처리 지원
- 메모리 관리: 컨테이너가 자동으로 메모리 관리
1.3 서블릿의 고급 특징
1.3.1 비동기 처리 지원
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| @WebServlet(urlPatterns = "/async", asyncSupported = true)
public class AsyncServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
AsyncContext asyncContext = req.startAsync();
asyncContext.start(() -> {
// 비동기 작업 수행
try {
// 긴 작업 처리
Thread.sleep(1000);
// 응답 처리
asyncContext.complete();
} catch (InterruptedException e) {
// 예외 처리
}
});
}
}
|
2. JSP(JavaServer Pages)란?
JSP는 HTML 코드 안에 자바 코드를 삽입하여 동적인 웹 페이지를 생성하는 기술입니다. 서블릿의 단점인 HTML 작성의 불편함을 보완하기 위해 만들어졌습니다.
2.1 JSP의 특징
- HTML 중심: HTML 코드에 자바 코드를 삽입하는 형태
- 서블릿 변환: JSP는 실행 시 서블릿으로 변환됨
- 쉬운 개발: HTML 작성이 용이함
- 내장 객체: request, response 등 주요 객체가 미리 선언되어 있음
2.2 JSP 기본 문법
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>JSP 예제</title>
</head>
<body>
<%-- JSP 주석입니다 --%>
<%!
// 선언부: 멤버 변수/메소드 선언
String message = "안녕하세요";
%>
<%
// 스크립틀릿: 자바 코드 작성
for(int i = 1; i <= 3; i++) {
%>
<h<%= i %>><%=message%></h<%= i %>>
<%
}
%>
<%-- 표현식: 값을 출력 --%>
<p>현재 시간: <%= new java.util.Date() %></p>
</body>
</html>
|
3. 서블릿과 JSP의 차이점
3.1 주요 차이점
구분 | 서블릿 | JSP |
---|
작성 방식 | 자바 코드 안에 HTML | HTML 안에 자바 코드 |
장점 | 자바 로직 처리에 적합 | 화면 구현에 적합 |
변환 과정 | 직접 실행 | 서블릿으로 변환 후 실행 |
용도 | 비즈니스 로직 처리 | 화면 표현 |
3.2 MVC 패턴에서의 역할
현대 웹 개발에서는 MVC 패턴을 적용하여:
- 서블릿: Controller 역할 (요청 처리 및 흐름 제어)
- JSP: View 역할 (화면 표현)
- 자바 클래스: Model 역할 (비즈니스 로직 및 데이터)
4. 실제 활용 예시
4.1 서블릿을 이용한 폼 데이터 처리
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| @WebServlet("/register")
public class RegisterServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 폼 데이터 받기
String username = request.getParameter("username");
String email = request.getParameter("email");
// 비즈니스 로직 처리
UserService userService = new UserService();
boolean success = userService.registerUser(username, email);
// 결과에 따른 페이지 이동
if (success) {
request.setAttribute("message", "등록 성공!");
request.getRequestDispatcher("/success.jsp").forward(request, response);
} else {
response.sendRedirect("/error.jsp");
}
}
}
|
4.2 JSP를 이용한 결과 표시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>등록 결과</title>
</head>
<body>
<h1>등록 결과</h1>
<p>${message}</p>
<% if(request.getAttribute("message") != null) { %>
<p>처리 결과: <%= request.getAttribute("message") %></p>
<% } %>
</body>
</html>
|
참고 자료
- Java EE 공식 문서
- Tomcat 공식 문서
- Head First Servlets & JSP