본문 바로가기

Servlet, JSP

JSP란? 그리고 JSP와 Servlet의 차이는?


1. JSP란 무엇인가?

JSP는 자바 기반의 웹 애플리케이션에서 주로 사용자에게 보여지는 화면(View)을 만들기 위해 사용되는 서버 측 기술입니다. 기본적인 HTML, CSS, JavaScript 코드에 더해 <% ... %>나 <%= ... %> 같은 JSP 태그를 사용하여 자바 코드를 삽입할 수 있습니다. 이를 통해 웹 서버에서 동적으로 데이터를 처리하고 그 결과를 HTML 형태로 클라이언트(웹 브라우저)에 전송할 수 있습니다.

주요 특징

  • HTML 기반으로 작성하여 뷰(View) 제작이 직관적이다.
  • 자바 라이브러리를 그대로 활용해 비즈니스 로직을 수행할 수 있다.
  • 웹 컨테이너(예: Tomcat)에서 JSP를 서블릿(Servlet)으로 변환 후 실행한다.

2. JSP와 Servlet의 관계

결론부터 말하면, JSP는 결국 Servlet으로 변환되어 실행됩니다.

JSP 파일을 서버에 요청하면, 웹 컨테이너(예: 톰캣)가 이 JSP 파일을 Servlet 소스 코드(.java)로 변환하고 컴파일하여 최종적으로 실행 가능한 클래스 파일(.class)로 만듭니다. 이 과정은 딱 한 번만 일어나며, 이후에는 변환된 Servlet이 요청을 처리합니다.

따라서 개발자 입장에서는 "JSP는 Servlet과 비슷한 역할을 하지만, 화면을 구성하는 데 더 편리한 도구"라고 이해하시면 됩니다.


3. JSP의 장점

JSP의 가장 큰 역할은 클라이언트에게 보여줄 화면(View)을 만드는 것입니다.

  • HTML 기반의 작성 용이성: 순수한 자바 코드로 HTML을 만드는 Servlet과 달리, JSP는 HTML 안에 자바 코드를 삽입하는 방식이라 화면 디자인과 데이터 처리를 동시에 효율적으로 할 수 있습니다.
  • 동적 페이지 생성: 사용자의 요청이나 DB 데이터에 따라 페이지의 내용이 달라지는 동적인 웹 페이지를 쉽게 만들 수 있습니다. 예를 들어, 사용자의 이름을 받아 "안녕하세요, [사용자 이름]님!"이라고 표시하는 것처럼요.

일반적인 웹 애플리케이션 개발에서는 MVC(Model-View-Controller) 패턴을 따르는데요, 이때 Servlet은 비즈니스 로직을 처리하는 Controller 역할을, JSP는 사용자에게 보여주는 View 역할을 주로 담당합니다. 이렇게 역할을 분담하면 코드가 훨씬 깔끔하고 유지보수하기 쉬워집니다.


4. JSP 동작 흐름

  1. 클라이언트가 .jsp 파일에 HTTP 요청을 보낸다.
  2. 컨테이너가 해당 JSP를 자바 서블릿 소스 파일로 변환한다.
  3. 변환된 소스 파일을 컴파일하여 서블릿 클래스를 생성한다.
  4. 생성된 서블릿이 요청을 처리하고, 결과 HTML을 생성하여 클라이언트에 응답한다.
  5. 이후 동일한 JSP 요청은 소스 변환 없이 바로 컴파일된 서블릿이 실행된다.

5. 예제 코드 분석

아래 세 가지 파일을 통해 JSP와 Servlet의 작동 방식을 비교해보겠습니다.

5.1 Test.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
   pageEncoding="UTF-8"%>
<%!
    // 선언부: 클래스 변수 및 메서드 정의
    int n;
    void info() {
        System.out.println("정보 출력");
    }
%>
<%
    // 스크립틀릿: _jspService() 내부 로직
    int x = 10;
%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
</head>
<body>
    나 JSP여!<br>
    x = <%= x %>
</body>
</html>

설명

  • <%! … %> 영역에 선언된 변수와 메서드는 변환된 서블릿 클래스의 멤버로 들어갑니다.
  • <% … %> 영역의 코드는 _jspService() 메서드 내부에 삽입되어 매 요청 시 실행됩니다.
  • <%= x %>는 out.print(x);로 변환되어 페이지에 값을 출력합니다.

5.2 변환된 Test_jsp.java

package org.apache.jsp;

import jakarta.servlet.*;
import jakarta.servlet.http.*;
import jakarta.servlet.jsp.*;

public final class Test_jsp extends org.apache.jasper.runtime.HttpJspBase {
    // JSP 선언부가 클래스 멤버로 들어감
    int n;
    void info() {
        System.out.println("정보 출력");
    }

    public void _jspService(HttpServletRequest request, HttpServletResponse response)
            throws java.io.IOException, ServletException {
        response.setContentType("text/html; charset=UTF-8");
        JspWriter out = ...;
        // 스크립틀릿 코드
        int x = 10;
        // HTML 출력
        out.write("<!DOCTYPE html>...");
        out.write("나 JSP여!");
        out.write("x = " + x);
    }
}

설명

  • JSP 선언부와 스크립틀릿이 각각 클래스 멤버와 _jspService() 내부로 매핑됩니다.
  • HTML 조각들은 out.write() 호출로 변환되며, 동적 부분만 자바 연산으로 처리됩니다.

5.3 Servlet 예제 TestAction.java

package action;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.*;
import java.io.IOException;

@WebServlet("/TestAction")
public class TestAction extends HttpServlet {
    private static final long serialVersionUID = 1L;

    // 클래스 변수 및 메서드
    int n;
    void info() {
        System.out.println("정보 출력");
    }

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 지역 변수 선언
        int x = 10;
        // 출력
        response.getWriter().print("x = " + x);
    }
}

설명

  • 순수 자바 코드로 구성되어 있어 HTML 출력은 response.getWriter().print()로 처리합니다.
  • 뷰와 로직이 한 클래스에 섞여 있기 때문에 복잡한 UI를 작성하기에는 코드 가독성이 떨어집니다.

6. JSP vs Servlet


구분 JSP (JavaServer Pages) Servlet
작성 방식 HTML 안에 자바 코드 삽입 순수 자바 코드로 HTML 출력
주요 역할 사용자에게 보여주는 화면(View) 구성 HTTP 요청/응답 처리 및 로직(Controller)
개발 편의성 화면 구성이 훨씬 쉽고 직관적 HTML 작성이 번거롭고 가독성이 낮음
동작 방식 최초 요청 시 Servlet으로 변환되어 실행 요청 시 자체적으로 컴파일 및 실행

오늘 다룬 내용을 통해 JSP의 역할과 Servlet과의 관계를 명확하게 이해하는 데 도움이 되었기를 바랍니다. JSP와 Servlet은 서로 보완하며 웹 애플리케이션을 만드는 중요한 기술입니다.