JSP 정의 및 목적
정적 웹페이지 / 동적 웹페이지
- 정적 웹페이지
- 사용자의 요청에 따라 변하지 않고, 항상 동일한 컨텐츠를 제공한다.
- HTML과 같은 파일을 별다른 처리를 하지않고 그대로를 전달하여 로딩 속도가 빠르다.
- 사용자와 상호작용이 제한적이므로 단순한 정보 제공용 웹사이트에 적합하다.
- 동적 웹페이지
- 사용자의 요청, 입력, 세션 정보 등에 따라 페이지의 컨텐츠가 달라진다.
예) 로그인한 사용자에게는 개인화된 정보를, 비로그인한 사용자에게는 일반 정보를 제공한다. - 주로 서버 사이드 스크립트 언어(PHP, JSP, ASP.NET 등)와 데이터베이스를 사용한다.
- 각 요청마다 서버에서 처리가 이루어지므로 서버 자원 소모가 크다. 성능 최적화가 필요하다.
- 사용자의 요청, 입력, 세션 정보 등에 따라 페이지의 컨텐츠가 달라진다.
JSP(JavaServer Pages)란?
동적 웹 페이지를 생성하기 위한 서버측 스크립팅 기술이다.
HTML 내에 Java 코드를 삽입하여 사용할 수 있게 해준다.
Java 기반 개발로, Spring, @MVC 등 다양한 프레임워크와 결합하여 개발이 가능하다.
JSP 사용 목적
- 동적인 컨텐츠 생성
사용자의 요청에 따라 동적으로 컨텐츠를 생성하고 제공한다. - Java 기반
Java의 라이브러리와 프레임워크를 활용할 수 있다. Java의 안정성과 확장성을 그대로 웹 애플리케이션에 적용 가능하다. - 서블릿과의 통합
JSP파일을 서버에 의해 서블릿으로 변환되어 실행된다. 서블릿과 함께 사용하여 MVC 패턴을 쉽게 구현할 수 있다. - 컴포넌트 작성
커스텀 태그 라이브러리와 같은 기능을 통해 재사용 가능한 컴포넌트를 작성할 수 있으며, 이를 여러 JSP 페이지에서 사용할 수 있다. - 프레젠테이션 로직 분리
JSP는 프레젠티에션 로직(HTML, Javascript)을 처리하고 비즈니스 로직은 서블릿이나 EJB에서 처리하는 방식으로 역할 분리 가능하다.
JSP 구성 요소
JSP는 정적인 컨텐츠를 포함하는 HTML 구성요소와 함께
JSP 페이지의 전체적인 구조와 동작을 정의하는 디렉티브
Java 코드가 포함되는 스크립트 요소
JSP의 특정 작업들을 수행하는 JSP 액션 태그
등으로 구성되어 있다.
디렉티브(Directive)
디렉티브는 JSP 페이지의 전체적인 구조와 동작을 정의한다.
`<%@ ... %>` 형식으로 사용되며 주로 페이지 설정, 태그 라이브러리, 파일 포함 등을 지정한다.
page 디렉티브
JSP 페이지의 전역 설정을 지정한다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
JSP 페이지에서 사용할 프로그래밍 언어는 Java이며, HTML 문서를 UTF-8 인코딩으로 전송하도록 설정. JSP 페이지 파일 자체의 문자 인코딩을 UTF-8로 지정.
include 디렉티브
다른 파일을 현재 JSP파일에 포함한다.
<%@ include file="header.jsp" %>
header.jsp 파일을 현재 파일에 포함하겠다는 뜻.
taglib 디렉티브
태그 라이브러리를 선언한다.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
태그 라이브러리의 접두사를 "c"로 지정. JSTL 태그 라이브러리의 태그를 사용할 때 앞에 붙임.
예) `c:if`, `c:forEach`
스크립트 요소
JSP 페이지 내에서 Java 코드를 포함하는 부분이다.
스크립트 요소는 스크립트릿, 선언부, 표현식으로 나뉜다.
스크립트릿 (Scriptlet)
<% ... %>`형식으로 작성되며 페이지가 요청될 때 안의 코드가 순차적으로 실행된다.
<%
// Java code block (scriptlet)
String name = "World";
%>
선언부(Declaration)
JSP 페이지의 멤버 변수 또는 메서드를 선언한다. 클래스 수준에서 변수를 선언하거나 메서드를 정의할 때 사용된다.
`<%! ...%>` 형식으로 작성되며, JSP 페이지가 처음 컴파일 될 때 한번만 실행된다.
<%!
private int counter = 0;
private void incrementCounter() {
counter++;
}
%>
표현식(Expression)
Java 코드에서의 어떠한 결과를 HTML 페이지에 출력할 때 사용한다. `<%= ...%>` 형식으로 사용된다.
페이지가 요청될 때마다 실행되며, `<%= ...%>` 태그 안에 들어가는 값은 무조건 결과 값(반환 값)이 있어야 한다.
<%= "name" + name %>
JSP 액션 태그
JSP 페이지에서 특정 작업을 수행하기 위한 태그이다. `jsp:action ... ` 형식으로 사용된다.
jsp:useBean
Bean 객체를 생성하거나 참조
<jsp:useBean id="user" class="cohttp://m.example.User" scope="session"/>
jsp:getProperty
Bean 객체의 프로퍼티 값 가져오기
<jsp:getProperty name="user" property="username"/>
jsp:setProperty
Bean 객체의 프로퍼티 값 설정하기
<jsp:setProperty name="user" property="username" value="JohnDoe"/>
jsp:include
다른 JSP 파일 포함하기
<jsp:include page="footer.jsp"/>
jsp:foward
요청을 다른 페이지로 포워드하기
<jsp:forward page="nextPage.jsp"/>
아래는 위의 구성요소들을 포함한 jsp 파일 예시이다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ include file="header.jsp" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<title>JSP Example</title>
</head>
<body>
<h1>Welcome to JSP!</h1>
<%
// Java code block (scriptlet)
String name = "World";
%>
<p>Hello, <%= "name" + name %>!</p>
<jsp:useBean id="user" class="com.example.User" scope="session"/>
<jsp:setProperty name="user" property="username" value="JohnDoe"/>
<p>User Name: <jsp:getProperty name="user" property="username"/></p>
<jsp:include page="footer.jsp"/>
</body>
</html>