- Published on
Java Servlet과 JSP 이해하기
- Authors
- Name
- Geurim
Java 웹 애플리케이션 개발의 기초가 되는 Servlet과 JSP에 대해 알아보겠습니다. 이 두 기술은 Java EE(Enterprise Edition)의 핵심 구성요소로, 동적인 웹 페이지를 생성하는 데 사용됩니다.
Servlet이란?
Servlet은 Java를 사용하여 웹 서버에서 동적인 콘텐츠를 생성하는 서버 사이드 프로그램입니다. HTTP 요청을 받아 처리하고, HTTP 응답을 생성하는 Java 클래스라고 할 수 있습니다.
Servlet의 특징
- 플랫폼 독립적: Java로 작성되어 JVM이 설치된 모든 환경에서 실행 가능합니다.
- 성능: 스레드 기반으로 동작하여 CGI보다 효율적입니다.
- 보안: Java의 보안 관리자가 제공하는 보안 기능을 활용할 수 있습니다.
Servlet 생명주기
Servlet은 다음과 같은 생명주기를 가집니다:
- init(): Servlet이 메모리에 로드될 때 한 번 실행
- service(): 클라이언트 요청이 올 때마다 실행
- destroy(): Servlet이 메모리에서 해제될 때 한 번 실행
기본 Servlet 구현
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class HelloServlet extends HttpServlet {
@Override
public void init() throws ServletException {
// 초기화 코드
System.out.println("Servlet 초기화");
}
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>Hello Servlet</title></head>");
out.println("<body>");
out.println("<h1>안녕하세요, Servlet입니다!</h1>");
out.println("</body>");
out.println("</html>");
}
@Override
public void destroy() {
// 정리 코드
System.out.println("Servlet 종료");
}
}
web.xml 설정
Servlet을 웹 애플리케이션에서 사용하려면 web.xml에 매핑 정보를 설정해야 합니다:
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.example.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
또는 Servlet 3.0 이상에서는 애노테이션을 사용할 수 있습니다:
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
// ...
}
JSP(JavaServer Pages)란?
JSP는 HTML 내에 Java 코드를 삽입하여 동적인 웹 페이지를 생성하는 기술입니다. Servlet이 Java 코드 안에 HTML을 작성하는 방식이라면, JSP는 HTML 안에 Java 코드를 작성하는 방식입니다.
JSP의 특징
- 개발 편의성: HTML과 Java 코드를 분리하여 개발이 용이합니다.
- 자동 컴파일: JSP는 최초 요청 시 자동으로 Servlet으로 변환됩니다.
JSP 구성 요소
1. 지시자(Directive)
JSP 페이지에 대한 설정 정보를 지정합니다:
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<%@ include file="header.jsp" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
2. 스크립트 요소
선언문(Declaration)
<%!
private int count = 0;
public String getGreeting() {
return "안녕하세요!";
}
%>
스크립틀릿(Scriptlet)
<%
String name = request.getParameter("name");
if (name != null) {
out.println("환영합니다, " + name + "님!");
}
%>
표현식(Expression)
<p>현재 시간: <%= new java.util.Date() %></p>
<p>방문자 수: <%= ++count %></p>
3. 액션 태그
<jsp:include page="footer.jsp" />
<jsp:forward page="result.jsp" />
<jsp:useBean id="user" class="com.example.User" scope="session" />
JSP 내장 객체
JSP는 다음과 같은 내장 객체를 제공합니다:
- request: HttpServletRequest 객체
- response: HttpServletResponse 객체
- session: HttpSession 객체
- application: ServletContext 객체
- out: JspWriter 객체
- config: ServletConfig 객체
- page: 현재 JSP 페이지 객체
- pageContext: PageContext 객체
- exception: 예외 객체 (에러 페이지에서만 사용)
실제 JSP 예제
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>회원 목록</title>
</head>
<body>
<h1>회원 목록</h1>
<%
List<Member> members = (List<Member>) request.getAttribute("members");
if (members != null && !members.isEmpty()) {
%>
<table border="1">
<tr>
<th>ID</th>
<th>이름</th>
<th>이메일</th>
</tr>
<% for (Member member : members) { %>
<tr>
<td><%= member.getId() %></td>
<td><%= member.getName() %></td>
<td><%= member.getEmail() %></td>
</tr>
<% } %>
</table>
<%
} else {
%>
<p>등록된 회원이 없습니다.</p>
<%
}
%>
</body>
</html>
Servlet과 JSP의 관계
JSP는 결국 Servlet으로 변환되어 실행됩니다. JSP 파일이 처음 요청되면:
- JSP 파일이 Servlet Java 소스 코드로 변환
- Java 소스 코드가 클래스 파일로 컴파일
- 클래스 파일이 메모리에 로드되어 실행
이 과정은 최초 요청 시 한 번만 수행되며, 이후 요청에서는 이미 컴파일된 Servlet이 실행됩니다.
MVC 패턴에서의 활용
실제 프로젝트에서는 Servlet과 JSP를 MVC 패턴으로 구성하여 사용합니다:
- Model: JavaBean, DAO, Service 클래스
- View: JSP 페이지
- Controller: Servlet
MVC 구현 예제
Controller (Servlet)
@WebServlet("/members")
public class MemberController extends HttpServlet {
private MemberService memberService = new MemberService();
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// 비즈니스 로직 처리
List<Member> members = memberService.getAllMembers();
// 데이터를 request에 저장
request.setAttribute("members", members);
// JSP로 포워딩
RequestDispatcher dispatcher =
request.getRequestDispatcher("/WEB-INF/views/memberList.jsp");
dispatcher.forward(request, response);
}
}
Model (JavaBean)
public class Member {
private Long id;
private String name;
private String email;
// getter, setter 메소드
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getEmail() { return email; }
public void setEmail(String email) { this.email = email; }
}
JSTL과 EL 활용
JSP에서 Java 코드를 최소화하기 위해 JSTL(JSP Standard Tag Library)과 EL(Expression Language)을 사용합니다:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:forEach items="${members}" var="member">
<tr>
<td>${member.id}</td>
<td>${member.name}</td>
<td>${member.email}</td>
</tr>
</c:forEach>
<c:if test="${empty members}">
<p>등록된 회원이 없습니다.</p>
</c:if>
세션 관리
Servlet과 JSP에서 세션을 활용한 사용자 상태 관리:
// Servlet에서 세션 생성 및 데이터 저장
HttpSession session = request.getSession();
session.setAttribute("user", userObject);
// JSP에서 세션 데이터 사용
<c:if test="${not empty sessionScope.user}">
<p>환영합니다, ${sessionScope.user.name}님!</p>
</c:if>
필터(Filter) 활용
요청과 응답을 가로채어 전처리/후처리를 수행:
@WebFilter("/*")
public class EncodingFilter implements Filter {
@Override
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
chain.doFilter(request, response);
}
}
마무리
Servlet과 JSP는 Java 웹 개발의 기초 기술입니다. 현재는 Spring Framework와 같은 고수준 프레임워크가 널리 사용되지만, 이러한 프레임워크들도 내부적으로는 Servlet 기반으로 동작합니다. 따라서 Servlet과 JSP의 동작 원리를 이해하는 것은 Java 웹 개발자에게 여전히 중요합니다.
특히 레거시 시스템 유지보수나 Spring을 사용할 수 없는 환경에서는 여전히 Servlet과 JSP가 활용되고 있으며, 웹 애플리케이션의 동작 원리를 깊이 이해하는 데 큰 도움이 됩니다.