본문 바로가기
개발 지식/JSP & Servlet

[JSP & Servlet] 서블릿 스코프(Scope) : Page, Request, Session, Application

by 에르주 2020. 8. 7.
반응형

이번 포스팅 주제는 서블릿 스코프(Scope)이다.

서블릿에서는 필요시 임의의 데이터를 저장하고 나중에 저장된 데이터를 사용할 수 있는 4가지 저장소를 제공한다.

 

1) Page, 2) Request, 3) Session, 4)Application

 

해당 스코프에 대해서 정리하고 실습을 시작하자.

 

1. Page 스코프

 - 한 번의 클라이언트 요청으로 하나의 JSP 페이지가 응답한다.

 - 하나의 JSP 페이지 내에서만 데이터를 저장 및 공유 한다.

 - JSP 파일에는 pageContext가 내정되어 있어 Page 내부에서만 사용 가능하다.

 - JSP 파일에  <% %> 태그를 사용하여 JSP 파일 내에서 변수를 사용하는데 이는 Page 스코프에 저장하여 사용하다

 

2. Request 스코프

 - HttpServletRequest API 사용

 - 요청 ~ 응답까지의 Life Cycle을 가진다. (Response 시 해당 스코프는 삭제 된다.)

 - setAttribute(Key, value)와 getAttribute(Key) 메서드를 사용한다.

 

3. Session 스코프

: 톰캣의 세션, 서블릿의 세션이라는 말과 함께 데이터를 저장하는 장소 중 가장 많이 들어본 단어이다. Session 스코프의 특징은 다음과 같다

 - HttpSession API 사용

 - 브라우저의 Life Cycle을 가짐

 - SetAtttibute(Key, value)와 getAttribute(Key) 메서드를 사용한다.

 

4. Application

: 해당 어플리케이션이 종료 되기 전까지 저장한다.

 - SerlvetContext API 사용

 - 웹 어플리케이션에서의 context의 Life Cycle을 가짐

 - setAttribute(key, value)와 getAttribute(key) 메서드 이용

 

 

이중 2,3,4번에 항목에 대해서 실습을 진행하였다.

 

//setServlet (값 set 서블릿)

package com.controller;

import java.io.IOException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class SetServlet
 */
@WebServlet("/setServlet")
public class setServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    
    public setServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		
		//1.request 스코프에 저장, HttpServletRequest 이용.
		request.setAttribute("request", "리퀘스트 스코프 테스트");
		
		// 2. Session 스코프 저장, HttpSession API 이용
		HttpSession session = request.getSession();
		session.setAttribute("session", "세션 스코프 테스트");
		
		// 3. application 스코프에 저장, ServletContext API 이용
		ServletContext application = getServletContext();
		application.setAttribute("application", "어플리케이션 스코프 테스트");
				
		
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}
	
	/*
	 * 스코프는 총 네개로
	 * 1) Page
	 * 2) Request
	 * 3) Session
	 * 4) Application
	 * 
	 */
	

}

 

 

 

// 값 불러오기 (getServlet)

package com.controller;

import java.io.IOException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class getServlet
 */
@WebServlet("/getServlet")
public class getServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public getServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		// 1. request 스코프 데이터 얻기, HttpServletRequest API 사용,  단 getAttribute는 Object 리턴이므로 String 형변환 해줘야한다, life-cycle이 요청 - 응답에 해당
		String name = (String) request.getAttribute("request");
		System.out.println(name);
		
		// 2. Session 스코프 저장, HttpSession API 이용, life-cycle이 브라우저에 해당됨.
		HttpSession session = request.getSession();
		String sessionName = (String) session.getAttribute("session");
		System.out.println(sessionName);
		
		// 3. application 스코프에 저장, ServletContext API 이용
		ServletContext application = getServletContext();
		String appRequest = (String)application.getAttribute("application");
		System.out.println(appRequest);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

 

 

setServlet -> getServlet 페이지로 이동하면

 

같은 브라우저 내에서 setServlet -> getServlet

 

 

Request값은 null, 그 외 session, application 값은 모두 출력된다.

왜냐하면 request는 setServlet setServlet의 Response 후 getServlet 페이지 이동하기 때문에 값은 null로 바뀌게 된다.

 

 

 

다른 브라우저의 setServlet -> getServlet

 

해당 이미지는 웨일에서 setServlet를 호출하고 크롬에서 getServlet을 호출 했는데 세션 스코프가 null값이 나오는 현상이다. 즉 브라우저 Life Cycle에 따라 저장된다는 것을 확인 할 수 있다.

 

끝.

반응형

댓글