티스토리 뷰

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 객체 타입으로 캐스팅(형변환) 하여 사용할 수 있다.

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함