Spring/공부
[Spring MVC] 세션 이해하고 스프링 적용
하루인생
2021. 2. 9. 12:11
세션 데이터 흐름
클라이언트가 서버에 요청하면 서버에서는 클라이언트를 식별하기 위해서 세션id를 생성한다.
이 세션 id를 통해 (key, value)로 이루어진 저장소 HttpSession을 생성한다.
그리고 응답시 session id를 담아 클라이언트에 전송한다.
다음 클라이언트의 요청부터는 이 session id를 쿠키에 담아 전송한다.
세션은 new 키워드를 사용해서 만들지 않는다.
request로 부터 자동으로 세션을 만들어준다.
아래 코드를 사용해서 서버에 세션이 있다면 세션을 반환하고 없으면 새로 만들어준다.
HttpSession session = request.getSession();
HttpSession session = request.getSession(true);
아래와 같이 false값을 넣어주면 서버에 세션이 있다면 세션을 반환하고 없으면 null을 반환한다.
HttpSession session2 = request.getSession(false);
세션 사용하기
setAttribute메서드로 값을 저장한다. 이 값은 세션이 유지되는 동안 사용 할 수 있다.
session.setAttribute("String형", "Object형");
getAttribute메서드로 세션의 이름을 통해 조회한다. 반환형은 Object형이므로 형변환을 해줘야 한다.
String value = (String)session.getAttribute("name");
removeAttribute메서드는 이름을 통해 세션을 삭제한다.
session.removeAttribute("name");
invalidate메서드는 모든 세션을 삭제한다.
session.invalidate();
isNew메서드는 반환형은 Boolean이고 새롭게 생성됐으면 true, 아니면 false를 반환한다.
if문과 함께 사용하면 될 것 같다.
seeeion.isNew();
세션은 클라이언트가 서버에 접속하는 순간 생성된다.
기본 유지 시간은 30분이고 아래와 같이 web.xml파일에서 설정을 하면 유지시간을 변경할 수 있다.
<session-config>
<session-timeout>30</session-timeout>
</session-config>
숫자 맞추기 게임
세션을 이용해서 숫자 맞추는 페이지를 만들어 봤다.
java파일
...
@Controller
public class ListController {
@GetMapping(path = "/guess")
public String guess(@RequestParam(name = "number",required = false)Integer number,
HttpSession session, ModelMap model) {
int count;
String message = null;
if(number == null) {
message = "처음이군요.";
session.setAttribute("count", 0);
session.setAttribute("answer", (int) (Math.random()*100+1));
count = 0;
}else {
if(number == (Integer)session.getAttribute("answer")){
message = "정답입니다.";
count = (Integer)session.getAttribute("count")+1;
session.removeAttribute("answer");
session.removeAttribute("count");
}else {
count = (Integer)session.getAttribute("count") + 1;
session.setAttribute("count", count);
if(number > (Integer)session.getAttribute("answer"))
message = "정답이 아닙니다."+ number+" 보다 작은 수입니다.";
else
message = "정답이 아닙니다."+ number+" 보다 큰 수입니다.";
}
}
model.addAttribute("message", message);
model.addAttribute("count", count);
return "guess";
}
}
jsp파일
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
횟수 : ${count } <br>
메세지 : ${message } <br>
<br>
<br>
<c:if test="${sessionScope.count != null}">
<form method="get" action="guess">
숫자입력: <input name="number" type="text">
제출 <input type="submit" value="제출">
</form>
</c:if>
<a href="guess">게임 다시 시작</a>
</body>
</html>
결과 이미지