1. JSP란?
JSP란 Jakarta Server Pages의 약자로 서버 측에서 실행되는 템플릿 엔진이다. 나는 처음에는 이것이 별도의 프로그래밍 언어인줄 알았다. 그러나 이는 단순 HTML 코드에 Java 코드가 삽입된 형태의 방식을 뜻하는 것이었다. 이와 비슷한 것으로는 ASP(Active Server Pages), PHP(Hypertext Preprocessor)가 있는데 이들 역시 서버 측에서 실행되는 서버 사이드 스크립트 언어이다. 현재는 JSP보단 자바의 공식 템플릿 엔진인 Thymeleaf가 더 많이 사용되는 추세이지만 아직 과거부터 서비스된 페이지에는 JSP가 사용되고 있는 것을 찾아볼 수 있다.
- https://www.scourt.go.kr/portal/main.jsp - 대한민국 법원 대국민서비스
- https://www.ecar.go.kr/Index.jsp - 자동차민원 대국민포털
더 자세히 다루긴 하겠지만 일단 간단한 예제를 보면 다음과 같다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String msg = "안녕하세요!";
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP 페이지</title>
</head>
<body>
<h1><%= msg %></h1>
</body>
</html>
2. Servlet(서블릿)이란?
JSP도 결국에는 Servlet으로 변환되어 실행된다. Servlet이란 Java 기반의 동적 웹 프로그래밍에 사용되는 기술로써, 특정한 형태를 지닌 Java 클래스 파일을 뜻하는 말이다. Servlet은 매개변수로 HttpServletRequest와 HttpServletResponse 타입의 변수 2가지를 받는데 이를 사용하여 클라이언트의 요청을 받고 처리하여 다시 클라이언트로 응답을 보내는 방식으로 동작한다. HTML 코드에 Java가 삽입된 파일인 JSP와는 달리 Servlet은 Java 코드 안에 HTML이 삽입된 형태다. 그렇기 때문에 순수 Servlet에서 HTML 응답 페이지를 생성하려면 가독성이 매우 떨어진다는 단점을 가지고 있다. 추후 별도로 다루긴 하겠지만 이러한 단점으로 인해 MVC 패턴을 적용시켜 View로 JSP 파일을 사용하고 Controller로 Servlet을 사용하는 방법이 많이 사용되는 것이다(Servlet을 Container로 사용하면 HTML 코드를 삽입할 필요 없이 응답 데이터만 반환하면 되므로!).
각각의 서블릿은 Spring의 Controller처럼 특정한 URL에 매핑되어 있다. 매핑된 URL로 Get 또는 Post 요청을 받으면 각 서블릿 파일에 정의된 doGet( ) 또는 doPost( ) 메서드가 실행된다. 매핑된 URL에 따라 적절한 서블릿을 찾아서 실행해주는 것은 서블릿 컨테이너가 해주는데 이 서블릿 컨테이너가 서블릿의 생성, 실행, 삭제와 같은 서블릿 실행주기를 관리하는 것이다. 그렇다면 이 서블릿 컨테이너의 역할은 무엇이 해주는 것일까? 이는 바로 WAS(Web Application Server)가 해주는 것이다. WAS의 종류로는 Apache Tomcat, Jetty, Undertow 등이 있는데 이중 Apache Tomcat이 가장 널리 사용되고 있다.
3. JSP vs Servlet
시간의 순서로 봤을 때 Servlet은 JSP보다 먼저 사용된 것으로 추후 JSP가 등장한 것이다. 그렇기 때문에 JSP가 결국에는 Servlet으로 변환되어 실행된다는 것인데 이들의 차이점은 다음과 같다.
JSP | Servlet | |
정의 | HTML 코드 안에 Java 코드가 삽입 | Java 코드 안에 HTML 코드가 삽입 |
확장자 | .jsp | .java(컴파일 후에는 .class) |
주요 목적 | View(화면 출력)에 적합 | Controller(로직 처리)에 적합 |
가독성 | HTML에 가까워 가독성 높음 | HTML 코드가 Java로 출력되기에 가독성 낮음 |
컴파일 | 웹 컨테이너(서블릿 컨테이너)가 JSP를 Servlet으로 변환하여 실행 | 직접 Java 파일로 작성 후 컴파일 |
위 이유로 인해 단순 하나만 사용하는 것이 아닌 MVC 패턴을 적용하여 JSP를 View로, Servlet을 Container로 사용하는 방법이 자주 사용된다는 것이다.
4. 기본 예제
- 전송된 Form 데이터를 화면에 출력하는 예제
welcome.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP 페이지</title>
</head>
<body>
<div align="center">
<form action="welcome_process.jsp" method="post">
<div>
<label>이름</label>
<input type="text" name="name">
</div>
<div>
<label>생년월일</label>
<input type="text" name="birth">
</div>
<button>완료</button>
</form>
</div>
</body>
</html>
welcome_process.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String name = request.getParameter("name");
String birth = request.getParameter("birth");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP 처리</title>
</head>
<body>
<div align="center">
<h1>환영합니다!</h1>
<h3><%= name %></h3>
<h3><%= birth %></h3>
</div>
</body>
</html>
4-1. 위 예제를 Servlet으로 한 예제
welcome.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP 페이지</title>
</head>
<body>
<div align="center">
<form action="welcome" method="post"> <!-- 달라진 부분 -->
<div>
<label>이름</label>
<input type="text" name="name">
</div>
<div>
<label>생년월일</label>
<input type="text" name="birth">
</div>
<button>완료</button>
</form>
</div>
</body>
</html>
WelcomeServlet.java
package test;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/welcome")
public class WelcomeServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
String birth = request.getParameter("birth");
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
out.print("<h1>환영합니다!</h1>");
out.print("<h3>"+name+"</h3>");
out.print("<h3>"+birth+"</h3>");
}
}
결과는 동일하지만 위 예제처럼 서블릿에서 HTML 페이지를 출력하려면 단순한 예제임에도 불구하고 복잡한 형식을 갖는다는 것을 확인할 수 있다. 이러한 이유로 인해 JSP는 View로, Servlet은 Controller로 사용하는 것이다.
'[Programming Language] > [JSP]' 카테고리의 다른 글
[JSP] 데이터 주고 받는 방법(form, Fetch API) (0) | 2025.05.19 |
---|---|
[JSP] 태그 종류(scriptlet, directive, declaration, expression, comment, action) (0) | 2025.05.15 |