JSP(Java Server Pages) 한 방에 정리

장유진·2025년 2월 13일

JSP란?

Java Server Pages의 약자로, HTML 소스코드 안에 자바 소스코드를 삽입하여 웹 페이지를 동적으로 생성할 수 있게 하는 기술이다.

1. 기초 문법

1-1. 템플릿 데이터

HTML, CSS, JS, JSON, XML, 일반 텍스트 등이 여기에 해당한다.

템플릿 데이터는 클라이언트로 그대로 출력된다.

1-2. JSP 전용 태그

스트립트릿(Scriptlet)

<% 코드 %>

태그 안에 실행될 자바 코드를 입력하면 된다.

스크립트릿 태그 안에 작성한 코드는 서블릿 파일을 만들 때 그대로 복사된다.

선언문

<%! 코드 %>

변수, 메서드 등을 선언할 때 사용한다.

여기에서 선언된 변수와 메서드는 서블릿 클래스의 멤버가 된다.

표현식

<%= 코드 %>

문자열을 출력할 때 사용한다.

따라서 표현식 태그 안에는 결과를 반환하는 자바 코드가 와야 한다.

지시어

  • page
    • <%@ page … %>
    • JSP 페이지와 관련된 속성을 정의할 때 사용하는 태그이다.
  • include
    • <%@ include %>
    • 현재 JSP 파일 안에 다른 HTML, JSP 문서를 포함시킨다.
  • taglib
    • <%@ taglib … %>
    • 태그 라이브러리를 사용하기 위해 선언한다.

1-3. JSP Action

JSP에서 기본으로 제공하는 태그들의 집합니다.

액션설명
<jsp:useBean>자바 인스턴스를 준비한다. 보관소에서 자바 인스턴스를 꺼내거나 자바 인스턴스를 새로 만들어 보관소에 저장하는 코드를 생성한다. 자바 인스턴스를 자바 빈(Java Bean)이라고 부른다.
<jsp:setProperty>자바 빈의 프로퍼티 값을 설정한다.자바 객체의 settet()를 호출하는 코드를 생성한다.
<jsp:getProperty>자바 빈의 프로퍼티 값을 꺼낸다.자바 객체의 getter()를 호출하는 코두를 생성한다.
<jsp:include>정적(HTML, 텍스트 파일 등) 또는 동적(서블릿/JSP) 자원을 including하는 자바 코드를 생성한다.
<jsp:forward>현재 페이지의 실행을 멈추고 다른 정적, 동적 자원으로 forwarding하는 자바 코드를 생성한다.
<jsp:param>jsp:include, jsp:forard, jsp:params의 자식 태그로 사용한다.ServletRequest 객체에 매개변수를 추가하는 코드를 생성한다.
<jsp:plugin>OBJECT 또는 EMBED HTML 태그를 생성한다.
<jsp:element>임의의 XML 태그나 HTML 태그를 생성한다.

1-4. JSP 내장 객체

JSP에서 자바 코드를 작성할 때 별도의 선언 없이 사용할 수 있는 자바 객체이다.

종류: request, response, pageContext, session, application, config, out, page, exception

1-5. Expression Language(EL)

JSP 2.0에 추가된 개념으로 내장 객체를 보다 간결한 표현으로 접근할 수 있다.

null에 대해 좀 더 관대하고 데이터 형 변환을 자동으로 해준다는 특징이 있다.

사용법: ${변수}

아래의 두 가지 방법은 동일한 결과를 보인다.

// JSP Expression
<%=request.getParameter("name") %>
<%=request.getParameter("address") %>

// EL
${param.name}
${param.address}

EL 연산자

  • 산술 연산자: +, -, *, /, %, mod, div
  • 논리 연산자: &&, ||, !, and, or, not
  • 비교 연산자: ==, !=, <, >, <=, >=, eq, ne, lt, get, le, ge
  • null 검사: empty (값이 null이거나 공백문자인지를 판단하는 연산자)
  • 삼항 연산자: '조건식' ? '값1' : '값2'
  • 할당 연산자: 변수명=값

EL 표기법

  • ${}: JSP가 실행될 때 즉시 반영됨. 객체 프로퍼티 값을 꺼낼 때 주로 사용
  • #{}: 시스템에서 필요하다고 판단될 때 그 값을 사용함. 사용자 입력값을 객체의 프로퍼티에 담는 용도로 주로 사용

EL 예약 키워드
and, or, not, eq, ne, lt, gt, le, ge, true, false, null, instanceof, empty, div, mod

⚠️ 서블릿 보관소에 객체를 저장할 때 key가 EL 예약 키워드이면 에러가 발생한다.

EL에서 접근 가능한 내장 객체

  • pageScopepageContext의 속성
  • requestScoperequest 객체의 속성
  • sessionScopesession 객체의 속성
  • applicationScopeapplication 객체의 속성
  • paramrequest.getParameter() 호출
  • paramValuesrequest.getParameterValues()
  • headerrequest.getHeader()
  • cookierequest.getCookies()

2. JSP 태그 라이브러리리 (JSTL)

JSTL은 JSP Standard Tag Library의 약자이다.

JSP에서 반복, 조건, 데이터 관리 포맷, XML 조작, 데이터베이스 엑세스 등의 기능을 구현할 수 있도록 해준다.

JSTL을 사용하기 위해서는 라이브러리를 별도로 다운받아 세팅해야 한다. (참고) ⇒ 링크달기!

먼저 위에서 설명한 taglib 태그를 사용하여 다음과 같은 형식으로 선언한다.

<%@ taglib prefix="접두사" uri="URI" %>

태그 라이브러리 별 선언문

  • Core: <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    • 일반 프로그램 언어에서 제공하는 변수선언, 조건/제어/반복문 등의 기능을 제공한다.
  • XML: <%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
    • XML 문서를 처리할 때 필요한 문서를 제공한다.
  • I18N: <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
    • 숫자, 날짜, 시간을 포맷팅하는 기능과 국제화, 다국어 지원 등을 제공한다.
  • Database: <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
    • 데이터베이스의 데이터를 입력/수정/삭제/조회하는 기능을 제공한다.
  • Functions: <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
    • 문자열을 처리하는 함수를 제공한다.

prefix를 반드시 이렇게 지정해야 하는 건 아니지만 JSTL에서 제안하는 표준 접두사이므로 동일하게 사용하는 것이 좋다.

JSTL 주요 문법은 여기를 참고!

3. 동작 원리

JSP로 작성된 파일은 웹 서버에서 실행되고, 그 결과를 HTML로 변환하여 클라이언트로 전송된다.

즉, 웹 서버가 클라이언트로부터의 요청 내용을 분석하고 서블릿 컨테이너에 전달하면 컨테이너가 HTML 문서를 반환하는 과정이라고 볼 수 있다.

JSP의 동작 원리에 대해 제대로 알기 위해서는 Servlet이라는 개념에 대해 알아야 한다.

3-1. Servlet(서블릿)이란?

간단하게 말하면, 클라이언트의 요청을 처리하고 그 결과를 반환하는 프로그래밍 기술이다.

웹 요청이 오면 서블릿 컨테이너가 JSP 페이지를 파싱하여 자바 파일로 변환하는데, 이것이 서블릿 객체가 된다.

서블릿 객체는 Servlet 클래스의 구현 규칙을 지켜 생성되고, 해당 서블릿에서 service() 메서드를 호출하여 비즈니스 로직을 수행하게 된다.

3-2. 서블릿 컨테이너란?

서블릿을 관리하고 실행시켜주는 프로그램이다. 대표적인 예시로는 Apache Tomcat을 들 수 있다. 개발자가 비즈니스 로직 작업에만 전념할 수 있도록 요청이 올 때마다 웹 서버에서 반복적으로 수행해야 하는 작업을 대신 수행하는 역할을 한다.

반복적인 작업 예시:

  • 서버 TCP/IP 연결 대기, 소켓 연결
  • Request, Response 객체 생성
  • HTTP 요청 메시지 파싱 후 Request 객체에 데이터 넣기
  • TCP/IP에 응답 전달, 소켓 종료

3-3. 서블릿 생명주기 메서드

  • init()
    • 서블릿 요청 시 맨 처음 한 번만 호출됨
    • 서블릿 생성 시 초기화 작업을 주로 수행
  • service()
    • 서블릿 요청 시 매번 호출됨
    • 클라이언트가 요청하는 작업 수행
    • HTTP 요청 타입(GET, POST, PUT, DELETE)에 맞는 메서드(doGet, doPost, doPut, doDelete)를 호출하고 동적 웹 페이지를 생성
  • destroy()
    • 서블릿이 기능을 수행하고 메모리에서 소멸될 때 호출됨
    • 서블릿의 마무리 작업을 주로 수행

3-4. Servlet 클래스 구현 형식

public class MyServlet extends HttpServlet {
	@Override
    public void init() {
    ...
	}
    
    @Override
    public void doGet(HttpServletRequest req, HttpServletResponse resp) {
    ...
    }
    
    @Override
    public void destroy() {
    ...
    }
}

3-5. Servlet 동작 과정

  1. 웹 브라우저의 요청 시 HTTP 요청 메시지가 서블릿 컨테이너에 전송된다.
  2. 컨테이너는 HTTP 요청 메시지를 파싱한 후 request, response 객체를 생성한다.
  3. 컨테이너는 web.xml 또는 @WebServlet을 기반으로 요청 URL과 매핑된 서블릿 객체를 찾는다.
  4. 해당 서블릿의 최초 요청이었을 경우, 서블릿 객체를 생성한 후 로직을 수행한다.
  5. 컨테이너는 response 객체에 담긴 데이터로 HTTP 응답 메시지를 생성하고 웹 브라우저로 전송한다.
  6. 전송 완료 후 컨테이너는 request, response 객체를 제거한다.
profile
프론트엔드 개발자

0개의 댓글