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>

 

결과 이미지