본문 바로가기

개발 회고

[솔데스크] 풀스택 과정 13주-3 총57회차 ‘회고’ | 스프링(0228)

[서론]

○● 0228 새로웠던 것


1. 스프링에서 세션 내용 지울 때 session.invalidate();

session.invalidate()을 지우면(없으면) 세션에 저장된 모든 데이터가 삭제되지 않습니다.

기본적으로 세션은 클라이언트가 로그아웃을 요청하거나 세션이 만료될 때까지 유지됩니다. session.invalidate()는 현재 사용자 세션을 무효화하여 세션에 저장된 모든 데이터를 제거합니다.

session.invalidate()를 삭제하면 사용자가 로그아웃할 때 세션 데이터가 삭제되지 않으므로, 사용자가 로그인 상태를 유지한 채로 계속 서비스를 이용할 수 있게 됩니다.

따라서 로그아웃 기능이 정상적으로 작동하려면 session.invalidate()를 유지해야 합니다.

 

2. 스프링에서 세션 내용 지울 때 status.setComplete();

 

status.setComplete()를 지우면(없으면) @SessionAttributes에 지정된 속성이나 모델에 추가된 세션 속성이 제거되지 않습니다.

일반적으로 Spring MVC에서는 컨트롤러 메서드가 종료될 때 SessionStatus의 setComplete() 메서드를 호출하여 세션에 저장된 데이터를 비웁니다. 이것은 주로 폼 처리 후에 세션에 남아 있는 데이터를 제거하여 사용자가 새로운 요청을 할 때 이전 요청의 데이터가 남지 않도록 하는 데 사용됩니다.

따라서 status.setComplete()를 지우면 해당 컨트롤러 메서드가 종료될 때 세션 데이터가 자동으로 비워지지 않게 됩니다. 이는 사용자가 다음 요청에서 이전 요청의 데이터를 여전히 볼 수 있게 됩니다.

 

 

[본론]

 

○● 0228 내용 정리

 

● 스프링

 

○○○●●● 컨트롤러-매개변수-일반객체

 

컨트롤러에 이런 데이터를 ?id=cat&pw=dog 전송 했을때

이 데이터들을 담는 그릇 클래스를 매개변수에 쓰면 스프링에서 그릇 클래스 객체를 생성하고 값을 멤버에 다 넣어줌


ex. @RequestMapping("/reg")
public void reg(MemberVO m) { << MemberVO 의 id , pw 변수에 cat 값과 dog 값을 알아서 넣어줌

} MemberVO 는 이렇게 선언되있음

@Data
public class MemberVO {
private String id;
private String pw;
}

그 다음 함수 실행을 마치고
reg.jsp 페이지로 이동하는데

reg.jsp 페이지에서 다시 id 와 pw 값을 써야하는 경우가 있을 수 있음

이 때 id, pw 값을 쓰기위해 모델에 또 실어 보내야하는데

스프링에서 MemberVO 객체를 다음 페이지 reg.jsp 에 자동으로 보내줌. << 이 기능 설명하려고 길게 말한거

단, 이 데이터를 받을 때 이렇게 해야됨.

reg.jsp
id: ${memberVO.id} << 클래스 명인 MemberVO 에서 맨 앞 대문자를 소문자로 바꿔서 쓰면 됨.
<hr> ( el 기준으로 설명 )
pw: ${memberVO.pw} << 그렇게 하면 이전에 컨트롤러에 넘어왔던 값을 여기서 그대로 쓸 수 있게 됨

 

 

○○○●●● 봄에서 세션 사용법

 

참고사이트: 

https://m.blog.naver.com/moe61/150169887527

첫번째 방법:
컨트롤러의 매핑 함수에 매개변수로 HttpSession x 선언하면 봄이 알아서 세션 객체 넣어줌

ex. @GetMapping("/aaa")
public void sessionExample(HttpSession session) {
session.setAttribute("cat","고양이"); << 쓰면 됨. 끝.
}

두번째 방법:
컨트롤러 상단에  @SessionAttributes("x") 선언하고
모델에 같은 키 ( 여기선 x ) 로 값을 넣으면 봄이 세션에도 같은 키로 모델에 넣은 값을 동시에 넣어준다.

ex. @SessionAttributes("x") << 1. 이 어노테이션을 붙이고
@Controller
public class BoardController {
@GetMapping("/a")
public void a(HttpSession s, Model m) {
s.setAttribute("a", "개");
<< 2. 모델에 x 키로 고양이 저장. ( 세션에도 x 키로 고양이가 저장됨 )
m.addAttribute("x","고양이");
}



단, 위 방법 시 세션 삭제할때 아래 사항을 주의해야됨.
@SessionAttributes는 모델(Model)에 추가된 데이터 중에서 세션에 저장할 데이터를 지정하는 것입니다. @SessionAttributes("id")는 모델(Model)에 "id"라는 이름으로 추가된 데이터를 세션에 저장하도록 지정한 것입니다. 

따라서, 세션에서 "id" 속성을 삭제하기 위해서는 모델(Model)에서 "id" 속성을 삭제해야 합니다.

따라서, 로그아웃 처리를 다음과 같이 수정해야 합니다.

@GetMapping("/logout")
public String logout(HttpSession session, SessionStatus status) {
session.invalidate();
// 모델쪽에서도 이 함수로 지워야 함
status.setComplete();  // Model에 있는 SessionAttributes를 제거
return "redirect:/ef/main";
}



위 코드에서 SessionStatus는 세션에 저장된 모델(Model) 데이터를 제거하기 위한 클래스입니다. setComplete() 메서드를 호출하면 모델(Model)에서 @SessionAttributes로 지정된 데이터가 삭제됩니다.

따라서, 위 코드에서 status.setComplete() 메서드를 호출함으로써 세션과 모델(Model)에서 모두 "id" 속성이 삭제되며, 로그아웃 처리가 완료됩니다.

참고. 여러 값을 세션에 지정 여러개의 키를 세션에 저장하고 싶다면 @SessionAttributes의 "키" 들을 { }로 묶어준다.
@SessionAttributes({"id", "name", "age"})

세션이 특정 페이지에서 안될 때
<%@ page session="false" %> << 이 태그가 있어서 안된 케이스 있었음. 주의.
자동생성된 home.jsp 에 상단에 이게 써있음. 그래서 세션 안될 것임.
true로 바꾸거나. 지우면 디폴트가 true임.

ex. 로그인 / 로그아웃 처리예제

 

home.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<!-- 0. 웹 애플리케이션의 루트 경로(컨텍스트 경로) 를 가져와서 링크에 다 연결해줘야 함     -->
<!-- 1. 0을 위한 준비. jstl core 태그 선언     -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- 2. 0을 위한 준비. el 태그로 가져올 수 있는데 이걸 더 짧게 찍기위해 변수 대입함.     -->    
<c:set var="cp" value="${pageContext.request.contextPath}" />
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<h1>
	Hello world!  
</h1>

<P>  The time on the server is ${serverTime}. </P>
<a href="test/dog">cat링크</a>
<a href="test/updateVisitantCount">updateVisitantCount</a>
<a href="test/insertDoodle">insertDoodle링크</a>
<a href="test/delTest">delTest</a>
<a href="${cp}/guest/getList">방명록</a>

<a href="${cp}/guest/test">test!</a>
<a href="${cp}/guest/testapi">test api</a>
<hr>
<a href="${cp}/member/reg?id=cat&pw=dog">test reg</a>
<hr>
<a href="${cp}/member/login">로그인</a>
<a href="${cp}/member/logout">로그아웃</a>

<a href="${cp}/member/reg">회원가입</a>

id:${id} , pw:${pw}


</body>
</html>

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- 0. 웹 애플리케이션의 루트 경로(컨텍스트 경로) 를 가져와서 링크에 다 연결해줘야 함     -->
<!-- 1. 0을 위한 준비. jstl core 태그 선언     -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- 2. 0을 위한 준비. el 태그로 가져올 수 있는데 이걸 더 짧게 찍기위해 변수 대입함.     -->    
<c:set var="cp" value="${pageContext.request.contextPath}" />    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<form action="${cp}/member/loginProc">
	<input name="id" placeholder="로그인 아이디">
	<input name="pw" placeholder="로그인 암호">
	<input type="submit" value="로그인">
</form>
</body>
</html>

MemberController.java

package com.peisia.spring.yy.controller;

import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.peisia.spring.yy.vo.MemberVO;

import lombok.AllArgsConstructor;
import lombok.extern.log4j.Log4j;

@Log4j
@RequestMapping("/member/*")
@AllArgsConstructor
@Controller
public class MemberController {
	@RequestMapping("/reg")
	public void reg() {
		System.out.println("==== 회원가입 페이지 진입");
	}
	@RequestMapping("/regProc")
	public void regProc(MemberVO m, Model model) {
		//todo
		log.info("====================");
		
		
		
		System.out.println("==== id:"+m.getId());
		System.out.println("==== pw:"+m.getPw());
	}
	@RequestMapping("/login")
	public void login() {
	}
	@RequestMapping("/loginProc")
	public String loginProc(HttpSession s,
			@RequestParam("id") String id, @RequestParam("pw") String pw) {
		log.info("==== id:"+id);
		log.info("==== pw:"+pw);
		s.setAttribute("id", id);
		s.setAttribute("pw", pw);
		return "redirect:/";
	}
	@RequestMapping("/logout")
	public String loginProc(HttpSession s) {
		s.invalidate();
		return "redirect:/";
	}
}

 

 

[결론]
 
* 스프링 기초 강의 수강

 

*작업파일


 0228
1) 스프링 기초