생명 주기(Scope 개념 알아보기)
서블릿 기반의 웹 애플리케이션에서 각 객체의 생명 주기(Scope)와 세션 관리는 웹 서비스의 중요한 요소이다.
특히 요청(Request), 세션(Session), 애플리케이션(Application) 등 서로 다른 생명 주기를 가진 객체들은 각기 다른 시점에 생성되고 소멸된다. 이 글에서는 Servlet Scope의 개념과 함께 setAttribute와 getAttribute 메서드를 이용하여 데이터를 관리하는 방법을 알아보고, 로그인 정보 관리와 쿠키 사용 등 실무에서 필요한 정보를 정리해보고자 한다.
Servlet Scope 종류와 객체의 생명주기
메모리에 각각의 객체를 생성하고 소멸하고 반복적으로 일어나는데 이에 대한 Scope를 알아보자.
PageContext
하나의 웹페이지를 유지하는 page → 이전 페이지는 메모리를 지움.
HttpServletRequest
요청에 대한 request → 요청이 완료될때까지 객체 유지 , 요청이 완료되면 소멸
HttpSession
개별 한사람 한사람에 대한 session → 개별 사용자에 대한 세션을 유지
로그인 등 클라이언트 정보를 서버에 저장하는 데 사용
누가 들어왔다면 쿠키에 세션객체 보관.session_Id
ServletContext
서버 유지에 관련된 , application → 서버 종료가 될때까지 객체 유지
Session / HTTP / cookie
Session
클라이언트(접속자)가 방문했을때 , 클라이언트의 정보를 보관한다.
클라이언트마다 세션이 존재하고 , 오직 서버에서만 생성된다.
세션 스토리지와 다른 의미. 서버에서 말하는 세션 객체를 의미.
✔️세션을 통한 로그인 관리
id 와 pw 가 request 객체에 담아 보내면 DB에서 확인한후 , response 로 결과를 내보낸다.
id를 세션 객체에 보관해 두고 , 세션을 지울때까지는 서버내에서 사용가능하다.
request 객체는 요청이 완료됨과 동시에 사라지기 때문에 정보를 저장할 방법이 없기 때문.
로그아웃은 세션을 지워버리는 것으로 관리.
//보관 가능한 객체 Scope
// session 생성 : 클라이언트가 접속하면 server가 자동생성
HttpSession session = request.getSession();
session.setAttribute("sessionID", id); // key-value 형식으로 저장
session.setAttribute("sessionName", name);
session.setAttribute("sessionAge", age);
HTTP
무상태 프로토콜이며 각각의 요청을 독립적으로 처리한다.
상태를 기억하지 않는 대신 요청을 빠르게 처리할 수 있는 장점이 있음.
Cookie
쿠키는 웹브라우저에 저장되는 작은 데이터 조각을 의미한다.
사용자를 식별하거나 특정 정보를 보관할 때 사용된다.
서버가 클라리언트에 데이터 저장 지시 → 클라이언트가 데이터를 쿠키로 브라우저에 저장
→ 동일 사이트를 방문할때 서버에 자동 전송 → 사용자의 상태를 파악
// 쿠키 생성 및 설정
Cookie cookie = new Cookie("userID", "banana123"); // key-value 형식으로 저장
cookie.setMaxAge(60 * 60 * 24); // 1일 동안 유효
response.addCookie(cookie); // 클라이언트에게 쿠키 전달
userID라는이름의 쿠키에 banana123이라는 값을 저장하고 1일 동안 유효하게 설정하는 코드.
이후 사용자가 동일한 부라우저로 사이트에 접속하면 쿠키를 통해 사용자를 식별할 수 있음
Session 과 Cookie 의 차이점
Session : 서버에 저장됨 → 클라이언트가 사이트에 접속할떄마다 서버가 세션을 생성하고 관리.
세션은 사용자의 정보의 보안성을 강화하는데 유리하다.
Cookie : 클라이언트의 브라우저에 저장됨 → 브라우저가 종료되거나 설정된 만료 시간에 따라 사라짐. 서버의 메모리를 사용하지 않아 많은 사용자를 처리하는데 유리하다.
setAttribute / getAttribute
RequestScope 의 setAttribute
//보관 가능한 객체 Scope
request.setAttribute("requestID", id);
request.setAttribute("requestName", name);
request.setAttribute("requestAge", age);
SessionScope 의 setAttribute
HttpSession session = request.getSession();
session.setAttribute("sessionID", id);
session.setAttribute("sessionName", name);
session.setAttribute("sessionAge", age);
RequestScope 의 getAttribute
//set했던 파일 내용
//request.setAttribute("requestID", id);
//request.setAttribute("requestName", name);
//request.setAttribute("requestAge", age);
//====
//변수를 활용하여 꺼내기.
String idR = (String)request.getAttribute("requestID");
String nameR = (String)request.getAttribute("requestName");
String ageR = (String)request.getAttribute("requestAge");
SessionScope 의 getAttribute
//set했던 파일 내용
//HttpSession session = request.getSession();
//session.setAttribute("sessionID", id);
//session.setAttribute("sessionName", name);
//session.setAttribute("sessionAge", age);
//====
HttpSession session = request.getSession();
//변수를 활용하여 꺼내기
String idS = (String)session.getAttribute("sessionID");
String nameS = (String)session.getAttribute("sessionName");
String ageS = (String)session.getAttribute("sessionAge");
요청 객체는 요청이 끝난 이후 소멸되었기 때문에 Redirect 방식으로 꺼낼 수 없음.
Parameter 값 은 Redirect 방식으로 한다면 Parameter 값이 존재하지 않기 때문에 가져올 수 없음.
Session 관리 메서드
서버는 클라이언트가 접속할때 자동으로 세션객체를 생성하고 ,
세션 객체를 통해 클라이언트의 상태와 접속 정보를 관리한다.
이를 통해 로그인 상태 유지, 사용자 데잍 보관등의 작업을 할 수있다.
세션 처음 생성된 시간 반환
session.getCreationTime()
세션 마지막으로 접근한 시간 반환
session.getLastAccessedTime()
세션 자동 만료 (초단위)
setMaxInactiveInterval(초 단위)
session.setMaxInactiveInterval(10);
세션 무효화
invalidate()
활용 코드 예제
HttpSession session = request.getSession(); // 세션 인스턴스 생성
Date now = new Date(); // 현재 시간 생성
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 날짜 형식 지정
// 세션 정보 출력
out.printf("<ul><li><h3> => Session_ID = %s </h3></li>", session.getId());
out.printf("<li><h3> => Now_현재시간 = %s </h3></li>", formatter.format(now));
now.setTime(session.getCreationTime());
out.printf("<li><h3> => Session_CreationTime = %s</h3></li>", formatter.format(now));
now.setTime(session.getLastAccessedTime());
out.printf("<li><h3> => Session_LastAccessedTime = %s </h3></li></ul>", formatter.format(now));
// 세션 만료 시간 설정
session.setMaxInactiveInterval(10); // 10초 동안 접근 없을 시 세션 만료
현재 시간과 lastAccessedtime 은 같을 수 밖에 없고 ,
세션은 쿠키에 session id 가 확인됨.
web.xml 을 통한 세션 만료시간 지정
setMaxInactiveInterval() 설정이 아닌 web.xml으로의 설정을 통한 세션만료설정
<session-config>
<session-timeout>0</session-timeout> <!-- 무제한시간 -->
<!-- <session-timeout>10</session-timeout> 10분 지정 -->
</session-config>
'Developer > Spring eGov4.0 (Java11, Tomcat9)' 카테고리의 다른 글
Java Servlet을 활용한 간단한 로그인 구현 (0) | 2024.11.05 |
---|---|
Spring URI 빌더 활용하기 : 동적 URL 생성 (0) | 2024.11.04 |
Servlet 알아보기 3 ( 화면 간의 이동 처리 ) (0) | 2024.11.01 |
Servlet 알아보기 3 (lifecycle) (0) | 2024.11.01 |
Servlet 알아보기 2 (메서드 사용) (0) | 2024.11.01 |