맨위로가기

자카르타 서버 페이지

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

자카르타 서버 페이지(JSP)는 웹 애플리케이션을 개발하기 위한 기술로, 클라이언트 요청에 따라 자바 코드를 실행하여 동적으로 HTML을 생성한다. JSP는 서블릿 컨테이너 내에서 서블릿으로 변환되어 실행되며, 스크립팅을 위해 다양한 구분 기호와 태그를 사용한다. JSP는 지시자, 선언, 스크립트릿, 표현식, 액션 등의 구문을 지원하며, JSTL과 같은 태그 라이브러리를 통해 기능을 확장할 수 있다. 또한, XML 기반 JSP를 사용하여 XML 구문을 준수하는 페이지를 작성할 수 있다. JSP는 자바 객체에 접근하기 위한 표현 언어(EL)를 지원하며, 아파치 톰캣과 같은 서블릿 컨테이너에서 실행된다. JSP는 코드 가독성 및 유지보수 문제로 비판을 받기도 하며, 자바 기반 템플릿 기술의 대안들이 존재한다.

더 읽어볼만한 페이지

  • 자바 사양 요청 - 자바 플랫폼, 마이크로 에디션
    자바 ME는 임베디드 및 모바일 장치에서 자바 앱을 실행하는 플랫폼으로, 피처폰에서 주로 사용되었으며 다양한 프로파일과 에뮬레이터, 개발 도구를 제공하고 JSR을 통해 기능이 확장된다.
  • 자바 사양 요청 - 자바 커뮤니티 프로세스
    자바 커뮤니티 프로세스는 자바 기술 명세의 개발 및 관리를 담당하는 조직으로, 자바 기술 표준화와 발전에 기여해왔으나 운영 방식에 대한 비판과 여러 논란에 직면해 있다.
  • 자바 플랫폼, 엔터프라이즈 에디션 - IBM 웹스피어
    IBM 웹스피어는 IBM에서 출시한 기업용 소프트웨어 제품군 브랜드로, 다양한 애플리케이션 인프라, 비즈니스 프로세스 통합, 정보 통합 및 개발 도구를 포함한다.
  • 자바 플랫폼, 엔터프라이즈 에디션 - 자바 서블릿
    자바 서블릿은 자바를 이용해 동적인 웹 페이지를 만드는 서버 측 기술로, 웹 애플리케이션의 컨트롤러 역할을 수행하며 웹 컨테이너를 통해 관리되는 초기화, 서비스, 소멸의 생명 주기를 갖는다.
자카르타 서버 페이지 - [IT 관련 정보]에 관한 문서
일반 정보
유형동적 웹 페이지
개발자이클립스 재단
출시일1999년
최신 버전4.0
최신 버전 출시일2024년 4월 9일
공개 여부
공식 웹사이트공식 웹사이트
기술 정보
파일 확장자.jsp, .jspx, .jspf
MIME 유형application/jsp
표준JSR 245
기반 기술HTML, Java
장르템플릿 엔진

2. 동작 구조

클라이언트에서 서비스가 요청되면, JSP웹 애플리케이션 서버의 서블릿 컨테이너에서 실행 요청을 받는다. 이때 JSP 파일은 먼저 서블릿 원시 코드로 변환된 후, 즉시 컴파일되어 실행된다. 실행 결과는 주로 HTML 형태의 웹 페이지로 생성되어 클라이언트에게 반환된다.

구조적으로 JSP는 자카르타 서블릿을 더 쉽게 사용할 수 있도록 만든 상위 수준의 추상화로 볼 수 있다. JSP는 실행 시점에 서블릿으로 변환되기 때문에, 본질적으로는 서블릿과 동일하게 동작한다. 한 번 컴파일된 서블릿 코드는 메모리에 캐시되어, 해당 JSP 파일이 수정되기 전까지는 재사용되므로 반복적인 요청에 빠르게 응답할 수 있다.[3] 처음 요청 시에는 변환 및 컴파일 시간이 필요하지만, 이후 요청부터는 캐시된 코드를 사용하므로 접근 속도가 향상된다.

JSP를 사용하면 HTML이나 XML과 같은 정적인 웹 콘텐츠 안에 자바 코드와 미리 정의된 동작들을 혼합하여 작성할 수 있다. 자바 코드는 주로 `'<%'`와 `'%>'` 기호 사이에 작성하며, 이러한 코드 조각을 스크립트릿(scriptlet)이라고 부른다. 이를 통해 웹 페이지의 디자인 요소와 프로그램 로직을 하나의 파일 안에서 관리하면서도 분리할 수 있다는 장점이 있다.[14] 또한, JSTL이나 프레임워크에서 제공하는 커스텀 태그 라이브러리를 사용하면, 스크립트릿 없이도 미리 정의된 태그를 이용해 코드를 삽입하여 가독성을 높일 수 있다. JSP 2.0부터는 `.tag` 확장자를 가진 태그 파일을 이용해 개발자가 직접 커스텀 태그를 더 쉽게 만들 수 있게 되었다.

JSP 페이지가 실행될 때, 웹 컨테이너는 `request`, `response`, `session`, `application`, `config`, `page`, `pageContext`, `out`, `exception`과 같은 여러 암시적 객체들을 자동으로 생성하여 제공한다. 개발자는 이 객체들을 활용하여 클라이언트 요청 처리, 응답 생성, 세션 관리 등 다양한 작업을 수행할 수 있다.

JSP는 주로 HTML 및 XML 문서를 생성하는 데 사용되지만, `OutputStream`을 활용하면 이미지나 파일 등 다른 형태의 데이터도 클라이언트에 전송할 수 있다.[5] JSP와 유사한 서버 측 스크립트 기술로는 PHP, ASP, ASP.NET 등이 있다.

2. 1. JSP 모델 2 아키텍처

JSP 모델 2 아키텍처.


자카르타 서버 페이지(JSP)는 독립적으로 사용될 수도 있지만, 서버 측 모델-뷰-컨트롤러(MVC) 디자인 패턴의 뷰(View) 구성 요소로 활용되는 경우가 많다. 이 구조에서 일반적으로 자바빈즈(JavaBeans)는 모델(Model)의 역할을 담당하고, 자바 서블릿이나 아파치 스트럿츠와 같은 프레임워크는 컨트롤러(Controller) 역할을 수행한다. 이러한 방식을 모델 2 아키텍처라고 부른다.[4]

모델-뷰-컨트롤러 아키텍처는 JSP를 화면 표시를 담당하는 뷰, 서블릿을 사용자의 요청을 받아 처리하고 제어하는 컨트롤러, 그리고 자바빈즈를 데이터 처리 및 비즈니스 로직을 담당하는 모델로 사용하는 구조를 상정한다.

3. 구문

JSP는 서버 측 스크립팅 기능을 구현하기 위해 여러 종류의 태그와 구분 기호를 사용한다. 이를 통해 HTML 문서 내에 자바 코드를 삽입하여 동적인 웹 페이지를 생성할 수 있다.

가장 기본적인 구분 기호는 `<% ... %>`로, 이는 JSP '''스크립트릿'''(scriptlet)을 감싸는 데 사용된다. 스크립트릿은 웹 페이지 요청 시 서버에서 실행되는 자바 코드 조각이다.[6] 다른 주요 구분 기호로는 표현식의 결과를 HTML에 직접 출력하는 `<%= ... %>`(표현식)과 JSP 페이지 처리 방식을 지정하는 `<%@ ... %>`(지시자)가 있다.[6] 이 외에도 변수나 메서드를 선언하는 `<%! ... %>`(선언), 자주 사용되는 기능을 태그 형태로 제공하는 `<jsp:액션명>`(액션), JSP 소스 코드에 주석을 다는 `<%-- 주석 --%>` 등이 사용된다.

JSP 내의 자바 코드는 반드시 하나의 스크립트릿 블록 안에서 완결될 필요는 없다. 페이지 전체의 구문이 올바르다면, HTML 마크업 사이에 여러 스크립트릿을 나누어 코드를 작성할 수 있다. 예를 들어, 하나의 스크립트릿에서 시작된 자바의 `if`나 `for` 문은 이후 다른 스크립트릿에서 닫힐 수 있다. 이렇게 코드와 마크업을 혼합하는 방식은 유연성을 제공하지만, 코드가 복잡해지고 가독성이 떨어지는 단점이 있어 주의가 필요하다. 분할된 자바 코드 블록 사이에 있는 HTML 콘텐츠는 해당 코드의 영향을 받는다. 예를 들어, `if` 문의 조건이 참일 때만 해당 블록 안의 HTML이 출력되고, 반복문 안에 있는 HTML은 반복 횟수만큼 출력된다.

JSP는 기본적으로 자바 서블릿 기술을 기반으로 구현되었다. 서블릿과 달리 JSP는 HTML 구조 안에 자바 코드를 넣어 디자인 작업과 프로그래밍 로직을 분리하는 데 용이하며, 특히 정적인 내용이 많은 웹 페이지를 동적으로 생성할 때 유용하다.[14] 유사한 서버 측 스크립트 기술로는 PHP, ASP, ASP.NET 등이 있다.

클라이언트가 JSP 페이지를 요청하면, 애플리케이션 서버의 서블릿 컨테이너는 먼저 해당 JSP 파일을 서블릿 자바 소스 코드로 변환한다. 그런 다음 이 소스 코드를 컴파일하여 서블릿 클래스 파일을 생성하고 실행한다. 처음 요청 시에는 변환 및 컴파일 시간이 소요되지만, 이후 같은 페이지 요청에 대해서는 이미 컴파일된 서블릿을 재사용하므로 응답 속도가 빨라진다.

스크립트릿 대신 JSTL(JSP Standard Tag Library)과 같은 커스텀 태그 라이브러리를 사용하면 자바 코드를 직접 노출하지 않고 미리 정의된 태그를 통해 기능을 구현할 수 있어 코드의 가독성과 유지보수성을 높일 수 있다. JSP 2.0부터는 `.tag` 확장자를 가진 태그 파일을 이용하여 개발자가 직접 커스텀 태그를 더 쉽게 만들 수 있게 되었다.

MVC(Model-View-Controller) 아키텍처에서 JSP는 주로 사용자에게 보여지는 화면(View)을 담당하는 역할로 사용되며, 자바 서블릿은 요청 처리 및 제어(Controller), 자바빈즈는 데이터 처리(Model)를 담당하는 구조로 활용되는 경우가 많다. 각 JSP 태그의 구체적인 사용법과 기능은 하위 섹션에서 자세히 설명한다.

3. 1. 지시자 (Directives)

JSP에서 지시자(Directive)는 <%@ ... %> 형태로 사용되며, JSP 파일을 처리할 때 필요한 속성들을 웹 컨테이너에 전달하는 역할을 한다.[6] JSP의 여러 태그 중 지시어는 구체적으로 다음과 같은 형식과 기능을 가진다.

JSP 태그 중 지시어
명칭태그설명
지시어<%@ 지시어 %>이 JSP 파일 처리 시 속성을 웹 컨테이너에 전달한다.



지시자에는 여러 종류가 있으며, 주요 종류와 설명은 아래 표와 같다.

지시자의 종류
명칭설명
pageJSP 파일의 인코딩 설정, JSP 프로그램 코딩에 필요한 import 문 선언, 세션 관리 등을 수행한다.<%@ page contentType="text/html; charset=Windows-31J" pageEncoding="Windows-31J" %>
include텍스트 파일이나 다른 JSP 파일을 현재 JSP 파일에 포함(include)시킨다. 이 포함 과정은 JSP가 서블릿으로 변환될 때 수행된다. 포함되는 파일의 확장자로는 JSP 대신 일반적으로 ".jspf"(JSP Fragment)가 사용된다.<%@ include file="header.jspf" %>
taglib커스텀 태그 라이브러리를 사용할 수 있도록 설정을 수행한다. 이를 통해 개발자가 직접 정의한 태그를 JSP 내에서 사용할 수 있게 된다.<%@ taglib uri="http://www.sample.com/tags/test" prefix="tst" %>


3. 2. 선언 (Declarations)

JSP에서 사용하는 변수나 메서드를 선언할 때 사용한다. 태그 형식은 `<%! 선언 %>`이다.

3. 3. 스크립트릿 (Scriptlets)

JSP에서 스크립팅 기능을 위해 사용하는 가장 기본적인 구분 기호는 <% ... %>이며, 이는 JSP ''스크립틀릿''(scriptlet)을 묶는다. 스크립틀릿은 사용자가 페이지를 요청할 때 실행되는 자바 코드 조각이다.[6] 자바 코드가 HTML 중간에 단편적으로 나타나기 때문에 이러한 표기법을 스크립틀릿이라고 부른다.

스크립틀릿 외에도 표현식의 결과를 출력하는 <%= ... %>, 페이지 처리에 대한 지시를 내리는 <%@ ... %> 등의 구분 기호가 사용된다.[6]

스크립틀릿 내의 자바 코드는 반드시 하나의 블록 안에서 완결될 필요는 없다. 페이지 전체의 구문이 올바르다면, HTML 마크업 콘텐츠를 사이에 두고 여러 스크립틀릿에 걸쳐 코드를 작성할 수 있다. 예를 들어, 하나의 스크립틀릿에서 시작된 자바의 `if`, `for`, `while` 블록은 이후 다른 스크립틀릿에서 적절히 닫혀야 페이지가 성공적으로 컴파일된다. 하지만 이러한 방식은 코드와 마크업이 뒤섞여 가독성을 해치고 좋지 않은 프로그래밍 관행으로 이어질 수 있다는 비판이 있다.

여러 스크립틀릿에 걸쳐 분할된 자바 코드 블록 내에 위치한 HTML 콘텐츠는 해당 코드의 영향을 받는다. 예를 들어, `if` 블록 내의 콘텐츠는 조건이 참일 경우에만 출력되며, 반복문(`for`, `while` 등) 내부의 콘텐츠는 반복 횟수만큼 출력에 여러 번 나타날 수 있다.

다음은 JSP 페이지에서 for 루프를 사용한 스크립틀릿의 유효한 예시이다.

세까지 세기:



<% for (int i=1; i<4; i++) { %>

이 숫자는 <%= i %>입니다.



<% } %>

OK.





위 코드의 실행 결과는 사용자의 웹 브라우저에 다음과 같이 표시된다.



세까지 세기:

이 숫자는 1입니다.

이 숫자는 2입니다.

이 숫자는 3입니다.

OK.



스크립틀릿을 사용하면 프로그램 코드와 디자인의 분리가 가능하지만, 복잡한 로직이 들어갈 경우 유지보수가 어려워질 수 있다. 따라서 JSTL과 같은 커스텀 태그 라이브러리를 사용하여 스크립틀릿 사용을 최소화하는 것이 권장된다.

3. 4. 표현식 (Expressions)

JSP 표현식 태그 <%= ... %>는 스크립틀릿 내 자바 표현식의 평가 결과를 웹 페이지의 HTML 내용에 직접 출력하는 데 사용된다.[6] 이 태그 안에 있는 표현식이 계산되고, 그 결과가 문자열 형태로 변환되어 태그가 위치한 자리에 삽입된다. 즉, 자바 코드의 계산 결과를 손쉽게 웹 페이지에 표시할 수 있는 방법이다.

JSP 명세 2.0 버전부터는 표현 언어(Expression Language, EL)가 도입되어 자바 객체의 데이터나 함수에 더 쉽게 접근할 수 있게 되었다. JSP 2.1에서는 통합 표현 언어로 통합되었으며, 이는 자바 서버 페이스 기술에서도 사용된다.[7] EL은 `${...}`와 같은 더 간결한 구문을 사용하여, 자바빈 속성이나 요청(request) 객체에 저장된 속성 값 등을 쉽게 가져올 수 있도록 지원한다. 예를 들어, `javabean`이라는 이름의 객체가 가진 `variable` 속성의 값은 EL을 사용하여 `${javabean.variable}`와 같이 간단하게 표현하고 출력할 수 있다.

3. 5. 액션 (Actions)

JSP 액션은 JSP 페이지 내에서 특정 기능을 수행하도록 미리 정의된 XML 기반의 태그이다.[6] 이를 통해 자바 코드를 직접 사용하지 않고도 서버 측 기능을 실행할 수 있다. 예를 들어, 다른 페이지를 포함하거나 자바빈즈 컴포넌트를 사용하는 등 자주 사용되는 작업을 간편하게 처리할 수 있다. 액션 태그는 `` 형태로 사용하며, JSP에서 자주 수행하는 처리를 태그로 간결하게 기술하는 데 목적이 있다.

또한, 이 기술을 통해 표준 JSP 구문의 확장 기능을 하는 사용자 정의 JSP ''태그 라이브러리''를 만들 수 있다.[8] 그러한 라이브러리 중 하나가 JSTL이다.[9]

기본적으로 제공되는 JSP 액션의 종류는 다음과 같다.

  • `jsp:include`: 실행 시점에 다른 페이지의 내용을 현재 페이지에 포함시킨다.
  • `jsp:param`: ``, ``, `` 태그에 파라미터를 전달할 때 사용한다.
  • `jsp:forward`: 현재 요청의 제어를 다른 페이지로 완전히 넘긴다.
  • `jsp:plugin`: 웹 브라우저에서 자바 애플릿이나 을 실행하기 위한 HTML 코드를 생성한다.
  • `jsp:fallback`: ``으로 지정한 컴포넌트를 실행할 수 없을 때 대신 표시될 내용을 정의한다.
  • `jsp:getProperty`: 자바빈 컴포넌트의 프로퍼티 값을 가져와 출력한다.
  • `jsp:setProperty`: 자바빈 컴포넌트의 프로퍼티 값을 설정한다.
  • `jsp:useBean`: 자바빈 객체를 페이지 내에서 사용하기 위해 찾거나 생성한다.


JSP 2.0 버전에서는 태그 파일을 더 유연하게 작성할 수 있도록 다음과 같은 액션이 추가되었다.

  • `jsp:attribute`: 태그 파일 내에서 동적으로 XML 요소의 속성 값을 정의한다. ``와 함께 사용된다.
  • `jsp:body`: 태그 파일 내에서 동적으로 XML 요소의 본문 내용을 정의한다. ``와 함께 사용된다.
  • `jsp:doBody`: 태그 파일 내에서 정의된 본문(body) 내용을 실행하고 결과를 출력한다.
  • `jsp:invoke`: 태그 파일 내에서 정의된 프래그먼트(fragment)를 실행한다.
  • `jsp:element`: 실행 시점에 동적으로 XML 또는 HTML 요소를 생성한다.

3. 6. 암묵적 객체 (Implicit Objects)

웹 컨테이너는 `request`, `response`, `session`, `application`, `config`, `page`, `pageContext`, `out`, `exception`과 같은 JSP 암시적 객체를 생성한다. JSP 엔진은 변환 단계에서 이러한 객체를 생성한다.

자바 코드 내에서 다음과 같은 변수를 미리 사용할 수 있는 상태(암묵 객체)로 준비되어 있다.

암묵 객체
변수명설명
out`javax.servlet.jsp.JspWriter` 클래스의 객체 변수
request`javax.servlet.http.HttpServletRequest` 클래스의 객체 변수
response`javax.servlet.http.HttpServletResponse` 클래스의 객체 변수
pageContext`javax.servlet.jsp.PageContext` 클래스의 객체 변수
session`javax.servlet.http.HttpSession` 클래스의 객체 변수
application`javax.servlet.ServletContext` 클래스의 객체 변수
config`javax.servlet.ServletConfig` 클래스의 객체 변수
page`javax.servlet.jsp.HttpJspPage` 클래스의 객체 변수
exception`java.lang.Throwable` 클래스의 객체 변수


3. 7. 표현 언어 (Expression Language, EL)

JSP 명세 2.0 버전부터 자바 객체의 데이터와 함수에 쉽게 접근할 수 있도록 표현 언어(Expression Language, EL)가 도입되었다.[7] EL은 `${...}` 와 같은 간결한 구문을 사용하여 웹 개발자가 요청 객체(request object)의 속성이나 자바빈 속성(property) 값을 가져올 수 있게 해준다. 코드는 달러 기호(`$`)와 중괄호(`{ }`) 사이에 작성한다.

JSP 2.1에서는 JavaServer Faces(JSF)에서도 사용되던 표현 언어와 통합되어 통합 표현 언어(Unified EL)가 되었다.[7] 초기 EL은 JSP와 JSF에서 각각 정의되었으나, JSP 2.1과 JSF 1.2 버전에서 하나의 사양으로 합쳐졌다. 이후 2013년에 발표된 EL 3.0에서는 JSP에서 완전히 분리되어 Java EE 7의 독립적인 표준 사양 중 하나가 되었다.[17] EL의 도입으로 기존의 스크립틀릿(scriptlet) 사용을 줄이고 가독성이 높은 JSP 페이지 작성이 가능해졌다.[17]

EL 표현식의 예시는 다음과 같다.



${sessionScope.user.id}



위 예시는 세션(session) 범위(scope)에 저장된 'user' 객체의 'id' 속성 값을 가져오는 코드이다.

EL에서는 다음과 같은 암시적 객체(implicit object)를 바로 사용할 수 있다.

암시적 객체
변수명설명
pageContext`javax.servlet.jsp.PageContext` 클래스의 인스턴스
pageScope페이지(page) 범위의 속성을 저장하는 Map
requestScope요청(request) 범위의 속성을 저장하는 Map
sessionScope세션(session) 범위의 속성을 저장하는 Map
applicationScope애플리케이션(application) 범위의 속성을 저장하는 Map
param요청 파라미터(parameter) 값을 저장하는 Map (단일 값)
paramValues요청 파라미터 값을 저장하는 Map (String배열 값)
header요청 헤더(header) 값을 저장하는 Map (단일 값)
headerValues요청 헤더 값을 저장하는 Map (String배열 값)
cookie쿠키(cookie) 값을 저장하는 Map
initParam웹 애플리케이션 초기화 파라미터(initialization parameter) 값을 저장하는 Map


4. JSP 표준 태그 라이브러리 (JSTL)

JSTL(JavaServer Pages Standard Tag Library|자바 서버 페이지 표준 태그 라이브러리영어, JSP 표준 태그 라이브러리)은 JSP에서 자주 사용되는 표준 기능을 정의한 커스텀 태그 라이브러리이다.[15] 2001년 J2EE 1.3 표준 사양의 일부로 도입되었으며,[15] 표준 JSP 구문의 기능을 확장하는 사용자 정의 JSP ''태그 라이브러리'' 중 하나이다.[8][9]

JSTL은 JSP 페이지 내에서 반복문이나 조건문(자바의 "for" 및 "if" 구문과 유사) 같은 일반적인 작업을 쉽게 처리하도록 돕는다.[9] JSTL은 변수 조작이나 if 문 같은 핵심 기능을 제공하는 코어 라이브러리 외에도, XML 처리, 국제화, SQL 데이터베이스 작업, 문자열 조작과 같은 함수를 모아놓은 라이브러리들을 제공한다.[16]

여러 라이브러리 중 JSTL 코어 라이브러리가 가장 널리 사용된다. JSP 페이지에서 코어 라이브러리를 사용하려면 `taglib` 지시문을 이용해 라이브러리의 URI와 접두사를 지정해야 한다. 일반적으로 코어 라이브러리에는 'c'라는 접두사가 사용된다.

5. XML 기반 JSP

JSP 페이지는 완전하고 유효한 XML 구문으로 작성될 수도 있다.[10] 이러한 JSP 파일은 일반적으로 .jspx 파일 확장자를 사용하며, 이는 애플리케이션 서버가 해당 파일의 XML 구문을 검증하도록 유도하는 역할을 한다.

기존 JSP에서 사용하는 <% ... %>와 같은 일반적인 구문은 XML에서는 유효하지 않다. 따라서 XML 기반 JSP를 작성할 때는 JSP에서 제공하는 대체 태그를 사용해야 한다. 예를 들어, 페이지 지시자인 <%@ page .. %>는 <jsp:directive.page .. /> 태그로 대체하여 작성해야 한다. 또한, 태그 라이브러리를 가져올 때는 일반적인 <%@ taglib .. %> 태그 대신 XML 네임스페이스를 이용하는 방식을 사용한다.

6. 컴파일러

'''자바서버 페이지 컴파일러'''는 JSP를 파싱하여 실행 가능한 자바 서블릿으로 변환하는 프로그램이다.[11] 일반적으로 애플리케이션 서버에 내장되어 있으며, 클라이언트가 특정 JSP 페이지에 처음 접근할 때 자동으로 실행된다.

클라이언트에서 서비스 요청이 오면, 웹 애플리케이션 서버의 서블릿 컨테이너는 해당 JSP 파일을 자바 서블릿 소스 코드로 변환한다. 이후 이 소스 코드는 즉시 컴파일되어 실행되고, 그 결과가 HTML 형태로 클라이언트에게 반환된다. 이 과정 때문에 처음 접근 시에는 컴파일 시간이 소요되지만, 한 번 컴파일된 후에는 다시 컴파일할 필요가 없어 두 번째 접근부터는 응답 속도가 빨라진다.

성능 향상이나 오류 검사를 위해 페이지를 미리 컴파일하는 것도 가능하다. 즉, 웹 애플리케이션을 배포하기 전 빌드 과정의 일부로 JSP를 미리 컴파일해 둘 수 있다.[11]

일부 JSP 컨테이너는 JSP 컴퓨터 파일의 타임스탬프를 주기적으로 확인하여 페이지 변경 여부를 감지하는 기능을 지원한다. 소프트웨어 개발 중에는 변경 사항을 빠르게 반영하기 위해 확인 간격을 짧게(몇 초 단위) 설정하고, 실제 운영 환경(배포된 웹 애플리케이션)에서는 성능을 위해 간격을 길게(몇 분 단위) 설정하거나 아예 확인하지 않도록 설정할 수 있다.[12]

7. 비판

자바 코드(Java code영어)를 JSP에 직접 내장하는 방식은 일반적으로 좋지 않은 관행으로 여겨진다. 조엘 머랙(Joel Murach)과 마이클 어번(Michael Urban)은 저서 "머랙의 자바 서블릿과 JSP(Murach's Java Servlets and JSP)"에서 이러한 방식이 코드의 가독성과 유지보수성을 저하시킬 수 있다고 지적했다. 더 나은 접근 방식은 JSP에 포함된 백엔드 로직을 서블릿의 자바 코드로 이전하는 것이다. 이 시나리오에서 서블릿은 데이터 처리와 같은 로직을 담당하고, JSP는 사용자에게 보여지는 HTML 화면을 생성하는 역할에 집중하여 명확한 관심사 분리 원칙을 유지할 수 있다.

과거 2000년에 "자바 서블릿 프로그래밍(Java Servlet Programming)"의 저자인 제이슨 헌터(Jason Hunter)는 JSP의 여러 "문제점"을 설명했다.[13][18] 그는 JSP가 당시 마이크로소프트의 ASP와 가장 유사한 자바 기반 기술이지만, "자바 플랫폼에 최선의 해결책"은 아닐 수 있다고 평가했다. 이후 헌터는 자신의 웹사이트를 통해 2000년 이후 JSP가 개선되었음을 인정하면서도, 아파치 벨로시티(Apache Velocity)나 Tea와 같은 경쟁 템플릿 엔진 기술들을 대안으로 언급하기도 했다.[13]

오늘날에는 JSP 외에도 다양한 웹 개발 기술들이 존재하며, 특히 규모가 큰 웹 애플리케이션에서 여전히 다수의 JSP 페이지를 중심으로 개발하는 것은 기술 부채로 간주될 수 있다. JSP는 HTML 코드 사이에 `<%`와 `%>` 기호를 사용하여 자바 코드를 직접 삽입하는데, 이를 scriptlet|스크립트릿영어이라고 부른다. 이러한 방식은 개발 초기에는 편리할 수 있으나, 프로그램 로직과 화면 디자인 코드가 섞여 복잡성을 증가시키는 원인이 되기도 한다. 비록 JSTL이나 아파치 스트럿츠 같은 프레임워크에서 제공하는 커스텀 태그 라이브러리를 사용하면 스크립트릿 사용을 줄이고 가독성을 높일 수 있지만, 근본적인 구조적 문제는 여전히 고려 대상이다.

8. 서블릿 컨테이너 (Servlet Containers)

클라이언트에서 서비스가 요청되면, JSP의 실행이 요구되고, JSP는 웹 애플리케이션 서버의 서블릿 컨테이너에서 서블릿 소스 코드로 변환된다. 그 후에 서블릿 소스 코드는 바로 컴파일된 후 실행되어 결과를 HTML 형태로 클라이언트에 돌려준다.[3] 처음 요청 시에는 컴파일 시간이 필요하지만, 한 번 컴파일된 서블릿은 캐시에 저장되어 이후 요청부터는 빠르게 처리된다.

구조적으로 JSP는 자카르타 서블릿의 상위 수준 추상화로 볼 수 있다. JSP는 런타임에 서블릿으로 변환되므로 JSP는 서블릿이다. 각 JSP 서블릿은 원래 JSP가 수정될 때까지 캐시되어 재사용된다.[3]

웹 컨테이너는 request, response, session, application, config, page, pageContext, out 및 exception과 같은 JSP 암시적 객체를 생성한다. JSP 엔진은 변환 단계에서 이러한 객체를 생성한다.

JSP를 실행할 수 있는 환경을 제공하는 대표적인 서블릿 컨테이너는 다음과 같다.


  • 아파치 톰캣
  • 아파치 토미
  • 제티
  • 글래스피쉬
  • 오라클 아이플래닛 웹 서버
  • 웹스피어 애플리케이션 서버

9. 자바 기반 템플릿 대안

조엘 머랙(Joel Murach)과 마이클 어번(Michael Urban)은 저서 "머랙의 자바 서블릿과 JSP(Murach's Java Servlets and JSP)"에서 자바 코드를 JSP에 직접 내장하는 것은 일반적으로 좋지 않은 관행이라고 지적했다. 더 나은 접근 방식은 JSP에 포함된 백엔드 로직을 서블릿의 자바 코드로 옮기는 것이다. 이 구조에서는 서블릿이 데이터 처리 로직을 담당하고, JSP는 HTML 생성을 맡아 명확한 관심사 분리를 구현한다.

2000년, "자바 서블릿 프로그래밍(Java Servlet Programming)"의 저자 제이슨 헌터(Jason Hunter)는 자바서버 페이지(JavaServer Pages, JSP)의 여러 문제점을 설명했다.[13] 그럼에도 그는 JSP가 자바 플랫폼을 위한 최선의 해결책은 아닐 수 있지만, 마이크로소프트의 액티브 서버 페이지와 가장 유사한 자바 기반 솔루션이라고 평가했다. 헌터는 이후 자신의 웹사이트에 2000년 이후 JSP가 개선되었음을 언급하면서도, 경쟁 기술인 아파치 벨로시티(Apache Velocity)와 Tea(템플릿 언어) 등을 함께 소개했다.[13] 오늘날에는 여러 대안 기술이 등장했으며, 복잡한 웹 애플리케이션에서 다수의 JSP 중심 페이지는 기술 부채로 여겨지기도 한다.

JSP 외에 사용될 수 있는 자바 기반 웹 템플릿 기술들은 다음과 같다.

10. 버전 역사

wikitext

자카르타 서버 페이지 API 역사
버전JSR출시일비고
1.01999년 6월 2일
1.11999년 12월 17일
1.2[https://jcp.org/en/jsr/detail?id=53 53]2001년 9월 25일
2.0[https://jcp.org/en/jsr/detail?id=152 152]2003년 11월 24일마지막 릴리스
2.1[https://jcp.org/en/jsr/detail?id=245 245]2006년 5월 11일마지막 릴리스
2.2 (EL 2.2)2009년 12월 10일유지보수판 (2.1 유지 보수 릴리스)
2.32013년 6월 12일유지보수판 (2.1 유지 보수 릴리스 2)


참조

[1] 웹사이트 What is JSP? Introduction to Jakarta Server Pages https://www.infoworl[...] 2022-09-09
[2] 웹사이트 FoRK Archive: Sun JSP 1.0 *not* available http://www.xent.com/[...]
[3] 문서 The Life Cycle of a JSP Page (Sun documentation) http://java.sun.com/[...]
[4] 웹사이트 Understanding JavaServer Pages Model 2 architecture https://www.infoworl[...] JavaWorld 2020-07-17
[5] 웹사이트 OutputStream already obtained (JSP forum at Coderanch) https://coderanch.co[...]
[6] 문서 JSP 1.2 Syntax Reference http://www.oracle.co[...]
[7] 문서 The Unified Expression Language (Sun Developer Network) http://java.sun.com/[...]
[8] 문서 Tag Libraries Tutorial - What is a Tag Library? (Sun) http://java.sun.com/[...]
[9] 웹사이트 JavaServer Pages Standard Tag Library - The Java EE 5 Tutorial https://docs.oracle.[...]
[10] 웹사이트 The Java EE 5 Tutorial, Chapter 6 JavaServer Pages Documents https://docs.oracle.[...] oracle.com 2022-07-27
[11] 웹사이트 IBM Docs https://www.ibm.com/[...]
[12] 웹사이트 SyBooks Online https://infocenter.s[...]
[13] 문서 The Problems with JSP http://servlets.com/[...] 2000-01-25
[14] 문서 サーブレットでは`println`メソッドが頻繁に現れて、可読性が低下するため
[15] 웹사이트 エンタープライズ Java テクノロジ Tech Tips http://otn.oracle.co[...] オラクル 2014-03-12
[16] 웹사이트 Chapter 7 JavaServer Pages Standard Tag Library http://docs.oracle.c[...] オラクル 2014-03-12
[17] 웹사이트 Java EE 7が式言語の拡張を提供 http://www.infoq.com[...] InfoQ 2014-02-23
[18] 문서 The Problems with JSP http://servlets.com/[...] 2000-01-25
[19] 문서 JavaServer Pages Technology http://www.oracle.co[...]



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com