mojo's Blog
JSP의 기초 본문
JSP의 개요
JSP는 서블릿의 화면단 처리의 어려움을 해결하기 위해 등장하였으며, HTML과 데이터를 조합하기 위해 다음과 같은 특징과 구성요소를 가진다.
※ JSP의 특징
- HTML 페이지에 자바 코드를 직접 사용한다.
- 서블릿 컨테이너에 의해 관리되는 내장객체의 생명 주기를 이용하여 페이지 간 속성을 관리한다.
- 커스텀 태그 기술을 사용하여 코드를 태그화(action, JSTL 등) 한다.
- EL(Expression Language)을 통해 데이터를 표현한다.
※ JSP의 구성요소
- 지시어(Standard Directives)
- 액션(Standard Action)
- 템플릿 데이터(Template Data)
- 스크립트 요소(Script Element)
- 커스텀 태그(Custom Tage)와 EL(Expression Language)
JSP는 기본적으로 HTML 문서의 텍스트 파일 형식을 가지지만 컴파일된 JSP는 단순한 파일이 아니라 컨테이너에서 서블릿 객체로서 관리된다.
즉, 컴파일이 완료되면 JSP는 더이상 파일로부터 처리되는 구조가 아닌 컨테이너에 로드된 서블릿으로 동작하는 구조가 된다.
JSP가 서블릿으로 컴파일되고 실행되는 과정을 보도록 한다.
1. 'hello.jsp' 소스코드를 작성하고 웹 애플리케이션을 배포한다.
2. 클라이언트 요청에 컨테이너는 해당 .jsp의 클래스 변환 여부를 확인한다.
3. 변환되지 않았다면 'hello_jsp.java' 파일을 생성하고 .class로 컴파일한다.
4. jspInit() 메서드를 통해 서블릿을 실행한다.
5. _jspService() 메서드를 통해 클라이언트 요청을 처리한다.
6. 컨테이너 종료 혹은 관리 도구에 의해 서블릿 jspDestroy() 호출로 종료된다.
※ JSP의 장점
- HTML 파일에 자바 기술을 거의 무한대로 사용이 가능해 비교적 프로그래밍을 쉽게 가능하다.
- 커스텀 태그 라이브러리 등 JSP 개발에 도움이 되는 확장 태그 구조 사용이 가능하다.
- 서블릿으로 변환되어 실행되므로 서블릿 기술의 장점을 모두 가진다.
- MVC 패턴, 스프링 프레임워크 등 잘 설계된 구조를 적용할 수 있어 체계가 잡히면 개발 생산성이 향상되고 성능이 보장된다.
- 모든 개발이 서버에서 이뤄지므로 개발의 집중화를 통한 효율이 있을 수 있다.
※ JSP의 단점
- 화면 구성요소를 변경하면 JSP -> 자바 -> 클래스 -> 서블릿 실행 과정을 거치므로 개발 과정에서 사소한 UI 변경일지라도 매번 확인하는데 시간이 소요된다.
- 개발자와 디자이너 간 역할 분담에 제약이 있다.
- JSP 파일의 화면 디자인 확인에도 반드시 서블릿 컨테이너의 실행이 필요하다.
JSP 지시어
지시어란?
JSP 파일의 속성을 기술하는 요소로, JSP 컨테이너에 해당 페이지를 어떻게 처리해야 하는지를 전달하는 내용을 담고 있다.
지시어는 크게 page, include, taglib으로 나눌 수 있으며, 각각의 속성이 다르다.
지시어의 기본 형식은 다음과 같다.
<%@ 지시어 속성 = "값" %>
♣ page 지시어
현재 JSP 페이지를 컨테이너에서 처리(서블릿으로 변환)하는 데 필요한 각종 속성을 기술하기 위해 사용한다.
소스코드 맨 앞에 위치하며 이클립스에서 JSP 파일을 생성할 때 자동으로 생성된다.
page 지시어의 구문과 사용 형식은 다음과 같다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*" errorPage="error.jsp" %>
- language : 현재 페이지의 스크립트 언어를 지정하는 속성이다. (기본으로 java)
- contentType : 현재 페이지의 파일 형식을 지정하는 속성이다. 클라이언트 요청에 응답할 때 전달하는 HTTP 헤더 정보가 된다.
- pageEncoding : JSP 파일을 컨테이너가 처리할 때 사용하는 캐릭터 인코딩을 지정하는 속성이다. 올바른 한글 처리를 위해서는 'UTF-8'로 지정해야 한다.
- import : JSP 파일 내에서 자바 코드(스크립트릿)를 직접 사용하는 경우 일반 자바 코드와 마찬가지로 클래스에 대한 패키지 import가 필요하다.
- errorPage : 현재 JSP 요청 처리 중에 에러가 발생하는 경우 서버 에러를 클라이언트에 전달하지 않고 별도의 페이지에서 처리하기 위한 속성이다.
♣ include 지시어
다른 파일을 포함하기 위한 지시어로, 사용된 위치에 특정 파일(html, jsp)을 불러온다.
컨테이너에서는 포함된 파일을 하나로 처리하며 자바 소스를 생성한 뒤 서블릿으로 컴파일한다.
즉 include에 사용된 파일의 내용을 모두 포함한 하나의 서블릿 코드로 생성되어 컴파일되는 것이다.
include 지시어는 원하는 위치에 자유롭게 사용 가능하며 다음과 같이 사용된다.
<%@ include file="파일 위치" %>
- file : 포함하고자 하는 파일의 경로를 지정하며 상대 경로, 절대 경로를 사용할 수 있다.
예를 들어서 다음과 같이 하나의 JSP 파일(화면)이 실제로는 여러 파일의 조합으로 구성되는 경우를 생각해볼 수 있다.
<%@ include file="header.jsp" %>
<%@ include file="body.jsp" %>
<%@ include file="footer.jsp" %>
♣ taglib 지시어
JSP의 태그 확장 매커니즘인 커스텀 태그를 사용하기 위한 지시어이다.
taglib 지시어의 구문과 사용 형식은 다음과 같다.
<%@ taglib (uri="태그 라이브러리 경로" 혹은 tagdir="태그 파일 경로" )
prefix="태그 접두어" %>
- uri : 태그 라이브러리 위치로 태그를 정의하고 있는 .tld 파일 경로를 나타낸다.
- tagdir : 태그 파일로 태그를 구현한 경우 태그 파일 경로를 나타낸다.
- prefix : 해당 태그를 구분해서 사용하기 위한 접두어다.
태그 파일로 커스텀 태그를 구현한 예시로 [WEB-INF/tags] 폴더에 있는 'printData.tag' 파일에 태그에서 처리할 내용이 작성되어 있다.
<%@ taglib tagdir="/WEB-INF / tags" prefix="m" %>
...
<h2><m:printData /></h2>
접두어 m을 이용하여 printData.tag 태그를 사용한다.
템플릿 데이터와 스크립트 요소
템플릿 데이터란?
JSP의 화면 구성요소를 말한다.
시작 부분의 page 지시어를 제외하면 JSP 파일의 전반적인 구조는 HTML의 문서 구조를 따른다.
따라서 일반적인 HTML 파일처럼 CSS, 자바스크립트도 사용할 수 있다.
기본적으로 HTML5를 사용하면 문서 구조 중심으로 간략하게 작성하고 데이터 표현은 뒤에서 배울 JSTL, EL을 사용한다.
화면 디자인을 위해 자체적인 CSS 정의 이외에도 Bootstrap과 같은 라이브러리를 사용할 수 있으며, REST API 호출을 위해 Axios 같은 자바스크립트 라이브러리 역시 사용할 수 있다.
다만 React, Vue와 같은 자바스크립트 요소는 프런트엔드 개발 기술로 JSP와 함께 사용하지 않는다는 것을 주의한다.
스크립트 요소란?
JSP는 HTML과 자바 코드를 섞어 사용할 수 있는데, 이때 사용되는 자바 코드를 '스크립트 요소' 라고 한다.
JSP에서 스크립트(자바 코드)를 사용하기 위한 태그는 다음과 같다.
※ <%! %>
- 선언 태그이다.
- JSP가 서블릿 코드로 변환될 때 _jspService() 메서드 안에 들어가게 되므로 JSP에서는 일반 자바 코드와 달리 멤버 변수나 메서드 선언은 기본적으로 불가능하다.
- 멤버 변수나 메서드 선언이 필요하다면 사용할 수는 있으나 권장하지 않는다.
※ <%= %>
- 표현 태그이다.
- 웹 브라우저를 통해 클라이언트에 전달될(HTML 응답에 포함될) 자바 표현식을 포함한다.
- out.println()의 인자로 적합한 모든 자바 코드가 가능하다.
- 사칙 연산, 메서드 호출, 변숫값 출력 등에 사용된다.
- EL로 대체할 수 있다.
<h2><%= member.getUserName() %></h2>
현재날짜와 시간 : <%= java.time.LocalDateTime.now() %>
※ <% %>
- 스크립트릿(Scriptlet) 태그이다.
- 모든 자바 코드의 사용이 가능하다. 단, _jspService() 메서드 내에 포함되는 것을 고려해야 한다.
- 서블릿 코드로 변환될 때 모든 HTML은 out.write() 형태로 변경된다.
- HTML과 스크립트릿을 중간에 섞어 사용하는 것도 가능하다.
- MVC 패턴 적용과 JSTL + EL 로 대체할 수 있다.
<%
String name = request.getParameter("uname");
%>
<h2><%= uname %></h2>
<hr>
<table>
<% for(Member m : mlist) { %>
<tr>
<td> <%= m.name %> </td>
<td> <%= m.email %> </td>
</tr>
<% } %>
</table>
만약 out.println()을 사용한다면 위 코드에서 다음과 같이 수정이 가능하다.
<%
String name = request.getParameter("uname");
%>
<h2><%= uname %></h2>
<hr>
<table>
<%
for(Member m : mlist) {
out.println("<tr> <td>" + m.name + "</td> <td>" + m.email + "</td> </tr>");
}
%>
</table>