본문 바로가기

Springあるある

HttpServletRequest VS @SessionAttribute

@GetMapping("/")
public String homeLoginV3(HttpServletRequest request, Model model)
{

    // 로그인 안 한 사용자(세션id가 없는 사용자)도 홈 화면에 들어 올 수가 있어야 한다
    // -> 고로, request.getSession()를 false로 하여 신규 세션이 생성되지 않도록 하여야 한다.
    HttpSession session = request.getSession(false);
    if(session == null)
        return "home";

    Member loginMember = (Member)session.getAttribute(SessionConst.LOGIN_MEMBER);
    if(loginMember == null)
        return "home";

    // 세션이 유지되면 로그인으로 이동동
   model.addAttribute("member",loginMember);
    return "loginHome";

}

HttpServletRequest은 getSession() 사용시 기본값이 true이다. 

즉, getSession(true)일 때 요청 HTTP 헤더에 sessionId가 없으면 신규로 자동 생성을 해준다. 

@GetMapping("/")
public String homeLoginV3Spring(@SessionAttribute(name=SessionConst.LOGIN_MEMBER,required = false) Member loginMember, Model model)
{

    if(loginMember == null)
        return "home";

    // 세션이 유지되면 로그인으로 이동동
    model.addAttribute("member",loginMember);

    return "loginHome";

}

그러나 스프링이 제공하는 @SessionAttribute는 요청 Http 헤더에 sessionId가 없어도 자동 생성을 해주지 않는다. 

@SessionAttribute는 요청 Http 헤더에 sessionId가 있는 경우에만 사용을 하여야 한다는 점에 주의하자

 

 

 

/**
 * 로그인 성공 처리
 */
// Http 요청에 기존 세션(sessionId) 반환, 없으면 신규 세션(sessionId) 생성
// -> 이 메서드는 최초 로그인할 때 호출되는 것이니 당연히 세션이 없다.
HttpSession session = request.getSession();
session.setAttribute(SessionConst.LOGIN_MEMBER,loginMember); // 세션(sessionId)에 대한 객체(LoginForm) 저장!

사용자가 로그인을 하였을 때 실행되는 컨트롤러 로직이다. 

request.getSession()은 신규 세션을 만들어서 그 SessionId를 session 변수가 가지고 있다.