logo
Published on

Java Servlet과 JSP 이해하기

Authors
  • avatar
    Name
    Geurim
    Twitter

Java 웹 애플리케이션 개발의 기초가 되는 Servlet과 JSP에 대해 알아보겠습니다. 이 두 기술은 Java EE(Enterprise Edition)의 핵심 구성요소로, 동적인 웹 페이지를 생성하는 데 사용됩니다.

Servlet이란?

Servlet은 Java를 사용하여 웹 서버에서 동적인 콘텐츠를 생성하는 서버 사이드 프로그램입니다. HTTP 요청을 받아 처리하고, HTTP 응답을 생성하는 Java 클래스라고 할 수 있습니다.

Servlet의 특징

  • 플랫폼 독립적: Java로 작성되어 JVM이 설치된 모든 환경에서 실행 가능합니다.
  • 성능: 스레드 기반으로 동작하여 CGI보다 효율적입니다.
  • 보안: Java의 보안 관리자가 제공하는 보안 기능을 활용할 수 있습니다.

Servlet 생명주기

Servlet은 다음과 같은 생명주기를 가집니다:

  1. init(): Servlet이 메모리에 로드될 때 한 번 실행
  2. service(): 클라이언트 요청이 올 때마다 실행
  3. 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 파일이 처음 요청되면:

  1. JSP 파일이 Servlet Java 소스 코드로 변환
  2. Java 소스 코드가 클래스 파일로 컴파일
  3. 클래스 파일이 메모리에 로드되어 실행

이 과정은 최초 요청 시 한 번만 수행되며, 이후 요청에서는 이미 컴파일된 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가 활용되고 있으며, 웹 애플리케이션의 동작 원리를 깊이 이해하는 데 큰 도움이 됩니다.