JSP는 Java Server Page의 약자로 Java를 이용하여 동적 웹 서비스를 구현할 수 있는 서버 사이드 기술이다.
컴파일 방식이 아닌 스크립트 방식을 사용하므로 JSP 페이지를 개발하는 프로그래머가 직접 컴파일 하지 않고, 페이지의 호출 시 필요한 경우에 한해 자동으로 컴파일을 수행하여 서비시를 제공한다.
JSP의 개요
자바 클래스 내 프로그래밍적 로직 처리와 함께 HTML 태그들이 삽입되는 형식으로 제작되는 서블릿과는 달리 JSP 페이지는 문서에 다른 프로그래밍적 가공 없이 HTML 문서를 작성할 때와 동일하게 바로 태그를 사용하며, 자바 코드가 필요할 때 HTML 태그들에서 중간중간 특정 기호를 사용하여 삽입해주는 방식으로 작성된다.
따라서 JSP 페이지는 서블릿을 작성할 때 처럼 웹 서비스 구현에 필수적인 클래스들을 import 한다거나 상속 및 메서드 오버라이딩과 같은 깊이 있는 객체지향 기법을 사용하지 않고 간단한 자바 기본 문법만으로 작성할 수 있으므로 쉽게 학습이 가능하다.
결국 서블릿은 JSP와 유사하게 동작한다. JSP 페이지는 실행시 서블릿 클래스 형태로 변환된 후 컴파일 과정을 거쳐서 실행되기 때문이다.
JSP의 동작
JSP 파일 역시 자바를 사용하는 기술이므로 실질적으로 실행이 되기 위해서 컴파일이 가능한 자바 클래스 형태로 작성되어야 한다.
그러나 앞서 보았듯이 JSP 파일은 기능 수행에 필요한 최소한의 자바 문장으로만 작성되므로 JSP 페이지를 바로 컴파일 하여 사용하는 것을 불가능하다.
따라서 JSP 페이지는 실행되어야 하는 시점에 컴파일이 간으한 완전한 자바 코드를 갖춘 자바 클래스로 변환하는 과정을 거치게 되며 이 자바 클래스는 서블릿과 유사한 구조를 갖추게 된다.
JSP에서 변환된 서블릿 파일도 기존의 서블릿과 비슷한 구성을 가진다.
JSP에서 변환된 서블릿은 앞에서 서블릿 작성 시 사용했던 임포트 패키지가 더 많고 상속받는 클래스가 다르다.
이는 웹 컨테이너 제품군에 따라 JSP를 서블릿 형태의 클래스로 변환해주는데 사용되는 클래스가 다르기 때문이다.
JSP 생명 주기
서블릿은 init(), service(), destroy() 메서드 진행을 통해 객체가 생성되고 소멸한다. 또한 service() 메서드 내의 요청 방식에 따라 doGet(), doPost() 메서드가 호출되며 웹 프로그래머가 작성하는 부분이 doGet() 혹은 doPost() 메서드 이다.
JSP 역시 서블릿과 비슷하게 객체의 생명주기가 진행되며 각 생명주기에 해당하는 메서드는 다음과 같다.
init() → _jspinit() : JSP에 첫 요청이 전달되었을 때 서블릿으로 변환 작업을 거쳐 한 번 호출됨. 이후 _jspService() 메서드를 호출함.
servide() → _jspService() : Client 요청을 처리하는 메서드로 Get/Post 방식에 상관 없이 처리가 가능함. _jspInit(), _jspDestroy() 메서드와는 달리 웹 클라이언트의 요청이 일어날때마다 호출됨
destroy() → _jspDestroy() : 서블릿 객체가 메모리에서 제거될 때 호출되는 메서드
메서드의 이름이 조금 다를 뿐 실제로 수행되는 방식은 서블릿의 메서드와 일치하며 기능 수행에 있으 Get/Post 방식에 상관 없이 처리가 가능하다.
즉, JSP 페이지는 최초 요청이 전달되거나 JSP 페이지 내 내용이 바뀌었을 경우 서블릿 형태의 파일로 변환된 후 컴파일 과정을 거치고 jspInit() 메서드의 실행으로 객체가 생성된다.
이후 요청이 올 때마다 _jspService() 메서드가 호출되어 메서드 내 기능이 수행되며 JSP를 통해 생성된 객체가 제거될 때는 서블릿과 마찬가지로 _jspDestroy() 메서드가 호출된다.
JSP의 기본 문법
JSP 파일의 구성 요소
JSP는 HTML 태그를 별다른 가공 없이 바로 사용하고, 자바 코드 필요시 특정 기호를 통해 삽입되는 형태로 작성한다.
그 외에도 JSP 페이지를 작성하는 데 필요한 기본적인 요소가 존재하므로, JSP 페이지는 여러 가지 요소들이 함께 혼재되어 사용된다.
JSP 페이지를 구성하는 주요 구성 요소들은 다음과 같다.
지시자(directive) : JSP 페이지에 대한 설정 정보를 지정
주석 : 컴파일이 되지 않는 텍스트로 함께 프로그래밍을 하는 프로그래머 간의 정보교환이나 특정 코딩 부분에 대한 정보 제공을 목적으로 주로 사용
HTML : HTML 태그가 별다른 가공없이 바로 사용 가능
스크립팅 요소 : JSP 페이지에서 요청을 처리하기 위해 사용되는 삽입되는 여러 가지 형식
JSP 파일에서의 주석
프로그래밍에서 주석으로 처리된 부분은 컴파일러가 컴파일 하지 않으므로 기능 수행과는 관련이 없는 텍스트이다.
주석은 특정 코드 부분의 개발이나 수정이 용이하도록 설명을 하거나 해당 파일의 코드를 작성한 프로그래머 혹은 담당 부서의 확인 및 파일의 수정 이력을 유지하는 등의 프로그램을 만들거나 수정하는 프로그래머들 사이에 의사소통을 위해 사용된다.
HTML의 주석 : <!— HTML 주석 —>
자바의 주석 : //자바 싱글라인 주석 , /자바 멀티라인 주석/
JSP의 주석 : <%— JSP 주석 —%>
위의 주석중 JSP의 주석은 잘 사용되지 않는다.
소스 보기 기능을 통해 살펴보면 주석에 따라 표시되는 주석이 있고 표시되지 않는 주석이 있다. 페이지에 사용한 주석이 HTML 주석일 경우는 그대로 표시가 되고 JSP 주석과 자바 주석은 응답 결과물에 표시되지 않는데 이는 JSP 및 자바의 주식은 JSP페이지가 서블릿으로 변환되면서 해당 부분은 컴파일 처리가 되지 않아 응답 HTML 문서에 포함되지 않기 때문이다.
보안적 측면이 있는 주석들은 자바, JSP 주석을 사용한다.
JSP 페이지 내부는 여러가지 코드가 혼재하며 코드 종류에 따른 주석 작성 방식도 다양하고 어떤 용도로 작성된 주석이냐에 따라 출력되는 범위가 각각 다르다.
따라서 각 주석의 사용 용도와 출력 범위를 고려하여 적절한 주석을 사용하자.
JSP의 지시자(Directive)
지시어 또는 지시문으로 표현되는 JSP 페이지의 지시자(dircetive)는 웹 클라이언트가 웹 브라우저를 통해 전달하는 요청(request)을 직접적으로 처리하기 위한 문법이 아니라 웹 컨테이너가 JSP 페이지를 서블릿 역할을 할 클래스로 변환할 때 해당 페이지를 어떻게 처리할 것인지에 대한 여러 정보들을 지정해주기 위해 사용된다.
JSP 페이지에서 사용 가능한 지시자는 아래와 같다.
page : JSP 페이지의 속성을 지정 : <%@page 속성/값 지정%>
include : 특정 JSP 혹은 HTML 파일을 현재 페이지에 삽입 <%@include 속성/값지정%>
taglib : JSP 페이지에서 사용할 JSTL(JSP Standard Tag Library)이나 사용자 정의 태그 (Custom Tag) 사용을 명시 : <%@taglib 속성/값 지정 %>
지시자는 <%@~%> 형식으로 ,사용하는 지시자 이름을 붙인 후 해당 지시자에 해당하는 속성값과 값을 적절히 지정하여 작성한다. 여기서는 page 지시자와 include 지시자에 대해 알아볼 것이다.
(1) page 지시자
page 지시자는 JSP 페이지 전체에 적용되는 정보들을 웹 컨테이너에 전달하여 페이지의 속성이 수행되도록 기능을 지정해주는 역할을 하며 JSP 페이지의 최상단에 작성한다.
속성 : 의미 : 기본값
contentType : JSP 페이지를 통해 생성될 문서의 MIME 타입 및 문자셋 지정 : "text/html"
pageEncoding : JSP 페이지의 문자셋 지정 : "ISO-8859-1"
import : 현재 JSP 페이지에서 사용할 자바 패키지/클래스 지정 : 없음
errorpage : 현재 JSP 페이지에서 에러 발생 시 해당 에러를 처리할 페이지를 지정 : 없음
isErrorPage : 현재 JSP 페이지가 에러를 처리할 페이지이닞 여부를 지정 : false
info : 현재 JSP 페이지의 대한 설명을 작성
buffer : 버퍼의 크기를 지정 : 8KB
autoflush : 출력 버퍼가 가득 찼을 때 자동 Flush 기능의 사용 여부를 지정 : true
session : 세션의 사용 유무 지정 : true
language : 스크립트 요소 내 사용할 프로그래밍 언어 지정 : java
extends : 현재 JSP 페이지가 상속받을 클래스 지정 : JSP 엔진에 의해 자동으로 설정
isThreadSafe : 현재 JSP 페이지가 싱글스레드 모드로 작동할 것인지 여부 지정 : true
위에 명시된 속성들은 page 지시자를 통해 설정할 수 있는 주요 속성들이다.
contentType과 pageEncoding 속성
contentType 속성은 JSP 페이지를 통해 생성될 문서의 MIME 타입을 지정하기 위해 사용하며 다음과 같이 MIME 타입만을 명시하거나 MIME 타입과 함께 문자셋을 명시해주는 두 가지 방식으로 사용한다.
MIME 타입만 명시 : <%@ page contentType="MIME타입"%>
MIME 타입과 문자셋 함께 명시 : <%@page contentType="MIME타입; charset=문자셋"%^>
MIME은 Multipurpose Internet Mail Extentsions의 약자로 웹 메일에 첨부 파일을 함께 전송할 때 사용되는 규격, 즉 기본적으로 웹 메일에서 사용되는 확장 규격이다.
이 규격이 웹 서버와 웹 클라이언트간의 통신상에서도 사용되면서 웹 전반적인 분야에 사용되기 시작했다.
웹 프로그래밍에서 자주 보는 MIME 타입은 "text/html" 이다.
그 외에도 이미지 타입을 명시할 때 "image/gif", "video/avi"와 함께 사용되기도 한다.
"/" 기호는 구분자로서 "대분류/소분류"를 의미한다.
contentType 속성의 기본값은 "text/html"이며 속성에 문자셋을 함께 지정해주지 않을 경우, 기본 문자셋은 'ISO-8859-1'로 지정된다.
그러나 한글이 포함된 HTML문서를 생성할 JSP 페이지에는 적합하지 않은 문자셋이므로 일반적오르 'euc-kr' 혹은 'utf-8'과 같이 한글 문자 사용이 가능한 문자셋을 지정한다.
pageEncoding 속성은 JSP 페이지 작성에 사용할 문자셋을 지정한다.
contentType 속성과 pageEncoding 속성은 두 속성 모두 문자셋을 지정할 수 있다는 점에서 비슷하지만 문자셋이 적용되는 대상에서 차이를 보인다.
contentType 속성은 웹 클라이언트의 요청에 대한 응답 즉, 웹 브라우저를 통해 출력될 결과물에 사용될 MIME타입과 문자셋을 지정하고 pageEncoding 속성은 현재 pageEncoding 속성이 사용된 JSP 페이지 내에서 사용될 문자셋을 지정한다.
한글이 들어갈 페이지를 제작할 경우 반드시 한글 처리가 가능한 문자셋 지정을 해주어야 하며 pageEncoding 속성을 사용할 경우 contentType 속성과 pageEncoding 속성에 지정하는 문자셋은 동일하게 설정해주는 것이 일반적이다.
import 속성
page 지시자의 import 속성은 자바에서의 import와 동일한 기능을 하는 속성으로 현재 JSP 페이지에서 사용할 클래스나 패키지를 선언할 때 작성한다.
작성 방법은 <%@~%> 지시문을 통해 page 지시자를 명시해준 후 import 속성에 패키지명과 클래스 명을 "."으로 구분하여 작성한다.
여러 개의 클래스 혹은 패키지를 임포트해야 할 경우 일반적으로 아래와 같이 임포트 되는 수만큼 page 지시자의 import 속성을 작성해준다.
JSP는 실행 시점에는 서블릿 형태의 java 클래스로 변환되며 javax.servelt.*, javax.servlet.http.*과 같은 필수적인 임포트 클래스들은 자동으로 임포트가 되므로 기능 구현시 필요한 외부 패키지나 클래스를 임포트할 때 사용한다.
기능 수행을 위한 클래스를 사용하고자 할 때 page 지시자의 import를 사용하지 않는다면 전체 패키지 경로를 명시하여 사용해야 하므로 import 속성의 사용은 필수적이다.
errorPage와 isErrorPage 속성
errorPage 속성은 JSP 페이지 내에서 Exception이 발생되었을 때 해당 JSP 페이지에서 Exception을 처리하지 않고 처리해줄 JSP 페이지를 따로 지정할 때 사용된다.
속성값으로 Exception을 처리할 jsp 파일을 지정해주며 형식은 다음과 같다.
<%@ page errorPage = "error.jsp"%>
isErrorPage는 현재 JSP 페이지가 Exception을 처리하기 위한 페이지인지 여부를 설정하는 속성으로 방금 보았던 errorPage 속성에 지정된 Exception 처리 페이지에서 작성하는 속성이다.
형식은 다음과 같다.
<%@ page isErrorPage="true"%>
info 속성
info 속성은 현재 JSP 페이지에 대한 기능이나 구현 목적 혹은 특성에 대한 설명을 작성할 때 사용하며 아래와 같이 사용할 수 있다.
<%@ page info ="내용"%>
info 속성에 지정한 값은 응답 페이지에 출력되는 값은 아니며 하나의 JSP 페이지에 한번만 설정할 수 있다. import 속성 처럼 여러 번에 걸쳐 사용하면 에러가 발생한다.
buffer와 autoflush
buffer의 속성과 autoflush 속성을 사용하여 JSP 페이지를 제작하면 아래와 같은 장점이 있다.
- 버퍼에 출력 결과를 쌓은 후 한번에 전송하므로 효율적 전송 가능
- 출력 내용을 바로 전송하지 않으므로 JSP 수행 도중 내용 변경 가능
- 버퍼의 용량이 가득 차기 전 HTTP 헤더 정보 변경 가능
일반적인 JSP 제작에 있어 이 속성의 값은 지정해주지 않고 기본값을 사용한다.
session 속성
session 속성은 현재 JSP 페이지에서 웹 클라이언트에 대한 정보를 유지, 즉 접속 유지에 대한 처리를 session을 통해 할 것인지 여부를 지정하는 속성으로 아래와 같이 사용한다.
<%@ page session="true"%>
일반적으로 session 속성의 값은 기본값인 true를 그대로 사용한다.
laguage 속성
laguage 속성은 현재 JSP 페이지에서 사용하는 서버 사이드 스크립트 언어를 지정하는 속성이다. 일반적으로 java를 그대로 사용하므로 생략하는 경우가 많다.
extends 속성
extends 속성은 JSP 파일이 서블릿으로 변환될 때 상속받을 부모 클래스를 지정하는 속성이다. 이 속성은 JSP 를 서블릿으로 변환할 웹 컨테이너에서 자체적으로 상속을 처리하므로 우리가 직접 작성하지 않는 속성이다.
(2) include 지시자
include 지시자는 현재 JSP 페이지에 JSP 파일 혹은 HTML 파일을 포함시켜주는 지시자이다.
주로 페이지마다 자주 사용되는 공통 부분을 파일로 만들어 삽입시켜줄 때 사용한다.
page 지시자와는 달리 특정 파일이 삽입되길 원하는 곳에 자유롭게 배치할 수 있다.
<%@include file="include.jsp"%>
또한 inlcude 된 파일의 내용은 현재 JSP 페이지에 모두 포함되므로 include를 통해 현재 JSP 페이지에 몇 개의 파일이 포함되어 있어도 최종적으로 변환되어 생성되는 서블릿 파일은 하나뿐이다.
주로 메뉴나 푸터를 만들때 사용한다.
(3) taglib 지시자
taglib 지시자는 기본적은 JSP 문법 요소들과 HTML 태그 외 사용자 정의 태그(Custom Tag)나 JSTL(JSP Standard Tag Library)과 같은 외부 태그 라이브러리를 사용할 때 필요한 태그 라이브러리 식별자와 접두어를 지정하는 기능을 담당한다. uri 속성을 통해 사용할 태그 라이브러리의 정의가 들어있는 TDL(Tag Library Descriptor) 파일의 경로를 지정하고, prefix 속성을 이용하여 해당 태그 사용을 구분할 접두어를 지정한다.
<%@ taglib uri = "http:\\taglib.com\taglibURI" prefix="taglibPrefix" %>
taglib 지시자를 사용해 JSP 페이지에서 사용할 외부 태그 라이브러리를 설정해 두면 prefix로 지정된 접두사를 이용해 태그를 사용할 수 있게 된다.
JSP의 스크립팅 요소(Scripting Elements)
스크립팅 요소는 JSP 페이지 작성 시 자바 요소를 사용하기 위한 문법으로, 스크립틀릿 (Scriptlet), 표현식(Expression), 선언문(Declaration), JSP 주석으로 이루어 진다.
(1) 스크립틀릿(Scriptlet)
스크립틀릿은 JSP 내에 자바 코드를 직접 삽입해야 할 때 일종의 코드블록이다.
스크립틀릿은 다음과 같은 형식으로 사용할 수 있다.
<% 자바문장1; %>
<% 자바문장2
....
자바문장n
%>
스크립틀릿의 사용법은 간단히 <% %> 사이에 자바 코드를 그대로 사용하면 된다.
자바 문법을 그대로 사용하기 대문에 ;으로 문장을 종료시켜야 한다.
스크립틀릿에 사용한 자바 코드는 JSP 페이지에서 변환된 서블릿 파일 내 앞서 생명주기를 설명하며 언급했던 _jspService() 메서드에 위치하게 된다.
스크립틀릿에 사용된 자바 코드는 모두 서블릿 내 _jspService() 메서드 안에 그대로 삽입된다.
여기서 주의 깊게 봐야 할것은 JSP 페이지 내 HTML 태그도 서블릿으로 변환되면서 자바 코드로 HTML을 표현하도록 out.write()를 사용한다.
따라서 스크립틀릿을 사용하면 자바의 반복문이나 조건문을 사용하여 HTML 태그 부분을 동적으로 생성시킬 수 있다.
(2) 표현식(Expression)
표현식은 현재 JSP 페이지 내에서 불러올 수 있는 변수의 값, 수식의 결과, 메서드의 리턴값 등의 데이터 출력을 간단히 구현하기 위해 사용하는 문법으로 스크립틀릿과 달리 문장 끝에 ';'를 붙이지 않으며 사용방법은 다음과 같다.
<%=변수%>
<%=수식%>
<%=리턴값을 가지는 메서드%>
표현식을 통해 출력될 변수는 서블릿에서 out.print()로 변환되어 출력된다.
표현식은 스크립틀릿으로 일일히 표현하기에는 번거롭고 데이터의 표현이 간단한 편이라면 스크립틀릿으로 출력해주는 방식보다 빠르고 간편하게 사용할 수 있다.
또한 표현식에 들어가는 내용들은 print() 메서드에 바로 삽입되어 서블릿으로 변환되므로 표현식으로 출력하는 내용은 스크립틀릿을 통해서 출력이 가능하다.
표현식을 이용하면 데이터의 출력과 메서드의 실행 결과값을 간단히 출력해 줄 수 있으므로 유용하게 사용할 수 있다.
(3) 선언문(Declaration)
선언문은 JSP 페이지 내에서 사용할 클래스 변수, 인스턴스 변수와 같은 멤버 변수와 멤버 메서드를 선언할 때 사용된다. 선언문에서 사용된 자바 코드들 역시 서블릿 변환 시 함께 삽입되며 스클립틀릿과 달리 선언문에 작성된 코드는 _jspServie() 메서드 내에 삽입되지 않고 서블릿 클래스 바로 아래에 작성된다.
<%!
변수 선언;
메서드 선언(파라미터 목록){
자바코드
}
%>
선언문을 사용한 JSP 페이지가 변환된 클래스 파일을 보면 선언문에 작성한 자바코드는 크래스 영역의 변수들과 메서드 작성에 사용되므로 _jspService()메서드 내에 위치하지 않고 클래스의 멤버로서 작성된다.
'Back-end' 카테고리의 다른 글
JSP의 내장객체 (0) | 2021.08.21 |
---|---|
Spring 용어정리(3) (0) | 2021.08.16 |
Spring 용어정리 (2) (0) | 2021.08.11 |
Spring 용어정리 (1) (0) | 2021.08.10 |
Spring Concept (0) | 2021.08.09 |