티스토리 뷰
Session
Spring MVC에서 제공하는 세션이란?
⇢ HTTP 세션을 의미
• 클라이언트(일반적으로 웹 브라우저)와 웹 서버 간의 연결이 지속적으로 유지되는 동안
서버 측에 저장되는 데이터를 의미하며, HTTP 프로토콜(웹)은 기본적으로 상태가 없는(stateless)
프로토콜이기 때문에 주로 사용자의 상태 정보를 유지하기 위해 세션을 사용한다.
• Spring MVC 에서는 HttpSession 객체를 통해 세션을 관리
≫ HttpSession은 사용자 별로 생성 / 웹 서버에 의해 관리되는 세션 정보를 나타냄
- 사용자가 페이지를 이동하게 되면 이전 페이지의 모든 정보가 사라진다.
따라서 이를 해결하기 위해 세션/쿠키 라는 기술이 사용되고 있고,
이 중 Session(세션) 은 서버 측에서 관리되는 정보이다.
- 세션은 사용자가 웹 사이트에 로그인 시 서버에 생성되고, 고유 세션 ID가 부여됨
(해당 세션 ID는 클라이언트, 즉 웹 브라우저에게 전달되어 클라이언트의 요청이
들어올 때마다 해당 세션 ID를 통하여 사용자를 식별할 수 있다.)
더 쉽게 말하면!
Session(세션) 에는 사용자의 로그인 정보/접속 정보/장바구니 정보 등
사용자에 관련된 다양한 데이터들을 저장할 수 있고, 이러한 점을 통하여
사용자가 페이지를 이동함에도 로그인 상태/장바구니 상태 등을 유지할 수 있다.
하지만, 기본적으로 설정된 시간이 있고
사용자가 로그아웃하거나 일정 시간 활동이 없다면 만료 후 삭제된다.
(사용자 정보를 안전히 보호, 서버 자원을 효율적으로 관리하기 위함)
*설정된 시간은 원하는 만큼 직접 지정할 수 있다.
Spring MVC 에서 사용하는 세션 관련 어노테이션
@SessionAttributes
- 해당 어노테이션은 컨트롤러 내 클래스 레벨에서 사용 가능하며,
모델의 특정 속성을 HTTP 세션에 저장하는데 사용된다.
- 해당 어노테이션으로 지정된 이름을 가진 모델 속성은 HTTP 세션으로 자동 추가된다.
@Controller
@SessionAttributes("user")
public class UserController {
...
}
≫ 위 예시에서 user 라는 이름의 모델 속성이 세션에 저장됨
@ModelAttribute
- 이는 메소드 레벨 / 매개변수 레벨에서 사용됨
1. 메소드에 사용 : 해당 메소드가 반환하는 객체를 모델에 추가
2. 매개변수에 사용 : 해당 매개변수를 모델에서 가져오거나, 없다면 새로 생성
• 메소드 레벨에서 사용
@ModelAttribute("user")
public User getUser() {
return new User();
}
≫ 위 예시에서 user 라는 이름으로 User 객체가 모델에 추가됨
• 매개변수 레벨에서 사용
@PostMapping("/user")
public String createUser(@ModelAttribute User user) {
// 여기서 user 객체는 요청 파라미터와 자동으로 매핑되어 생성됩니다.
userService.createUser(user);
return "redirect:/";
}
≫ 위 예시에서는 클라이언트로부터 전달받은 요청 파라미터(값)가 User 객체에 자동으로 바인딩(bind) 된다.
≫ 만약, 클라이언트로부터 'name' 과 'email' 이라는 파라미터를 전달 받았다면,
이들은 User 객체의 'name' 과 'email' 필드에 자동으로 매핑되는 걸 알 수 있다.
≫ 따라서 @ModelAttribute 를 사용하면 요청 값을 직접 조회하지 않고 객체로 손쉽게 변환해 사용 가능하다.
@SessionAttribute
- 컨트롤러 메소드 매개변수에 사용되면, 해당 매개변수의 값을 HTTP 세션에서 가져옴.
(만약 값이 없다면 예외가 발생할 수 있다)
@GetMapping("/user")
public String getUser(@SessionAttribute("user") User user) {
...
}
≫ 위 예시에서 user 라는 이름의 세션 속성 값을 가져옴
@SessionStatus
- 해당 인터페이스는 컨트롤러 메소드의 매개변수로 사용되며,
@SessionAttributes 로 세션에 저장된 속성을 제거할 때 사용
@PostMapping("/complete")
public String complete(SessionStatus status) {
status.setComplete();
return "redirect:/";
}
≫ 위 예시에서 세션에 저장된 모든 속성을 제거함
Session 관련 어노테이션 사용 vs HttpSession 객체 직접 사용 (차이점)
먼저 이 둘의 가장 큰 차이는 '추상화 수준' 에 있다.
"추상화" 개념은 프로그래밍에서 자주 사용되는 용어로,
복잡한 시스템과 프로세스, 로직을 단순화하여 표현하는 것을 의미
✔️
• HttpSession 객체를 직접 사용하면 세션 관련 동작을 세세히 제어할 수 있지만, 코드가 복잡해질 수 있다.
• 어노테이션을 사용하면 세션 관련 코드를 간결히 작성하지만, 세부적인 동작 제어에 어려움이 있다.
HttpSession 직접 사용
@PostMapping("/login")
public String login(@RequestParam String username, HttpSession session) {
// 세션에 속성 추가
session.setAttribute("username", username);
// 세션에 저장된 속성 값 가져오기
session.getAttribute("username", username);
system.out.println(username);
// 세션에서 속성 제거
session.removeAttribute("username");
// 세션 유효 시간 설정
session.setMaxInactiveInterval(30 * 60); // 30분
session.setMaxInactiveInterval(-1); // 세션의 시간 무한대로 설정
// 세션 무효화(전체 제거)
session.invalidate();
return "redirect:/";
}
≫ 낮은 수준의 추상화(세세한 제어)
Session 관련 어노테이션 사용
@Controller
@SessionAttributes("username") // 클래스 레벨에 사용
public class UserController {
@PostMapping("/login")
public String login(@RequestParam String username, Model model) {
// 세션에 속성 추가
model.addAttribute("username", username);
return "redirect:/";
}
@GetMapping("/profile")
public String profile(@SessionAttribute("username") String username) {
// 세션에서 속성 가져오기
System.out.println("Logged in as: " + username);
return "profile";
}
}
≫ 높은 수준의 추상화 (간편함)
Model
Model 은 Spring MVC 에서 컨트롤러와 뷰 사이 데이터 전달에 쓰이는 인터페이스
예를 들어, 컨트롤러에서 Model 객체에 데이터를 추가하면
그 저장된 데이터는 뷰에서 사용할 수 있게 되는 것이겠다.
Model 인터페이스에서는 주로 addAttribute() 메소드를 통해
데이터를 추가하고, 여기에는 두 가지의 형태가 있다.
1. addAttribute(String name, Object value)
: 이는 이름과 값을 명시적으로 지정해 모델에 추가한다.
model.addAttribute("message", "Hello, World!");
2. addAttribute(Object value)
: 이는 객체를 모델에 추가하고, 객체의 클래스명을 이름으로 사용한다.
User user = new User();
model.addAttribute(user);
➕
위에서 알아본 대로 Spring MVC 에서 세션에 값을 저장하려면
1. @SessionAttributes 어노테이션을 사용
2. HttpSession 객체가 제공하는 setAttribute 메소드 사용
그리고 Model의 addAttribute() 메소드로 모델에 데이터를 추가할 때,
이 데이터가 @SessionAttributes 어노테이션에 지정된 이름과 일치할 경우에
세션에도 자동으로 추가된다는 점을 다시 한 번 알 수 있겠다.
(@SessionAttributes 어노테이션으로 지정된 이름을 가진 모델 속성은 HTTP 세션으로 자동 추가된다.)
@Controller
@SessionAttributes("user")
public class UserController {
@GetMapping("/user")
public String getUser(Model model) { // 매개변수로 model 추가
User user = new User();
model.addAttribute("user", user);
return "user";
}
}
≫ 위 코드에서 user 라는 이름으로 User 객체를 모델에 추가하면, 이 객체는 세션에도 저장됨
반면 세션에서 값을 꺼내 쓰려면 HttpSession 의 getAttribute() 메소드를 사용한다.
@GetMapping("/displayUser")
public String displayUser(HttpSession session) {
User user = (User) session.getAttribute("user");
// user 객체를 사용하는 코드
return "displayUser";
}
≫ 위 예시에서 user 라는 이름의 세션 속성 값을 가져오고,
이 값을 User 객체 타입으로 캐스팅(형변환) 하여 사용할 수 있다.
'기술 공부' 카테고리의 다른 글
개발 개념 모음집 (˶ ᷇𖥦 ᷆˵) (1) | 2024.01.23 |
---|---|
RestTemplate (RESTful 원칙) 간단 정리 (0) | 2024.01.18 |
ObjectMapper (0) | 2024.01.18 |
Spring과 Spring Boot의 차이 (+ 궁금했던 @ResponseBody 정의) (0) | 2024.01.18 |
contextPath란? (0) | 2024.01.17 |