플레이데이터 - 22일차 JSP

Kim Hyen Su·2023년 7월 31일

🎇 JSP

😊JSP 특징

  • JSP는 서블릿 기술의 확장
  • JSP는 유지 관리가 용이
  • JSP는 빠른 개발이 가능
  • JSP로 개발 시 코드의 길이를 줄일 수 있음.

😊JSP 페이지 처리과정

  1. 웹브라우저가 웹서버에 JSP 페이지 요청.
  2. 웹서버는 jsp 확장자를 확인 후 컨테이너에 전달.
  3. 컨테이너는 JSP 페이지를 찾아서 서블릿 프로그램인 클래스명_jsp.java 파일로 변환.
  4. JSP 컨테이너가 서블릿 프로그램을 컴파일 하여 클래스명_jsp.class로 만들고 이를 웹서버로 전달함.
  5. 웹서버는 정적 웹페이지처럼 *.class의 실행 결과를 웹브라우저에 응답으로 전달하므로 웹브라우저는 새로 가공된 HTML 페이지를 동적으로 처리한 결과를 출력함.

😊JSP 페이지 생명주기

JSP 페이지를 컴파일한 *.class 파일에는 _jspInit(), _jspService(), _jspDestroy() 메서드가 존재한다.

JSP 생성부터 파괴까지 아래의 과정을 거친다.

  1. 번역단계 : JSP 컨테이너가 JSP 소스 파일을 서블릿 클래스로 변환.

    • JSP 컨테이너가 JSP 파일을 읽고 JSP 태그 구문을 분석한다.
  2. 컴파일단계 : 번역 단계에서 생성된 서블릿 클래스를 컴파일해준다.

    • JSP 페이지 내 스크립트 태그를 사용하여 삽입된 자바 코드의 구문을 검사.
  3. 로딩 및 초기화단계 : 컴파일 된 서블릿 클래스를 로딩하고 클래스의 인스턴스를 작성한다. 그 다음 컨테이너에서 서블릿의 init() 메서드를 호출하여 인스턴스를 초기화 한다. 초기화는 한번만 실행된다.

  4. 실행단계 : 각 클라이언트의 요청에 대해 JSP 컨테이너가 요청 및 응답 객체를 전달하는 service() 메서드를 호출한다. 이 단계는 JSP 생명 주기가 끝날 때까지 모든 클라이언트의 요청에 대해 상호 작용한다.

  5. 소멸단계 : JSP 컨테이너는 실행되고 있는 JSP를 destroy() 메서드를 사용하여 제거한다. 이 메서드는 데이터베이스 연결 해제 또는 열려 있는 파일 닫기 등을 수행 시 사용된다.

_jspInit() & _jspDestory() 메서드는 컨테이너가 기본 기능을 제공하기 때문에 오버라이딩이 선택사항이지만 기본적으로 _jspService() 메서드는 컨테이너가 추가하기 때문에 오버라이딩이 불가하다.

😊 스크립트 태그

스크립트 태그의 종류

  • 선언문 : <%! ... %> 자바 전역변수나 메서드를 정의하는데 사용.
  • 스크립틀릿 : <% ... %> 자바 코드를 작성하는데 사용.
  • 표현문 : <%= ... %> 변수, 계산식, 메서드 호출 결과를 문자열 형태로 출력하는데 사용.

선언문과 스크립틀릿 태그 비교

선언문

  • 변수뿐만 아니라 메서드 선언 가능
  • 서블릿 프로그램으로 변환 시 _jspService() 메서드 외부 배치.(전역)

스크립틀릿

  • 메서드 없이 변수만 선언 가능
  • 서블릿 프로그램으로 변환 시 _jspService() 메서드 내부 배치.(지역)

😊 디렉티브 태그

  • 디렉티브 태그는 JSP 페이지를 어떻게 처리할 것인지 설정하기 위한 태그.
  • JSP 페이지가 서블릿 클래스로 변환될 때 JSP 페이지와 관련된 정보를 JSP 컨테이너에 지시하는 메시지.
  • JSP 페이지를 수정하여 다시 컴파일 하는 경우에만 실행되는 태그이기 때문에 개별 HTML 응답에 특별한 영향을 미치지는 않음.
  • <%@ ... %>을 사용.

디렉티브 태그의 종류

  • page
    • 형식 : <%@ page ... %>
    • JSP 페이지에 대한 정보를 설정.
    • 하나의 page 디렉티브 태그에 하나 또는 여러 개의 속성을 설정이 가능.
  • include
    • 형식 : <%@ include %>
    • JSP 페이지의 특정 영역에 다른 문서를 포함.
  • taglib
    • 형식 : <%@ taglib %>
    • JSP 페이지에서 사용할 태그 라이브러리를 설정.

page 속성

  • language : JSP 페이지에서 사용할 프로그래밍 언어 설정(default : java)
  • contentType : JSP 페이지가 생성할 문서의 콘텐츠 유형을 설정 (default : text/html)
  • pageEncoding : JSP 페이지의 문자 인코딩 설정(default : ISO-8859-1)
  • import : JSP 페이지에서 사용할 자바 클래스 설정
  • session : JSP 페이지의 세션 사용여부 설정(default : true)
  • buffer : JSP 페이지의 출력 버퍼 크기 설정(default : 8KByte)
  • autoFlush : 다종으로 출력 버퍼를 비우는 것을 제어(default :true)
  • isThreadSafe : JSP 페이지의 멀티스레드 허용 여부를 설정(default : true)
  • info : JSP 페이지에 대한 설명을 설정.
  • errorPage : JSP 페이지에 오류가 발생 시 보여줄 오류페이지 설정
  • isErrorPage : 현재 JSP 페이지가 오류 페이지인지 여부 설정(default : false)
    - true로 설정 시, 내장 객체인 exception 변수 사용이 가능.
  • isELIgnored : JSP 페이지의 EL 지원 여부 설정.(default : true)
  • isScriptingEnabled : JSP 페이지의 스크립트 태그 사용 여부 설정

include 태그 기능과 사용법

  • JSP 페이지의 특정 영역에 외부 파일의 내용을 포함하는 태그
  • 포함 가능한 외부 파일 : HTML, JSP, 텍스트 파일 등...
  • <%@ include file="파일명" %>

taglib 태그 기능과 사용법

  • <%@ taglib prefix="태그 식별자" uri="경로" %>

  • uri 값은 JSP 컨테이너에 사용자가 정의한 태그 라이브러리의 위치를 알려준다.

😊 JSP 주석처리

  • <!-- --> : HTML 주석, 프로그래밍에 반영되지는 않지만 웹브라우저에 명시되는 주석.
  • <%-- --> : JSP 주석, 어디에도 노출되지 않는 주석.

😊 액션태그

  • 서버나 클라이언트에게 어떤 행동을 하도록 명령하는 태그.
  • XML 형식의 <jsp: ... />을 사용.

액션태그의 종류

  • forward : 현재 JSP 페이지에서 다른 페이지로 이동과 같은 페이지 흐름을 제어.
  • include : 외부 페이지의 내용을 포함.
  • useBean : JSP 페이지에 빈 객체를 설정.
  • setProperty : 빈 객체의 프로퍼티 값 설정.
  • getProperty : 빈 객체의 프로퍼티 값 조회.
  • param : 태그에 인자를 추가.
  • XML 요소를 동적으로 생성하는 액션 태그
    • element : 동적 XML 요소 설정.
    • attribute : 동적으로 정의된 XML 요소의 몸체를 설정.
    • body : 동적으로 정의된 XML 요소의 몸체를 설정.
  • text : JSP 페이지 및 문서에서 템플릿 텍스트를 작성.

forward 액션태그 기능과 사용법

  • JSP 컨테이너는 JSP 페이지에서 forward 액션태그를 만나면 그 전까지 출력 버퍼에 저장되어 있던 모든 내용을 삭제하고 forward 액션태그에 설정된 페이지로 프로그램 제어가 이동.

  • forward와 redirect 차이점
    - redirect와 forward는 페이지가 전환된다는 점에서 비슷한 역할을 한다. 하지만 페이지를 전환하는 주체가 다르다는 점에 차이가 있다.

    • redirect는 페이지 전환 주체가 클라이언트 측이며, forward는 페이지 전환 주체가 서버 측이다.
    • 클라이언트가 주체가 되어 페이지를 전환되는 방법은 접속한 URL이 아닌 다른 URL로 직접 접속하는 방법 밖에 없다. 반대로 서버가 전환 주체가 되면 URL 주소가 바뀌지 않고도 서버 내부의 동작을 통해 다른 응답을 클라이언트에게 전송할 수 있다.
  • redirect란?

    • 서버에서 요청한 URL에 대한 응답에서 다른 URL로 재접속하라고 브라우저에 명령을 보내는 것을 말한다. Re-Direct를 직독하면 'URL을 다시 가리킨다.'라는 뜻을 가진다. 클라이언트는 해당 URL로 다시 요청하게 되고, redirect하게 되면 URL 주소가 바뀌면서 다시 접속되는 것을 확인할 수 있다.
    • 웹브라우저(클라이언트)는 서버에서 Redirect를 하라는 응답코드인 300번 대 코드가 응답헤더에 포함되어 오면, redirect 할 URL로 다시 요청을 보낸다.
  • forward란?

    • 서버 내부에서 발생하는 호출이다. 클라이언트의 URL에 대한 요청이 들어오면 해당 URL이 다른 URL로 forwarding 된 것이 확인되었을 경우 서버에서 forwarding된 URL의 리소스를 확인하여 클라이언트에 응답한다.
    • forwarding이 일어나면 클라이언트 단에서는 아무런 동작을 하지 않으며 모든 동작을 서버에서 처리한다. 따라서 클아이언트에서 요청한 URL은 물론 요청정보는 바뀌지 않는다.
  • <jsp:forward page="파일명"/>

include 액션태그 기능과 사용법

  • include 액션태그는 include 디렉티브 태그처럼 JSP 페이지의 특정 영역에 외부 파일의 내용을 포함하는 태그.

  • <jsp:include page="파일명" flush="false"/>

  • flush 속성 값은 설정한 외부 파일로 제어가 이동할 때 현재 JSP페이지가 지금까지 출력버퍼에 저장한 결과를 처리한다. 기본값은 false이고, true로 설정하면 외부 파일로 제어가 이동할 때 현재 JSP 페이지가 지금까지 출력 버퍼에 저장된 내용을 웹 브라우저에 출력하고 출력 버퍼를 비운다.

  • include 액션 태그는 forward 액션 태그처럼 외부 파일을 포함한다는 점이 비슷하지만 포함된 외부 파일이 실행된 후 현재 JSP 페이지로 제어를 반환한다는 것이 가장 큰 차이점이다.

  • JSP 컨테이너는 현재 JSP 페이지에서 include 액션 태그를 만나면 include 액션태그에 설정된 외부 파일의 실행 내용을 현재 JSP 페이지의 출력 버퍼에 추가 저장되어 출력함.
    - 즉, include 액션 태그 이후에 작성된 코드는 정상 출력된다.

flush 속성값
일반적으로 flush 속성은 false로 지정하는 것이 좋다.
true로 지정 시 일단 출력 버퍼를 웹브라우저에 전송하는데 이때 헤더 정보도 같이 전송되며, 웹브라우저에 전송된 다음 헤더 정보를 추가해도 결과가 페이지에 반영되지 않는다.

include 액션 태그와 include 디렉티브 태그 차이점

  • include 액션태그
    • 기능 : 별도의 파일로 요청 처리 흐름을 이동.
    • 데이터 전달 방법 : request 기본 내장 객체 또는 param 액션태그를 이용하여 파라미터를 전달.
    • 용도 : 화면 레이아웃의 일부를 모듈화할 때 주로 사용.
    • 동적 페이지에 사용함.
  • include 디렉티브 태그
    - 기능 : 현재 페이지에 다른 페이지의 결과를 삽입.
    • 데이터 전달 방법 : 페이지 내의 변수를 선언한 후 변수에 값을 저장.
    • 용도 : 다수의 JSP 웹 페이지에서 공통으로 사용되는 코드나 저작권과 같은 문장을 포함하는 경우에 사용.
    • 정적 페이지에 사용함.

param 액션 태그의 기능과 사용법

  • param 액션 태그는 현재 JSP 페이지에서 다른 페이지에 정보를 전달하는 태그.

  • param 태그는 단독으로 사용이 불가능하며, jsp:forward 또는 jsp:include 태그의 내부에 사용함.

  • 여러 정보 전달 시 다중의 param 액션 태그 사용이 가능하다.

  • 전달한 정보는 request 내장 객체의 getParameter("name") 메서드로 접근이 가능하다.

useBean 액션 태그의 기능과 사용법

  • 자바 클래스를 빈 객체로 생성하여 사용하는 태그.

  • 자바 빈 객체는 일반적으로 클래스 내 멤버변수인 프로퍼티의 데이터를 조회하거나 저장하는 메서드로 구성되어 있다.

  • jsp:useBean id="식별명" class="패키지명을 포함한 클래스명" scope="범위"

    • scope : 빈 객체가 저장되는 영역을 설정, page(기본값), request, session, application 중 하나의 값을 사용.

자바 빈 객체 규칙

  • 자바 클래스는 java.io.Serializable 인터페이스를 구현해야 한다.( 네트워크로 전송 시 직렬화를 위해 구현.)
  • 클래스 내 기본 생성자가 있어야 한다.
  • 클래스 내 멤버변수가 private으로 접근 제한되어 있어야 한다.
  • 클래스 내 멤버변수의 Getter/Setter가 정의되어 있어야 한다.

setProperty 액션 태그로 프로퍼티 값 저장

  • 자바 빈 객체에 접근하여 멤버변수의 값을 저장하는 태그.

  • <jsp:setProperty name="빈 객체 식별명" property="프로퍼티명" value="값" />

getProperty 액션 태그로 프로퍼티 값 조회

  • 자바 빈 객체에 접근하여 멤버변수의 값을 조회하는 태그.

  • <jsp:getProperty name=“빈 객체 식별명” property=“프로퍼티명” />

😊 JSP 내장객체

  • JSP 컨테이너에 미리 정의된 객체로서, JSP 페이지에서 사용이 가능.
  • JSP 페이지 내에서 import문 없이 자유롭게 사용이 가능하다.
  • 내장 객체는 서블릿에서 모두 _jspService() 메서드 내부에 정의되어 있다.

내장객체의 종류

  • javax.servlet.http.HttpServletRequest : 웹브라우저 HTTP 요청 정보를 저장.
  • javax.servlet.http.HttpServletResponse : 웹브라우저의 HTTP 요청에 대한 응답정보를 저장.
  • javax.servlet.jsp.jspWriter : JSP 페이지에 출력할 내용을 담고 있는 출력 스트림.
  • javax.servlet.http.HttpSession : 웹브라우저의 정보를 유지하기 위한 세션 정보를 저장.
  • javax.servlet.ServletContext : 웹 애플리케이션의 콘텍스트 정보를 저장.
  • javax.servlet.jsp.PageContext : JSP 페이지의 정보를 저장.
  • java.lang.Object : JSP 페이지를 구현한 자바 클래스로 JSP 페이지 자체를 나타냄.
  • javax.servlet.ServletConfig : JSP 페이지의 설정 정보를 저장.
  • java.lang.Throwable : JSP 페이지의 예외 발생 처리.

모든 내장 객체는 JSP 컨테이너가 관리하는 객체로 request, session, application, pageContext를 이용하여 속성을 관리할 수 있다.

속성 처리 메서드의 종류

  • void setAttribute(String name, Object value) : 해당 내장 객체의 속성명이 name인 속성값을 value로 저장.
  • Object getAttribute(String name) : 해당 내장 객체의 속성명이 name인 속성 값을 조회.
  • void removeAttribute(String name) : 해당 내장 객체의 속성명이 name인 속성을 삭제.
  • java.Util.Enumeration getAttributeNames() : 해당 내장 객체의 모든 속성명을 가져옴.(단, pageContext 내장 객체는 제공하지 않음)

😊 JSTL

  • JSP Standard Tag Library
  • JSP에서 스크립틀릿을 사용하지 않고 HTML 형식을 유지하면서 조건문, 반복문, 간단한 연산과 같은 기능을 손쉽게 사용할 수 있도록 지원하기 위해 만들어진 표준 커스텀 태그 라이브러리.

자바 빌드 도구(JSTL 라이브러리 추가)

  • Maven과 Gradle
    -

    • Maven : 빌드 설정을 pon.xml 파일에 작성함.
      • xml 구조이기 때문에 코드가 길어질수록 스크립트 내용이 길어지고 가독성이 떨어짐.
    • Gradle : Groovy라고 하는 JVM 기반 언어를 통해 프로그램 구조 설정함.
      • 상대적으로 구조가 간단하고 가독성이 좋음.
  • 빌드 도구 사용하는 주요 목적
    1. 컴파일 / 실행 설정과 라이브러리 설정

    1. 꼭 필요한 핵심 라이브러리만 설정 파일에 등록해두면 해당 라이브러리에서 필요로 하는 다른 라이브러리는 자동으로 함께 설치됨.
  • Maven 사용 방법
    - 프로젝트 → [Configure] → [Convert to Maven project]

    • pom.xml 파일 생성 후 [MavenRepository](https://mvnrepository.com MavenRepository) 에서 필요한 라이브러리 검색 후 <dependencies> </dependencies> 태그 안에 붙여넣기.
    • pom.xml → [Maven] → [Update Project]

JSTL 사용

  • JSTL 사용을 위해서는 taglib 지시어에 사용할 라이브러리를 등록해줘야 함.
  • <%@ taglib prefix="태그 식별자" uri="http://java.sun.com/jsp/jstl/사용할 라이브러리명" %>

core 라이브러리

  • <c:set> : 변수 선언과 초기화 기능을하는 커스텀 액션.
  • <c:out> : 출력을 위한 커스텀 액션.
  • <c:if> : 자바 if문과 같은 역할을 하는 커스텀 액션.
    • 자바와 달리 조건식을 test라는 attribute의 값으로 지정함.
  • <c:forEach> : 자바 for문과 같은 역할을 하는 커스텀 액션.
    • var : 변수명, begin : 시작값, end : 끝값, step : 증가치, items : 데이터군을 담는 속성, varStatus : 각 항목을 나타내는 속성.
  • <forTokens> : 자바의 java.util.StringTokenizer 클래스와 for문을 합친 기능을 제공.
    • items : 토큰을 포함하는 문자열 지정
    • delims : 토큰을 분리하는 구분자 지정
    • var : 분리된 토큰을 대입할 변수명 지정
    • varStatus : 분리된 토큰 하나를 나타내는 변수명 지정

varStatus 관련 속성

  • status.index : 0부터 시작하는 루프의 인덱스 입니다.

  • status.count : 현재 몇번째 루프인지 값입니다. 1부터 시작합니다.

  • status.current : 현재 아이템입니다. var 속성의 값과 같습니다.

  • status.first : 현재가 첫번째 루프이면 참입니다.

  • status.last : 현재가 마지막 루프이면 참입니다.

  • status.begin : begin 속성을 사용했을 경우 그 값이 나옵니다.

  • status.end : end 속성을 사용했을 경우 그 값이 나옵니다.

  • status.step : step 속성을 사용했을 경우 그 값이 나옵니다.

profile
백엔드 서버 엔지니어

0개의 댓글