본문 바로가기
Spring

2022-12-08 Session, Model객체

by HTT 2022. 12. 8.
Session

 

쿠키시스템

: 클라이언트A에게 최초 request가 들어오면 서버가 세션 id를 만든다. 이 세션 id를 response하면서 쿠키에 담아 보내고, 다음에 또 A에게 request가 왔을 때는 처음 만들어뒀던 세션id를 함께 보낸다.

 

세션 id는 클라이언트마다 다르고, 같은 클라이언트여도 브라우저마다 다르다.

 

로그인, 로그아웃 기능을 구현해볼 건데, 쿠키를 이용해야 하기 때문에 session을 생성하는 메소드를 이용해야 한다.

 

- 로그인처리

public ModelAndView login(MemberDTO loginUserInfo, HttpServletRequest request) {
	ModelAndView mav = new ModelAndView();
//	loginUserInfo => 로그인을 요청한 사용자의 정보(id, pass)가 저장되는 객체
//	user => 로그인을 성공한 후 리턴되는 객체
//	
//	1. 로그인 사용자가 있는지 db에서 인증하기    
	MemberDTO user = service.login(loginUserInfo);
//	2. 로그인한 사용자의 정보를 세션에 저장
//	* 세션을 생성
//	=> getSession()을 이용해서 세션을 생성 : 세션이 이미 서버에 만들어진 게 있으면 그 세션을 반환
//	                                     세션이 만들어진 게 없으면 무조건 새로 생성     
	String viewName = "";
	if (user != null) {
		HttpSession session = request.getSession();
		session.setAttribute("user", user);
		viewName = user.getMenupath();
	} else {
		// 로그인실패
		viewName = "login";
	}
	mav.setViewName(viewName);
	return mav;
}

=> 요청을 보내면서 서버가 만든 세션을 받아와 세션에 "user"의 데이터를 입력해 로그인을 성공했을 때 실행될 알맞은 메소드를 셋팅해준다. 

 

 

이때 개발자가 직접 세션을 생성하지 않아도 알아서 세션처리를 해주는 Spring의 기능을 이용해보자.

① @SessionAttributes

사용법 : @RequestMapping("/emp")

"emp"라는 이름으로 등록된 객체를 세션에 자동으로 등록해준다.

 

② SessionStatus

스프링 내장객체인 SessionStatus의 setComplete() 메소드를 이용해 세션에 있는 객체를 제거하는 작업을 자동으로 수행해준다.

 

 

우선 Controller, Service처럼 annotation을 등록해준다. 

@RequestMapping( "test" ) <-- 괄호 안에 객체 이름을 지정하고 모델객체의 addAttribute() 메소드에 담아주기만 하면 된다. 

 

// MemberController.java
@Controller
@RequestMapping("/emp")
@SessionAttributes("user")
public class MemberController {
@RequestMapping("/spring/login")
	public String springlogin(MemberDTO loginUserInfo, Model model) {
		System.out.println("스프링이 제공하는 @SessionAttributes를 이용해서 세션처리하기");
		MemberDTO user = service.login(loginUserInfo);
		String viewName = "";
		if (user != null) {
			model.addAttribute("user", user);
			viewName = user.getMenupath();
		} else {  // 로그인실패
			viewName = "login";
		}
		return viewName;
	}
}

=> "user"라는 이름의 객체를 세션으로 등록하겠다고 선언해주고 리턴타입은 ModelAndView가 아닌 String타입으로 정의해준다. 전에 했던 ModelAndView를 리턴하는 방식과 비슷하지만 특정객체를 모델객체에 담는다는 차이점이 있다.

마지막에 리턴하는 변수타입도 ModelAndView가 아니라 View 정보라는 것을 주의하자.

 

 

// MemberServiceImpl.java
public MemberDTO login(MemberDTO loginUser) {
	//db에서 가져온 값에서 menupath를 가공
	MemberDTO user = dao.login(loginUser);
	System.out.println("service"+user); //db인증 후 결과
	// /menu/jeamu_menu.jsp
	if(user != null) {
		String menuPath = user.getMenupath();
		menuPath = menuPath.substring(menuPath.indexOf("/")+1, menuPath.indexOf("_"));
		user.setMenupath(menuPath); //잘라낸 문자열이 재저장됨
	}
	return user;
}

=> DB에 저장된 "menuPath"의 데이터가 ~~~~.jsp이기 때문에 String의 메소드를 이용해 특정 문자들만 추출해 재지정해준다.

이 이후부터는 똑같은 과정이기 때문에 생략~

 

 

 

- 로그아웃 처리

@RequestMapping("/spring/logout")
	public String springlogout(SessionStatus status) {
		status.setComplete();
		return "redirect:/index.do";
	}

=> 스프링 내부객체인 SessionStatus를 이용해서 세션에 있는 user객체를 제거해 로그아웃기능을 처리한다.

 

 

 

 

 

Model

: Attribute정보를 담고있는 객체로 ModelAndView객체에서 Model만 빼와서 사용할 수 있음

 

// BoardController.java
@RequestMapping("/board/read.do")
	public String read(String board_no, String state, Model model) {
//		ModelAndView mav = new ModelAndView(view);
		BoardDTO board = service.getBoardInfo(board_no);
		String view = "";
		if(state.equals("READ")) {
			view = "board/read";
		}else {
			view = "board/update";
		}
//		mav.setViewName(view);
		model.addAttribute("board", board);
		return view;
	}

매개변수로 Model객체를 이용해 데이터를 가져오고 addAttribute() 메소드를 이용해 데이터를 담아준다.

 

 

댓글