오늘은 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편 - 백엔드 웹 개발 활용 강의를 참고했습니다
'[ JAVA ] > JAVA Spring' 카테고리의 다른 글
[ Spring ] Spring Interceptor - 요청 로그 (4) | 2024.01.11 |
---|---|
[ Spring ] Spring Interceptor - 소개 (69) | 2024.01.09 |
[ Spring Boot ] Bean Validation - HTTP Message Converter (5) | 2024.01.04 |
[ Spring Boot ] Bean Validation - Form 전송 객체 분리 (57) | 2024.01.02 |
[ Spring Boot ] Bean Validation (0) | 2023.12.29 |