자바 웹 어플리케이션 개발을 위해 프레젠테이션 로직(HTML, 클라이언트 사이드 요소를 포함하는 뷰)을 중점적으로 처리하는 페이지
JSP(JavaServer Pages)는 Java 언어가 제공하는 웹 페이지 개발을 위한 기술 중 하나입니다. Java Servlet 기술을 기반으로 하며, 동적 웹 콘텐츠를 생성하기 위해 사용됩니다. HTML과 Java를 사용해 코드를 작성하며, 아래같은 기본 구조를 가집니다.
// 사용자에게 현재 시간을 표시하는 JSP 페이지 예시
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.Date" %> // 사용할 외부 클래스를 추가
<!DOCTYPE html>
<html>
<head>
<title>웹사이트 제목</title>
</head>
<body>
<h1>여기서 시간을 확인하세요!</h1>
<p>현재 시간: <%= new java.util.Date() %></p>
</body>
</html>
이렇게 JSP 페이지를 구현하면 사용자의 요청을 받아서 서버에서 로직을 처리한 뒤 결과를 HTML 형식으로 클라이언트에게 전달합니다.
html, head, body 태그들은 일반 HTML 페이지의 구조를 따릅니다. head 태그 내에는 페이지의 title이 정의되어 있고, body 태그 내에는 실제 페이지 콘텐츠가 들어갑니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Document Title</title>
</head>
<body>
<h1>제목입니다</h1>
<p>여기는 단락입니다. 여기에 웹 페이지의 내용을 작성합니다.</p>
</body>
</html>
<html>
: HTML 문서 최상위 요소
<head>
: 문서의 메타데이터(문서 정보와 설정)를 포함하는 섹션
<meta charset="UTF-8">
: 문서의 문자 인코딩을 UTF-8로 설정
<title>
: 웹 페이지의 제목을 설정
<body>
: 실제 내용이 포함되는 부분
<h1>
: 내용의 제목을 나타내는 태그
<p>
: 단락을 나타내는 태그
페이지 지시자를 사용해서 JSP 페이지에 대한 전반적인 설정을 지정합니다.
<%@ page ... %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*, java.sql.*" errorPage="error.jsp" %>
language: 언어 설정
contentType: 콘텐츠 타입과 문자 인코딩 지정
import: 페이지에서 사용할 JAVA 클래스를 가져오기
errorPage: 에러가 발생했을 때 보여줄 페이지 가져오기
<%! 와 %> 태그
를 사용해서 변수나 메소드를 선언합니다.
<%!
int add(int a, int b) {
return a + b;
}
%>
<%=와 %> 태그
를 사용해서 주로 변수의 값을 출력합니다.
<%= new java.util.Date() %>
위의 예시 코드로 현재 날짜와 시간을 출력할 수 있습니다. 이 코드는 서버에서 실행되고 그 결과가 HTML로 변환되어 클라이언트에게 전송됩니다.
아래처럼 변수나 메소드 호출 결과를 출력할 수도 있습니다.
<%-- 변수를 호출해서 사용 --%>
<%
String name = "Jay";
%>
Hello, <%= name %>!
<%-- String 메소드를 호출해서 사용 --%>
Length of 'Hello' is <%= "Hello".length() %>.
웹 서버에서 비즈니스 로직(웹 요청 처리, DB 상호작용 등)을 중점적으로 처리해서 그 결과를 JSP로 전달하는 자바 클래스
HTTP request가 들어오면 JSP는 Servlet으로 변환되는 과정을 거칩니다. JSP는 내부적으로 Servlet 코드로 변환되며, 이렇게 변환된 Servlet이 HTTP request를 처리합니다.
사용자가 웹 브라우저로 JSP 페이지에 request를 보내면, 웹 서버는 JSP 페이지를 Servlet 코드로 변환합니다. Java 컴파일러가 Servlet 코드를 바이트 코드로 변환하면, JVM에서 해당 코드를 실행합니다. 변환된 Servlet 코드는 서버에 캐시되고, 코드가 실행되면 사용자가 보낸 request를 처리해서 그에 맞는 동적 데이터를 만들어 냅니다. response에 담을 데이터는 JSP 페이지의 내용에 따라서 HTML 형식으로 생성되고, 이렇게 생성된 데이터가 최종적으로 사용자의 웹 브라우저에 나타나게 됩니다.
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;
// HttpServlet 클래스를 상속받아 Servlet을 정의합니다.
public class HelloWorldServlet extends HttpServlet {
// GET 요청을 처리하기 위해 상위 클래스에서 제공한 doGet 메소드를 재정의합니다.
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 응답의 콘텐츠 타입을 설정합니다.
response.setContentType("text/html");
// PrintWriter 객체를 사용하여 사용자에게 보여질 응답을 작성합니다.
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>Hello World Servlet</title></head>");
out.println("<body>");
out.println("<h1>Hello World!</h1>"); // 웹 페이지에 실제 표시 내용을 작성합니다.
out.println("</body>");
out.println("</html>");
}
}
어플리케이션을 완성하면, 웹 서버에서 실행하기 전에 먼저 '설치 및 구성'을 마무리해야 합니다. 이 과정을 웹 서버에 '배포한다'고 표현합니다.
Servlet을 웹 서버에 배포하기 위해서는 'web.xml' 파일을 사용해서 아래처럼 작성할 수 있습니다.
<web-app>
<servlet>
<servlet-name>HelloWorldServlet</servlet-name>
<servlet-class>HelloWorldServlet</servlet-class>
</servlet>
<servlet-mapping> // '[/hello] URL로 들어오는 HTTP request를 'HelloWorldServlet'으로 연결
<servlet-name>HelloWorldServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
🔎 JSP는 웹 페이지에서 Java 코드를 사용하기 때문에 웹 컴포넌트를 재사용할 수 있도록 지원합니다. 공통적으로 사용하는 요소를 JSP태그를 사용해서 한 번만 작성하면 여러 곳 쉽게 삽입할 수 있습니다.
🔎 하지만, HTML 코드와 자바 코드가 섞이면서 페이지 구조가 복잡해질 수 있다는 단점이 있습니다. 예를 들어, 데이터베이스에서 여러 테이블의 데이터를 가져와서 사용자의 요청을 처리하려고 하는 경우, JSP 페이지 안에 HTML 코드, SQL 쿼리, 자바 코드가 모두 섞이고 코드의 양이 많아집니다. 이렇게 코드가 뒤섞이면서 어떤 부분이 화면을 구성하고 어떤 부분이 데이터를 처리하는지 구분하기 어려워집니다.
💡 가독성이 저하되고 유지보수가 어렵다는 점을 보완하기 위해 MVC 패턴
을 적용할 수 있습니다. JSP 페이지는 디자인만 담당하고, 로직은 자바 클래스나 서블릿에서 처리하도록 하는 방법입니다. 특히, 자바 기술 중 Spring Framework
는 MVC 아키텍처를 직접 제공하며 비즈니스 로직과 프레젠테이션 로직을 명확하게 분리하기 때문에, 애플리케이션의 유지보수가 쉬워지고 확장성이 향상되어 선호되는 프레임워크입니다.