데이터 보관소
서블릿 기술은 데이터를 공유하기 위한 방안으로 네 가지 종류의 데이터 보관소를 제공한다. 각각의 데이터 보관소는 공유 범위를 기준으로 구분된다.
자세하게 설명하기 앞서 간단한 코드로 가볍게 설명하도록 하겠다.
...
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() 메소드와 유사하다.
'JSP & Servlet > 개념' 카테고리의 다른 글
필터(Filter) 사용하기 (0) | 2022.07.13 |
---|---|
커넥션풀(Connection Pool) (DataSource와 JNDI) (feat. MySQL) (0) | 2022.07.11 |
html href 속성을 이용하여 넘길 때 한글 처리 (0) | 2022.07.02 |
JSTL fmt - JSTL의 국제화/형식화 액션 (0) | 2022.06.25 |
JSTL core - JSTL의 기본 액션 (0) | 2022.06.25 |