@SessionAttributes

코딩냥이·2024년 9월 10일

Annotation

목록 보기
31/34

@SessionAttributes

@SessionAttributes는 스프링 MVC에서 특정 모델 속성을 HTTP 세션에 저장하고 관리하기 위해 사용되는 어노테이션입니다.

기능

  1. 지정된 모델 속성을 HTTP 세션에 저장합니다.
  2. 여러 요청에 걸쳐 모델 속성을 유지합니다.
  3. 폼 처리 시 여러 단계에 걸친 데이터 유지에 유용합니다.

사용 방법

기본적인 사용 방법은 다음과 같습니다:

import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.stereotype.Controller;

@Controller
@SessionAttributes("user")
public class UserController {

    @GetMapping("/user/form")
    public String showForm(Model model) {
        model.addAttribute("user", new User());
        return "userForm";
    }

    @PostMapping("/user/save")
    public String saveUser(@ModelAttribute("user") User user) {
        // user 객체는 세션에서 가져와 업데이트됨
        userService.saveUser(user);
        return "userSaved";
    }
}

주요 특징

  1. 세션 유지: 지정된 속성을 HTTP 세션에 저장하여 여러 요청에 걸쳐 데이터를 유지합니다.
  2. 타입 또는 이름으로 지정: 속성을 이름으로 지정하거나 타입으로 지정할 수 있습니다.
  3. 자동 바인딩: @ModelAttribute와 함께 사용 시, 세션에서 속성을 자동으로 바인딩합니다.
  4. 세션 정리: SessionStatus 객체를 통해 세션 속성을 명시적으로 정리할 수 있습니다.

고급 사용법

1. 여러 속성 지정

@Controller
@SessionAttributes({"user", "shoppingCart"})
public class ShoppingController {
    // 컨트롤러 메소드들...
}

2. 타입으로 속성 지정

@Controller
@SessionAttributes(types = {User.class, ShoppingCart.class})
public class ShoppingController {
    // 컨트롤러 메소드들...
}

3. SessionStatus를 이용한 세션 정리

@PostMapping("/checkout")
public String checkout(@ModelAttribute("shoppingCart") ShoppingCart cart,
                       SessionStatus status) {
    orderService.createOrder(cart);
    status.setComplete(); // 세션에서 속성 제거
    return "orderConfirmation";
}

4. @ModelAttribute와 함께 사용

@ModelAttribute("user")
public User getUser() {
    return new User(); // 세션에 없으면 새 객체 생성
}

@PostMapping("/user/update")
public String updateUser(@ModelAttribute("user") User user) {
    // user 객체는 세션에서 가져와 업데이트됨
    userService.updateUser(user);
    return "userUpdated";
}

주의사항

  1. 메모리 사용: 세션에 너무 많은 데이터를 저장하면 서버 메모리 사용량이 증가할 수 있습니다.
  2. 동시성 문제: 여러 탭이나 창에서 동시에 같은 세션을 사용할 때 데이터 일관성 문제가 발생할 수 있습니다.
  3. 세션 타임아웃: 세션 타임아웃으로 인해 예기치 않게 데이터가 손실될 수 있습니다.
  4. 보안: 민감한 정보를 세션에 저장할 때는 보안에 주의해야 합니다.

베스트 프랙티스

  1. 필요한 데이터만 저장: 세션에는 꼭 필요한 데이터만 저장하세요.
  2. 명시적 세션 정리: 세션 데이터가 더 이상 필요 없을 때 SessionStatus.setComplete()를 호출하여 정리하세요.
  3. 타임아웃 고려: 세션 타임아웃을 고려하여 중요한 데이터는 적절히 백업하거나 재생성할 수 있게 설계하세요.
  4. 동시성 처리: 동시 요청 시 데이터 일관성을 유지할 수 있도록 설계하세요.
  5. 보안 주의: 민감한 정보는 암호화하거나 가능한 세션에 저장하지 않도록 하세요.

@SessionAttributes vs HttpSession

  • @SessionAttributes: 특정 컨트롤러에 한정된 세션 관리에 적합합니다.
  • HttpSession: 애플리케이션 전반의 세션 관리에 사용됩니다.

테스트

@SessionAttributes가 적용된 컨트롤러를 테스트할 때:

@WebMvcTest(UserController.class)
class UserControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    void testSessionAttributes() throws Exception {
        mockMvc.perform(get("/user/form"))
               .andExpect(status().isOk())
               .andExpect(model().attributeExists("user"))
               .andExpect(request().sessionAttribute("user", instanceOf(User.class)));

        mockMvc.perform(post("/user/save")
               .param("name", "John Doe"))
               .andExpect(status().isOk())
               .andExpect(request().sessionAttribute("user", hasProperty("name", is("John Doe"))));
    }
}

결론

@SessionAttributes는 스프링 MVC에서 세션 기반의 데이터 관리를 간편하게 할 수 있게 해주는 유용한 도구입니다. 특히 여러 단계에 걸친 폼 처리나 위저드 형태의 인터페이스 구현에 적합합니다. 그러나 세션 데이터 관리에는 메모리 사용, 동시성, 보안 등의 고려사항이 있으므로 신중하게 사용해야 합니다. 적절히 사용하면 사용자 경험을 향상시키고 서버-클라이언트 간 데이터 전송을 최적화할 수 있지만, 과도한 사용은 애플리케이션의 확장성과 유지보수성을 저하시킬 수 있습니다.

연관 포스팅

@ModelAttribute
@Controller
@RequestMapping
@InitBinder
@ControllerAdvice

profile
HelloMeow~!

0개의 댓글