본문 바로가기
✨ Back-end/Servlet

[Servlet / JSP ] 세션(Session) 데이터 저장, 전달, 삭제 방법

by 환풍 2023. 2. 26.
728x90
반응형

세션이란?

서버와 클라이언트간의 정보를 전달하는 것이다.
웹 사이트의 여러 페이지에 걸쳐 사용되는 사용자 정보를 저장하는 방법이다.
즉, 사용자가 브라우저를 닫아 서버와의 연결을 끝내는 시점까지를 세션이라고 한다.

 

이전까지 서블릿과 jsp를 왔다갔다하며 항상 데이터 값들을 전달했다.

하지만 너무 불편하지 않은가? 그래서 세션을 사용한다.

세션에 한번 데이터를 전달하고 나면 불필요하게 이동할때마다 가지고 다닐 필요가없어서 사용한다.

즉, id값을 서버의 어딘가에 넣어 저장시키면 계속 저장하고있다. 이 공간을 세션이라 한다.

 

세션과 쿠키는 뭐가 다른데?

쿠키는 내 컴퓨터에 데이터가 저장이 된다이고 세션은 서버에 데이터가 저장된다.


1. 세션을 먼저 사용하려면 서블릿에서 세션 객체를 생성해주어야한다.

Sevlet

 

2. 세션에 데이터를 저장한다.

setAttribut를 이용하여 name2라는 이름으로 python이라는 데이터를 저장했다. 

 

session01.jsp에서 위 서블릿의 저장된 데이터를 확인할 수 있다.

 

JSP

name1에 저장된 데이터는 request.setAttribut로 일반적으로 저장된 데이터이므로 ${name1}으로 받아올 수 있지만,

name2는 세션에 저장된 데이터이다. 세션에 저장된 데이터도 ${name2}로 받아올 수는 있지만, 그러면 데이터가 어디서 넘어왔는지 알 수가 없다.

따라서 세션에 저장된 데이터를 jsp에서 불러올 땐, ${sessionScope.name2}를 사용하자.

 

페이지 이동을 눌러 session02.jsp로 이동해보자.

 name1은 request.setAttribut로 일반적으로 저장된 데이터이다. 

 name2는 세션에 데이터를 저장해 ${sessionScope.name2}로 받아온 것이다. 차이를 확인했나?

 

이 데이터는 인터넷을 종료하거나, 서버를 닫을 때 까지 계속 살아 있다.

하지만, 이를 조절할 수는 있다. 

Servlet

서블릿에 이렇게 작성하면 60(초) * 60 해서 3600초 (1시간)동안 데이터가 저장된다는 의미이다.

아무런 동작을 하지않고 1시간이 흐르면 데이터를 없애준다.

 

그렇다면, 객체로 데이터를 읽어올땐 어떻게 하면 좋을까?

위와 같이 DTO 객체로 불러들어 오려니 빨간줄 에러가 뜬다...

그 이유는 위와 같이 리턴타입이 Object라서 자료형이 다르기 때문인데,

 이렇게 자료형을 바꿔주면 가능하다.

 

세션은 컴퓨터에 있는 저장공간을 사용한다.

저장공간은 한정적이기 때문에 무자비하게 다때려넣으면 서버 터져버린다. 정말 필요한 데이터만 세션에 담자.

 

3. 세션에 저장된 데이터 삭제하는 방법

이처럼 세션에 있는 데이터를 삭제하고 싶다면, 위와 같은 방법이 있다.

 

SessionServlet

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package session_test;
 
import java.io.IOException;
 
import javax.servlet.RequestDispatcher;
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;
 
import dto.BoardDTO;
import dto.MemberDTO;
 
 
@WebServlet("/Session01")
public class SessionServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
 
    public SessionServlet() {
        super();
      
    }
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setAttribute("name1""java");
        
        //데이터를 세션에 저장
        //1. 세션 객체를 생성
        HttpSession session = request.getSession();
        
        //세션에 저장된 데이터의 유효시간 설정
        // 1시간.
        session.setMaxInactiveInterval(60 * 60);
        
        //2. 세션에 데이터 저장
        session.setAttribute("name2""python");
        session.setAttribute("age"20);
        session.setAttribute("member"new MemberDTO());
        session.setAttribute("board"new BoardDTO());
        
        //3. 세션에 저장된 데이터를 읽어오는 방법
        MemberDTO m = (MemberDTO)session.getAttribute("member");
        BoardDTO b = (BoardDTO)session.getAttribute("board");
        
        //세션에 저장된 데이터를 삭제하는 방법
        //세션에 저장된 특정한 데이터를 지우는 방식
        session.removeAttribute("name2");
        //세션에 저장된 모든 데이터 삭제
        session.invalidate();
        
        // jsp파일을 찾는 기준 위치는 webapp폴더!
        RequestDispatcher dispatcher = request.getRequestDispatcher("view/test/session01.jsp");
        dispatcher.forward(request, response);
    }
 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    }
 
}
 
cs

 

session01.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
session1.jsp파일입니다. <br>
name1 =${name1 }<br>
name2 = ${sessionScope.name2 }<br>
<a href="view/test/session02.jsp" >페이지 이동</a>
</body>
</html>
cs

session02.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
session2.jsp파일입니다. <br>
name1 =${name1 }<br>
name2 = ${sessionScope.name2 }<br>
하이
</body>
</html>
cs

 

728x90
반응형

댓글