Back-end

JSP의 기본 구조

elysia365 2025. 1. 12.

<!doctype html>

JSP의 기본 구조

JSP는 지시어와 스크립트 요소로 이루어진다.

지시어는 JSP에 대한 기본 설정을 하는 요소이다. 지시어에는 page, include, taglib 3가지가 있다.

페이지에 대한 기본 설정을 한 뒤에는 클라이언트의 요청을 처리할 자바 코드를 작성해야한다.

이때 스크립트 요소를 이용해 자바 코드를 삽입할 수 있다.

스크립트 요소에는 선언부, 스크립틀릿, 표현식 3가지가 있다.

 

  • 지시어 (Directive) <%@ 지시어종류 속성1="값1" 속성2="값2" ... %>
    • JSP 페이지를 자바(서블릿) 코드로 변환하는 데 필요한 정보를 JSP 엔진에 알려줌
    • Page 지시어
      • JSP 페이지에 대한 정보 설정
    • Include 지시어
      • 외부 파일을 현재 JSP 페이지에 포함
      • 파일의 내용 그대로를 문서에 삽입한 후 컴파일을 진행하기 때문에 하나의 페이지가 됨
    • taglib 지시어
      • 표현 언어에서 사용할 자바 클래스나 JSTL을 선언
      • EL에서 자바 클래스의 메서드를 호출하거나 JSTL을 사용하기 위한 지시어
  • 스크립트 요소 (Script Elements)
    • JSP에서 자바 코드를 직접 작성할 수 있게함
    • 선언부 (Declaration) <%! 메서드 선언 %>
      • 스크립틀릿이나 표현식에서 사용할 멤버 변수나 메서드를 선언
      • 서블릿으로 변환 시 _jspService() 메서드 '외부'에 선언
    • 스크립틀릿 (Scriptlet) <% 자바 코드 %>
      • JSP 페이지가 요청을 받을 때 실행돼야 할 자바 코드를 작성하는 영역
      • 서블릿으로 변환 시 _jspService() 메서드 '내부'에 그대로 기술
    • 표현식 (Expression) <%= 자바 표현식 %>
      • 프로그래밍 언어에서 의미하는 표현식과 동일한 의미
      • 실행 결과로 하나의 값이 남은 문장을 의미
      • 스크립틀릿 안에서는 변수를 출력할 때 out.print()를 사용해야 하므로 보다 쉽게 출력 가능

 

내장 객체 (Implicit Object)

내장 객체는 JSP 페이지가 실행될 때 컨테이너가 자동으로 생성해줍니다.

request, response, out, session, application, pageContext, page, config, exception 과 같이 총 아홉 가지가 있습니다.

  • Request 객체
    • 클라이언트가 전송한 요청 정보를 담고 있는 객체
    • 클라이언트 및 서버에 대한 정보, 요청 매개변수, 요청 헤더 및 쿠키 정보를 담고 있음
  • Response 객체
    • 클라이언트의 요청에 대한 응답을 웹 브라우저로 보내주는 역할
    • JSP에서는 주로 페이지 이동을 위한 redirect와 HTTP 헤더에 응답 헤더 추가 기능
  • Out 객체
    • 웹 브라우저에 변수 등의 값을 출력할 때 주로 사용
    • JSP에서는 out 객체보다는 보다 편리한 표현식 <%= %> 을 더 많이 사용함
    • Out 내장 객체는 버퍼를 사용하므로 모든 정보는 버퍼에 먼저 저장된 후 브라우저에 출력
  • application 객체
    • 웹 애플리케이션당 하나만 생성되며, 모든 JSP 페이지에서 접근 가능
    • SevletContext 타입으로 주로 웹앱 전반에서 이용하는 정보 저장 및 서버 정보 또는 물리적 경로 등을 얻어오는데 사용
    • 배포 서술자인 web.xml 파일에 설정한 값들을 읽어옴
  • exception 객체
    • 예외 처리를 위해 사용

내장 객체의 영역(Scope)

JSP와 같은 웹 애플리케이션은 페이지 단위로 구성됩니다. 그래서 JSP에서는 영역을 통해 내장 객체에 저장된 속성값을 공유할 수 있도록 했습니다.

웹에서는 페이지(page)들이 모여 하나의 요청(request)을 처리하며, 요청들이 모여 하나의 세션(session)을, 다시 세션들이 모여 하나의 웹 애플리케이션(application)을 이룹니다.

 

  • page 영역
    • 동일한 페이지에서만 공유되며, 페이지를 벗어나면 소멸됨
  • Request 영역
    • 하나의 요청에 의해 호출된 페이지와 포워드(요청 전달)된 페이지까지 공유
  • session 영역
    • 클라이언트가 처음 접속한 후 웹 브라우저를 닫을 때까지 공유
  • application 영역
    • 한 번 저장되면 웹 애플리케이션이 종료될 때까지 유지

 

쿠키 (Cookie)

쿠키는 클라이언트의 상태 정보를 유지하기 위한 기술이다.

상태 정보를 클라이언트(주로 웹 브라우저)에 key, value 형태로 저장했다가 다음 요청 시 저장된 쿠키를 함께 전송한다.

웹 서버는 브라우저가 전송한 쿠키로부터 필요한 데이터를 읽어올 수 있다.

언제 방문했는데, 어떤 페이지를 클릭했는지, 어떤 상품을 구매했는지 등 다양한 정보를 기록해두었다가 이를 활용하여 사용자 맞춤 서비스, 광고, 웹 로그 분석, 서비스 속도 개선 등을 할 수 있다.

 

쿠키 동작 메커니즘

  1. 클라이언트가 서버에 요청을 보냄
  2. 서버가 쿠키를 생성하여 HTTP 응답 헤어데 실어 클라이언트에 전송
  3. 클라이언트는 쿠키를 받아 저장해둠 (이 시점에는 쿠키가 클라이언트에만 저장된 상태이므로 서버가 아직 쿠키 사용 못함)
  4. 클라이언트는 다음번 요청 시 저장해둔 쿠키를 HTTP 요청 헤더에 실어 보냄
  5. 서버는 쿠키의 정보를 읽어서 필요한 작업을 수행

 

세션 (Session)

클라이언트가 웹 브라우저를 통해 서버에 접속한 후 용무를 처리하고 웹 브라우저를 닫아 서버와의 접속을 종료하는 하나의 단위를 세션이라고 한다.

즉 세션은 클라이언트가 서버에 접속해 있는 동안 그 상태를 유지하는 것이 목적이다.

 

쿠키 vs 세션

  쿠키 세션
저장 위치/형식 클라이언트 PC에 text로 저장 웹 서버에 Object 타입으로 저장
보안 클라이언트에 저장되므로 보안에 취약 서버에 저장되므로 보안에 안전
자원/속도 서버 자원을 사용하지 않으므로 세션보다 빠름 서버 자원을 사용하므로 쿠키보다 느림
용량 용량의 제한이 있음 서버가 허용하는 한 제한이 없음
유지 시간 쿠키 생성 시 결정되며, 설정된 시간이 경과되면 무조건 삭제 서버의 web.xml 에서 설정되며, 설정된 시간 내라도 동작이 있다면 삭제되지 않고 유지

 

액션 태그(Action Tag)

Action Tag는 JSP의 표준 태그로, 페이지 사이에서 이동을 제어하거나 자바빈을 생성할 때 주로 사용한다.

특별한 선언 없이 <jsp:태그명 /> 형태로 사용하며, 일반 JSP 코드보다 HTML에 더 조화롭게 스며들고 간결하다.

태그처럼 사용하지만 JSP 코드이므로 WAS에서 처리된 후 결과만 출력되어 웹 브라우저에서 소스 보기를 해도 액션 태그는 보이지 않는다.

<jsp:include>, <jsp:forward>, <jsp:useBean>, <jsp:setProperty>, <jsp:getProperty>, <jsp:param> 이 있다.

 

include 지시어와 <jsp:include> 액션 태그 차이점


 

표현 언어 (Expression Language)

표현 언어는 변수의 값을 출력할 때 사용하는 스크립트 언어이다.

표현 언어는 모델2 방식으로 웹 애플리케이션을 개발할 때 주로 사용한다.

4가지 영역(page, request, session, application)에 저장된 속성에 접근할 때 사용하며, 사용법이 매우 간결하고 예외와 형변환에 관대하다는 특징이 있다. 예를들어 자바에서 값이 null 인 변수를 사용하면 예외가 발생하지만 표현 언어를 사용하면 예외가 발생하지 않는다.

기본 사용법은 ${ 속성 }이다. 여기에서 속성은 영역에 저장된 속성을 뜻한다.

${ requestScope.scopeValue } 와 같이 영역.속성으로 찾아오며, 영역을 생략할 경우 가장 좁은 영역인 page 영역에서 값을 가져오며, page 영역에 값이 없으면, 다음 좁은 영역인 request 영역의 속성값을 가져온다.

EL은 HTML 태그나 자바스크립트, CSS 어디에서든 사용할 수 있으며, 액션 태그나 JSTL의 속성값으로도 사용할 수 있다.

<c:set var="elVar" value="${ elVar }" /> : JSTL과 함께 사용

<jsp:include page="${ pathVar }" /> : 액션 태그와 함께 사용

하지만, JSP 스크립트 요소(선언부, 표현식, 스크립틀릿)에서는 사용할 수 없다.

 

  • 폼 값 처리하기
    • JSP에서는 전송 방식(get/post)에 상관없이 request.getParameter()로 폼값을 받아 올 수 있다.
    • EL에서도 마찬가지이다.

JSP에서 선언한 변수를 EL에서 즉시 사용할 수는 없고, 항상 영역에 저장한 후 사용해야해서 번거롭다고 생각할 수 있지만, 서블릿과 혼용해 개발해야 한다면 큰 이점이 있다.

서블릿에서 처리한 결과는 항상 영역을 통해 JSP로 전달되기 때문이다.

 

JSTL (JSP Standard Tag Library)

JSTL은 JSP에서 빈번하게 사용되는 조건문, 반복문 등을 처리해주는 태그를 모아 표준으로 만들어 놓은 라이브러리이다.


Core 태그

 

서블릿 (Servlet)

서블릿은 JSP가 나오기 전, 자바로 웹 애플리케이션을 개발할 수 있도록 만든 기술이다.

MVC 모델에서 컨트롤러 역할을 한다.

모든 메서드는 스레드로 동작된다.

HttpServlet 클래스를 상속받는다.


 

JSP 없이 서블릿에서 응답을 직접 출력하면 코드가 굉장히 지저분해지기 쉽기 때문에 보통은 데이터를 request 영역에 담아서 JSP로 포워딩한다.

하지만, 비동기 방식으로 통신할 때 XML이나 JSON을 사용하는 경우가 있으며, 이와 같이 순수 데이터만 출력해야 하는 경우에는 서블릿에서 직접 출력하는 게 편하다.

댓글