[Web] JSP의 개요(JSP의 장단점, page지시어, include지시어, taglib지시어)

2022. 10. 20. 20:42·Programming/Web
728x90

JSP의 특징과 구성요소

JSP는 서블릿의 화면단 처리의 어려움을 해결하기 위해 등장하였으며, HTML과 데이터를 조합하기 위해 다음과 같은 특징과 구성요소를 가진다.

JSP의 특징

  • HTML 페이지에 자바 코드를 직접 사용한다.
  • 서블릿 컨테이너에 의해 관리되는 내장 객체의 생명주기를 이용하여 페이지 간 속성을 관리한다.
  • 커스텀 태그 기술을 사용하여 코드를 태그화(action, JSTL) 한다.
  • EL(Expression Language)을 통해 데이터를 표현한다.

즉 JSP는 서블릿에서 데이터 표현의 불편함을 해결하기 위해 나온 뷰 템플릿 기술의 하나로, HTML 형식의 문서 구조에 자바 코드 혹은 다른 전용 표기법을 사용해 프로그램 요소를 쉽게 구현할 수 있도록 도와준다. 내부적으로는 서블릿으로 변환되어 실행되는 구조다.

JSP의 구성요소

  • 지시어(Standard Directives)
  • 액션(Standard Action)
  • 템플릿 데이터(Template Data)
  • 스크립트 요소(Script Element)
  • 커스텀 태그(Custom Tag)와 EL(Expression Language)

각각의 구성요소는 고유의 표기법과 속성을 가지지만 서블릿 형태의 소스로 변환되는 과정에서 자바 코드로 바뀌게 된다.

JSP의 동작 과정

JSP는 기본적으로 HTML 문서의 텍스트 파일 형식을 가지지만 컴파일된 JSP는 단순한 파일이 아니라 컨테이너에서 서블릿 객체로서 관리된다. 다시 말해 컴파일이 완료되면 JSP는 더 이상 파일로부터 처리되는 구조가 아니라 컨테이너에 로드된 서블릿으로 동작하는 구조가 되는 것이다. 따라서 서블릿 컨테이너는 JSP 파일을 서블릿 구조의 .java 소스코드로 변환하며 컴파일을 수행한다.

JSP의 확장자는 .jsp이며 page 지시어를 포함해야 한다.

JSP가 서블릿으로 컴파일되고 실행되는 과정

JSP 개발과 동작 과정

  1. 'hello.jsp' 소스코드를 작성하고 웹 애플리케이션을 배포한다.
  2. 클라이언트 요청에 컨테이너는 해당 .jsp의 클래스 변환 여부를 확인한다.
  3. 변환되지 않았다면 'hello_jsp.java' 파일을 생성하고 .class로 컴파일한다.
  4. jspInit() 메서드를 통해 서블릿을 실행한다.
  5. _jspService() 메서드를 통해 클라이언트 요청을 처리한다.
  6. 컨테이너 종료 혹은 관리 도구에 의해 서블릿 jspDestroy() 호출로 종료된다.

JSP의 장단점

JSP의 장점

  • HTML 파일에 자바 기술을 거의 무한대로 사용할 수 있으며, 비교적 쉽게 프로그래밍할 수 있다.
  • 커스텀 태그 라이브러리 등 JSP 개발에 도움이 되는 확장 태그 구조를 사용할 수 있다.
  • 서블릿으로 변환되어 실행되므로 서블릿 기술의 장점을 모두 가진다.
  • MVC 패턴, 스프링 프레임워크 등 잘 설계된 구조를 적용할 수 있어 체계가 잡히면 개발 생산성이 향상되고 성능이 보장된다.
  • 모든 개발이 서버에서 이루어지므로 개발의 집중화를 통한 효율이 있을 수 있다.

JSP의 단점

  • 화면 구성요소를 변경하면 JSP→자바→클래스→서블릿 실행 과정을 거치므로 개발 과정에서 사소한 UI 변경일지라도 매번 확인하는 데 시간이 소요된다.
  • 개발자와 디자이너 간 역할 분담에 제약이 있다.
  • JSP 파일의 화면 디자인 확인에도 반드시 서블릿 컨테이너의 실행이 필요하다.

기본적으로 JSP 자체의 문제라기보다는 서버에서 사용자에게 보여줄 페이지를 모두 구성하여 보여주는 SSR 방식의 백엔드 웹 개발 구조 특징에서 기인하는 문제라 할 수 있다.

JSP 지시어

지시어(Directives)는 JSP 파일의 속성을 기술하는 요소로, JSP 컨테이너에 해당 페이지를 어떻게 처리해야 하는지를 전달하는 내용을 담고 있다. 지시어는 크게 page, include, taglib으로 나눌 수 있으며, 각각의 속성이 다르다.

// 지시어의 기본 형식
<%@ 지시어 속성="값" %>

page 지시어

page 지시어는 현재 JSP 페이지를 컨테이너에서 처리(서블릿으로 변환)하는 데 필요한 각종 속성을 기술하기 위해 사용한다. 소스코드 맨 앞에 위치하며 이클립스에서 JSP 파일을 생성할 때 자동으로 생성된다.

// page 지시어의 구문과 사용 형식
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8" import="java.util.*" errorPage="error.jsp"%>
  • language: 현재 페이지의 스크립트 언어를 지정하는 속성이다. 스펙상 다른 언어도 가능하지만 자바를 기본 언어로 한다.
  • contentType: 현재 페이지의 파일 형식을 지정하는 속성이다. 클라이언트 요청에 응답할 때 전달하는 HTTP 헤더 정보가 된다.
  • pageEncoding: JSP 파일을 컨테이너가 처리할 때 사용하는 캐릭터 인코딩을 지정하는 속성이다. 올바른 한글 처리를 위해서는 'UTF-8'로 지정해야 한다.
  • import: JSP 파일 내에서 자바 코드(스크립트릿)를 직접 사용하는 경우 일반 자바 코드와 마찬가지로 클래스에 대한 패키지 import가 필요하다.
  • errorPage: 현재 JSP 요청 중에 에러가 발생하는 경우 서버 에러를 클라이언트에 전달하지 않고 별도의 페이지에서 처리하기 위한 속성이다. JSP에서 에러 페이지 설정을 넣는 것보다는 서버 설정을 사용하는 것을 권장한다.

include 지시어

include 지시어는 다른 파일을 포함하기 위한 지시어로, 사용된 위치에 특정 파일(html, jsp)을 불러온다. 컨테이너에서는 포함된 파일을 하나로 처리하며 자바 소스를 생성한 뒤 서블릿으로 컴파일 한다. 즉 include에 사용된 파일의 내용을 모두 포함한 하나의 서블릿 코드로 생성되어 컴파일되는 것이다.

포함되는 파일의 경우 해당 파일을 직접 요청해서 실행하는 것이 아니라면 개별 구성요소를 갖출 필요는 없다(page 지시어, HTML 기본 태그 구성요소 등).

include 지시어는 원하는 위치에 자유롭게 사용할 수 있으며 다음과 같이 사용한다.

<%@ include file="파일 위치" %>
  • file: 포함하고자 하는 파일의 경로를 지정하며 상대 경로, 절대 경로를 사용할 수 있다.

다음과 같이 하나의 JSP 파일(화면)이 실제로는 여러 파일의 조합으로 구성되는 경우를 생각해볼 수 있다.

여러 파일을 포함해 구성한 화면

<%@ include file="header.jsp" %>
<%@ include file="body.jsp" %>
<%@ include file="footer.jsp" %>
include 액션
include 지시어와 비슷한 목적으로 사용할 수 있는 include 액션도 있다. 액션의 경우 지시어와 달리 각각의 파일을 실행한 결과를 포함하여 보여주는 구조다.

taglib 지시어

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 태그를 사용한다.

'Programming > Web' 카테고리의 다른 글

[Web] 액션 태그 (useBean, include, forward)  (0) 2022.10.21
[Web] 템플릿 데이터와 스크립트 요소(<%! %>, <%= %>, <% %>)  (0) 2022.10.20
[Web] 페이지 이동과 정보 공유(Cookie, Session, Scope Object)  (0) 2022.10.20
[Web] 서블릿 클래스 구조와 생명 주기  (0) 2022.10.20
[Web] 서블릿의 개요  (0) 2022.10.20
'Programming/Web' 카테고리의 다른 글
  • [Web] 액션 태그 (useBean, include, forward)
  • [Web] 템플릿 데이터와 스크립트 요소(<%! %>, <%= %>, <% %>)
  • [Web] 페이지 이동과 정보 공유(Cookie, Session, Scope Object)
  • [Web] 서블릿 클래스 구조와 생명 주기
arajo
arajo
  • arajo
    아라 메모장
    arajo
  • 전체
    오늘
    어제
    • 분류 전체보기 (509)
      • Language (298)
        • HTML (55)
        • CSS (11)
        • JavaScript (70)
        • TypeScript (8)
        • Python (33)
        • Java (119)
        • C (0)
        • C# (2)
      • Programming (92)
        • Programming (14)
        • Web (51)
        • Apache (1)
        • MySQL (23)
        • AWS (3)
      • Framework | Library (26)
        • Framework | Library (3)
        • Vue.js (2)
        • React.js (5)
        • React Native (4)
        • Node.js (1)
        • Ajax (1)
        • Bootstrap (8)
        • Spring (1)
        • Flutter (1)
      • etc (2)
      • 휴식 (19)
        • 책 (13)
        • 일기 (5)
        • 게임 일기 (1)
      • A (71)
        • 공부 (18)
        • 기타 (6)
        • 일 (47)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Java
    객체
    CSS
    web
    파이썬
    타입스크립트
    자바스크립트
    array
    JavaScript
    HTML
    object
    react
    MySQL
    next.js
    Python
    변수
    리액트
    제어문
    event
    TypeScript
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
arajo
[Web] JSP의 개요(JSP의 장단점, page지시어, include지시어, taglib지시어)
상단으로

티스토리툴바