데이터 보관소(네 가지 객체 보관소)

 

데이터 보관소

서블릿 기술은 데이터를 공유하기 위한 방안으로 네 가지 종류의 데이터 보관소를 제공한다. 각각의 데이터 보관소는 공유 범위를 기준으로 구분된다.

 

 

 

 

자세하게 설명하기 앞서 간단한 코드로 가볍게 설명하도록 하겠다.

...
ServletContext ctx = getServletContext();
HttpSession session = request.getSession();

ctx.setAttribute("context", ctxValue);
session.setAttribute("session", sessValue);
request.setAttribute("request", reqValue);

이와 같이 ServletContext / HttpSession / HttpServletRequest 객체에 value를 바인딩 해주었다.

그리고 이들 값을 getAttribute하는 url을 호출한다면?? 여러가지 경우로 생각해보자.

 

 

  • setAttribute를 수행했던 같은 브라우저에서 호출 시
    • context: ctxValue 값입니다.
    • session: sessValue 값입니다.
    • request: null
    • 새로운 요청 url이기 때문에 request의 바인딩 속성이 유지 되지 않는다.
  • 크롬이 아닌 edge에서 호출 시
    • context: ctxValue 값입니다.
    • session: null
    • request: null
    • 다른 브라우저에서 요청 했으므로 Session이 달라 속성이 유지되지 않는다. request 같은 경우는 위와 같다.

 

 

 

 

 

 

 

1.ServletContext 보관소

웹 애플리케이션이 시작될 때 생성되어 웹 애플리케이션이 종료될 때까지 유지된다. 이 보관소에 데이터를 보관하면 웹 애플리케이션이 실행되는 동안에 모든 서블릿이 이 데이터를 사용할 수 있다. JSP에서는 application 변수를 통해 이 보관소를 참조할 수 있다.

활용 예: 데이터베이스 커넥션

더보기

web.xml

<!-- 컨텍스트 초기화 파라미터 (ServletContext) -->
<!-- 같은 웹 애플리케이션에 소속된 서블릿들이 공유하는 매개변수 -->
	<context-param>
		<param-name>driver</param-name>
		<param-value>com.mysql.jdbc.Driver</param-value>
	</context-param>
	<context-param>
		<param-name>url</param-name>
		<param-value>jdbc:mysql://localhost:3306/DB이름</param-value>
	</context-param>
	<context-param>
		<param-name>username</param-name>
		<param-value>SQL 아이디</param-value>
	</context-param>
	<context-param>
		<param-name>password</param-name>
		<param-value>SQL 비밀번호</param-value>
	</context-param>

 

코드 내 사용

...

Connection conn = null;
Statement stmt = null;
ResultSet rs = null;

try{
	ServletContext sc = this.getServletContext();
    Class.forName(sc.getInitParameter("driver"));
    conn = DrverManager.getConnection(sc.getInitParameter("url"),
    								  sc.getInitParameter("username"),
                                      sc.getInitParameter("password"));
    stmt = conn.createStatement();
    
    ...

 

 

 

2.HttpSession 보관소

클라이언트의 최초 요청 시 생성되어 브라우저를 닫을 때까지 유지된다. 보통 로그인을 할 때 이 보관소를 초기화하고, 로그아웃하면 이 보관소에 저장된 값들을 비운다. 따라서 이 보관소에 값을 보관하면 서블릿이나 JSP 페이지에 상관없이 로그아웃하기 전까지 계속 값을 유지할 수 있다. JSP에서는 session 변수를 통해 이 보관소를 참조할 수 있다.

활용 예: 로그인/로그아웃 session

더보기

오른쪽 상단에 로그아웃 링크 만들기

<%
Member member = (Member)session.getAttribute("member");
%>

<span style="float:right;">
<%=member.getName()%>
<a style="color:white;" href="<%=request.getContextPath()%>/auth/logout">로그아웃</a>
</span>

 

로그아웃 서블릿 생성

@WebServlet("/auth/logout")
public class LogOutServlet extends HttpServlet{
        
        ...
        
        HttpSession session = request.getSession();
        session.invalidate();    //HttpSession 객체 무효화
    
        response.sendRedirect("login");
    }
}

 

 

 

 

3.ServletRequest 보관소

클라이언트의 요청이 들어올 때 생성되어, 클라이언트에게 응답할 때까지 유지된다. 이 보관소는 포워딩이나 인클루딩하는 서블릿들 사이에서 값을 공유할 때 유용하다. JSP에서는 request 변수를 통해 이 보관소를 참조할 수 있다.

우리가 지금까지 Servlet 클래스 파일에서 doGet()의 매개변수인 request 변수를 통해 정보를 담고 forward()를 호출하여 다른 파일들 예를 들어 jsp 파일로 request를 보내는 등 우리가 많이 사용하고 있다.

 

 

 

 

4.JspContext 보관소

JSP 페이지를 실행하는 동안만 유지된다. JSP에서는 pageContext 변수를 통해 이 보관소를 참조할 수 있다.  여기서 궁금함이 생길 수 있다. "JSP 페이지의 로컬 변수와 차이점이 무엇일까?"라는 의문점 말이다. 이 점은 JspContext 보관소를 통해 데이터를 공유하기 원하는 자가 누구인지를 알아내면 된다. 쉽게 풀어서 설명하도록 하겠다.

JSP 엔진을 통해 JSP 파일에서 Servlet 클래스를 생성한다고 설명한걸 기억할 것이다. 이 때, <jsp:include>같은 특별한 태그들이 특정 Java 코드로 변환된다. 이때 이 태그의 값을 다루는 객체를 '태그 핸들러'라고 부른다. 바로 이 태그 핸들러에게 데이터를 전달하고자 할 때 JspContext 보관소를 사용하는 것이다. JSP 페이지의 로컬 변수는 태그 핸들러에서 접근할 수 없다.

 

 

보관소에 값을 넣고 빼내는 방법은 모두 같다.

보관소 객체.setAttribute(키, 값)     //값 저장
보관소 객체.getAttribute(키);        //값 조회

보관소 객체의 사용법은 Map 객체의 put()과 get() 메소드와 유사하다.