JSP 개념 정리

홍나연·2024년 9월 29일

Backend

목록 보기
2/8

JSP

JSP 개념 | Java Server Pages

Servlet 표준을 기반으로 작성된 웹 어플리케이션 개발 언어

동적으로 웹 콘텐츠를 생성하는 데 사용되는 서버 측 기술로, HTML 내에 Java 코드를 작성하여 웹 페이지를 동적으로 생성할 수 있게 도움

구성 요소

지시자, 스크립트 요소, JSP 기본 객체, 표현 언어, action tag와 JSTL

  • 지시자 (Directive) : JSP 페이지의 전반적인 속성 설정
  • 스크립트 요소 (Scriptlet) | 스크립트릿, 표현식, 선언부 : JAVA 코드를 삽입하여 동적 콘텐츠 생성
  • JSP 기본 객체 (Implicit Objects) : 요청, 응답, 세션 등의 정보를 담고 있는 객체
  • 표현 언어 (Expression Language, EL) : JSP를 좀 더 간결하게 작성하기 위해 사용
  • Action Tag와 JSTL : 특정 작업을 수행하고 태그 기반의 프로그래밍 구조 제공, JSP에서 JAVA 코드를 쉽게 작성할 수 있도록 사용

JSP 기본 태그

태그 유형설명형식
스크립트릿Java 코드를 삽입하여 동적 콘텐츠 생성<% ... %>
선언부메서드와 변수를 정의<%! ... %>
표현식표현식을 평가하고 결과를 출력<%= ... %>
주석JSP 페이지 설명 작성<%-- ... --%>
지시자JSP 페이지의 설정(속성)을 정의하는 태그<%@ %>

스크립트릿 (Scriptlet)

JSP 페이지 내에서 Java 코드를 삽입할 때 사용하는 요소
<% ... %>

<%
    String message = "Hello, JSP!";
    out.println(message);
%>

선언부 (Declaration)

JSP 페이지에 메서드와 멤버변수를 정의할 수 있는 영역
<%! ... %>

<%! 
    public String greet() {
        return "Welcome to JSP!";
    }
%>

선언부 vs 스크립트릿

특성선언부 (Declaration)스크립트릿 (Scriptlet)
구문<%! ... %><% ... %>
목적변수를 선언하고 메서드를 정의동적인 Java 코드를 실행
범위전역 범위(JSP 전체에서 사용 가능), 메서드 안에 선언로컬 범위(스크립트릿 내에서만 사용 가능), 클래스 안에 선언
실행 시점JSP 페이지 로드 시 초기화요청 시마다 실행
<%! 
    // 선언부에서 메서드 선언
    public String greet(String name) {
        return "Hello, " + name + "!";
    }
%>

<% 
    // 스크립트릿에서 메서드 호출
    out.println(greet("John"));
%>
  • 스크립트릿 : JSP 요청 시 실행되는 동적인 자바 코드를 작성하는 공간으로, 메서드 선언은 불가능
  • 선언부 : JSP 페이지에서 전역 변수나 메서드를 정의하는 데 사용되며, 메서드 선언은 여기서 가능

표현식 (Expression)

Java 객체의 속성을 출력할 때 사용
변수의 값, 계산식, 함수를 호출한 결과를 문자열 형태로 웹문서에 출력
<%= ... %>

<%= name() %>

out.print(name);

⇒ servlet 코드가 out.print(name)으로 바꿔서 출력해준다고 보면 됨

주석 (Comment)

JSP 페이지 내에서 코드에 대한 설명 추가
HTML 주석문은 클라이언트에게 보여지지만, JSP 주석문은 보여지지 않음
<%-- ... --%>

<%-- This is a comment --%>

JSP로 바뀔 때 JSP주석은 아예 날라가서 읽혀짐

지시자 (Directive)

JSP 페이지의 속성을 설정하는 데 사용되며, 페이지의 전반적인 정보를 정의

1. Page Directive

속성설명예시
contentTypeJSP 페이지의 콘텐츠 타입 설정<%@ page contentType="text/html; charset=UTF-8" %>
language사용할 프로그래밍 언어 설정 (기본값 : Java)<%@ page language="java" %>
import사용할 Java 클래스나 패키지를 임포트<%@ page import="java.util.*, java.sql.*" %>
session세션 사용 여부 설정<%@ page session="true" %>
isErrorPage오류 페이지로 사용될 수 있도록 설정<%@ page isErrorPage="true" %>

2. Include Directive

: 페이지가 로드될 때 다른 파일의 내용을 포함하므로 코드의 재사용성을 높임

속성설명예시
file포함할 파일의 경로 설정<%@ include file="header.jsp" %>

3. Taglib Directive

: 코드의 가독성을 높이고 다양한 기능을 제공하여 JSP 페이지의 개발을 간편하게 만들어 줌

속성설명예시
uri태그 라이브러리의 URI 정의<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

페이지 이동

2가지 방식
포워드(Forward)와 리다이렉트(Redirect)는 둘 다 웹 애플리케이션에서 페이지 간 이동을 처리하는 방법이지만, 동작 방식과 특징에 차이 존재

포워드(Forward)리다이렉트(Redirect)
서버 내부에서 요청을 전달클라이언트가 서버에 다시 요청
URL이 변경되지 않음URL이 변경됨
하나의 요청/응답 사이클두 번의 요청/응답 사이클
클라이언트는 페이지 이동을 인식하지 못함클라이언트는 페이지 이동을 인식함
성능이 상대적으로 빠름성능이 조금 더 느릴 수 있음

1. 포워드(Forward)

: 포워드는 서버 내부에서 페이지를 이동하는 방식
클라이언트는 다른 페이지로 이동한 사실을 알지 못하고, 서버가 내부적으로 요청을 다른 리소스(JSP, 서블릿 등)로 전달

  • 동작 방식
    • 서버가 클라이언트로부터 받은 요청을 다른 페이지로 전달하고, 그 페이지의 응답을 클라이언트에게 전달
    • URL 변경 X
      즉, 클라이언트는 최초에 요청한 URL만 보게 됨
    • 서버 내부에서만 이동이 이루어지므로 클라이언트는 페이지 이동이 일어난 것을 알 수 없음
  • 사용 상황
    • 데이터를 유지하면서 페이지를 전환하고자 할 때 사용
      ex) 폼에서 입력된 데이터를 다음 페이지로 전달하는 경우
  • 장점
    • 서버 내부에서 처리되므로 성능이 조금 더 빠를 수 있음
    • 클라이언트 측에서 URL이 바뀌지 않으므로 자연스럽게 페이지 전환이 이뤄짐
  • 단점
    • 브라우저의 주소창 URL이 바뀌지 않기 때문에 사용자가 혼동할 수 있음
    • 브라우저의 새로고침을 하면 이전 요청이 다시 처리될 수 있어 문제가 발생할 수 있음
  • 예시
    RequestDispatcher dispatcher = request.getRequestDispatcher("nextPage.jsp");
    dispatcher.forward(request, response);

2. 리다이렉트(Redirect)

: 리다이렉트는 클라이언트가 서버에 새로운 요청을 하도록 하는 방식
서버는 클라이언트에게 다른 URL로 요청하라고 응답하며, 클라이언트는 그 URL로 다시 요청을 보냄

  • 동작 방식
    • 서버는 클라이언트에게 새로운 URL로 이동하라는 응답을 보내고, 클라이언트는 그 URL로 다시 요청
    • URL 변경 O
      즉, 클라이언트는 새로운 요청을 통해 새로운 페이지로 이동
  • 사용 상황
    • 페이지 이동 후 클라이언트가 새로운 요청을 해야 할 때 사용
      주로 폼 처리가 완료된 후 결과 페이지로 이동하거나, 로그아웃 후 메인 페이지로 이동하는 경우에 사용
  • 장점
    • 클라이언트가 새로운 요청을 보내므로 브라우저의 주소창에 새로운 URL이 표시
    • 새로고침을 하더라도 이전 요청이 다시 처리되지 않으므로 데이터 중복 문제 X
  • 단점
    • 두 번의 요청/응답이 발생하므로 포워드 방식보다 성능이 조금 느릴 수 있음
  • 예시
    response.sendRedirect("nextPage.jsp");

0개의 댓글