반응형
여승철
INTP 개발자
여승철
  • 분류 전체보기 (376)
    • CS (16)
      • 면접 준비 (7)
      • 운영체제 (0)
      • 네트워크 (2)
      • HTTP (6)
      • 스프링(Spring) IoC 컨테이너 (0)
      • 알고리즘 (1)
    • Web (13)
    • AWS (6)
    • Java (43)
    • JSP & Servlet (65)
      • 개념 (42)
      • 실습 (23)
    • Spring Framework (33)
    • Spring Boot (10)
    • Spring Data (22)
      • JPA (14)
      • Query DSL (7)
      • Redis (1)
    • Spring Security (9)
    • Spring Batch (4)
    • MyBatis (10)
    • Front-End (51)
      • JS (27)
      • Vue.js (17)
      • React (5)
      • JQuery (0)
      • d3.js (2)
    • DBMS (24)
      • SQL, RDBMS (16)
      • MongoDB (5)
      • Redis (3)
    • Kafka (3)
    • 리눅스 (Linux) (4)
    • 디자인 패턴 (3)
    • VCS (8)
    • API (0)
    • TOOL (3)
    • Reading Book (28)
      • 이펙티브 자바 (11)
      • Clean Code (10)
      • 1분 설명력 (4)
      • HOW TO 맥킨지 문제해결의 기술 (3)
    • C# (4)
    • NSIS (6)
    • ETC (11)

블로그 메뉴

  • 홈
  • 태그

인기 글

태그

  • jsp
  • JDBC
  • controller
  • 회원 관리
  • 맥킨지
  • Dao
  • HTTP
  • 디자인 패턴
  • Spring Batch
  • querydsl
  • 게시판
  • 환경 세팅
  • ubuntu
  • 이펙티브 자바
  • 로그인
  • 스트림
  • EC2
  • servlet
  • JSTL
  • mybatis

최근 댓글

최근 글

hELLO· Designed By 정상우.
여승철

INTP 개발자

데이터 보관소(네 가지 객체 보관소)
JSP & Servlet/개념

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

2022. 7. 11. 00:31
반응형

 

데이터 보관소

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

 

 

 

 

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

...
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
    여승철
    여승철

    티스토리툴바