본문 바로가기
[ JAVA ]/JAVA Spring

[ Spring ] @SessionAttribute Session Search

by 환이s 2024. 1. 8.


오늘은 Spring에서 Session을 더 편리하게 사용할 수 있도록 지원해 주는 @SessionAttribute 애노테이션을 포스팅해보겠습니다.

 

@SessionAttribute 란?

 

 

@SessionAttribute는 Controller 밖에서 만들어준 Session 데이터에 접근할 때 사용합니다.

(Interceptor , Filter 등)

 

Session은 여러 화면이나 요청에서 사용해야 하는 객체를 공유할 때 사용할 수 있는데, 

HttpSession으로 객체 자체를 값을 넣어줄 수 있고, 사용할 수 있습니다.

 

해당 HttpSession보다 더 추상화된 방법으로 사용되는 것이 @SessionAttribute 애노테이션입니다.

 

간단한 조회 메서드를 통해서 알아보자면

 

    @GetMapping("/")
    public String homeLoginV3Spring(
            @SessionAttribute(name = SessionConst.LOGIN_MEMBER, required = false) Member loginMember, Model model) {
        /*
        *     [@SessionAttribute]
        *
        *   Spring은 Session을 더 편리하게 사용할 수 있도록 @SessionAttribute을 지원한다.
        *
        *   이미 Login 된 사용자를 찾을 때는 다음과 같이 사용하면 된다.
        *   참고로 이 기능은 session 을 생성하지 않는다.
        *
        *   @SessionAttribute(name = "loginMember", required = false) Member loginMember
        *
        * */


        //세션에 회원 데이터가 없으면 home
        if (loginMember == null) {
            return "home";
        }

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

 

Session을 찾고, Session에 들어있는 데이터를 찾는 번거로운 과정을 Spring이 한 번에 처리해 주는 것을 확인할 수 있는데, 

@SessionAttribute 애노테이션은 이미 로그인된 사용자를 찾을 때는 위 코드처럼 사용하면 됩니다.

 

@SessionAttribute(name = "loginMember", required = false) Member loginMember

 

 

참고로 이 기능은 Session을 생성하지 않습니다.

 

만약 @SessionAttribute을 사용하지 않은 경우에 Session을 찾고 데이터를 찾고 싶다면 아래 코드처럼 하면 됩니다.

 

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

        HttpSession session = request.getSession(false);
        if (session == null) {
            return "home";
        }

        Member loginMember = (Member)session.getAttribute(SessionConst.LOGIN_MEMBER);

        //세션에 회원 데이터가 없으면 home
        if (loginMember == null) {
            return "home";
        }

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

        /*
        *  request.getSession(false) : request.getSession()를 사용하면 기본값이 create : false 이므로,
        *   Login 하지 않을 사용자도 의미없는 session이 만들어진다. 따라서 session을 찾아서 사용하는 시점에는 create : false option을 사용해서
        *   session 을 create 하지 않아야 한다.
        *
        *  session.getAttribute(SessionConst.LOGIN_MEMBER) : Login 시점에 session에 보관한 회원 객체를 찾는다.
        * */
    }

TrackingModes

 

 

로그인을 처음 시도하면 URL이 다음과 같이 JSESSIONID를 포함하고 있는 것을 확인할 수 있습니다.

 

http://localhost:8080/;jsessionid=F59911518B921DF62D09F0DF8F83F872

 

  • 이것은 웹 브라우저가 쿠키를 지원하지 않을 때 쿠키 대신 URL을 통해서 SESSION을 유지하는 방법입니다.
    • 이 방법을 사용하려면 URL에 이 값을 계속 포함해서 전달해야 합니다.
  • URL 전달 방식을 끄고 항상 쿠키를 통해서만 SESSION을 유지하고 싶으면 다음 옵션을 넣어주면 됩니다.
    • 이렇게 하면 URL에 JSESSIONID가 노출되지 않습니다.

 

[ application.properties ]

server.servlet.session.tracking-modes=cookie

마치며

 

오늘은 @SessionAttribute 애노테이션을 사용해서 세션 조회하는 방법에 대해 알아봤습니다.

위 포스팅은 김영한님의 Spring MVC 2편 - 백엔드 웹 개발 활용  강의를 참고했습니다

 

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 강의 - 인프런

웹 애플리케이션 개발에 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. MVC 2편에서는 MVC 1편의 핵심 원리와 구조 위에 실무 웹 개발에 필요한 모든 활용 기술들을 학습할 수 있

www.inflearn.com

 

728x90