[Spring] SessionStatus는 어떻게 동작할까?
Spring MVC 에서 SessionStatus 라는것이 존재합니다.
(현재는 대부분의 서비스회사들이 Session을 사용하지 않기 때문에 사용하지 않는 회사들은 무의미 할수 있겠네요)
SessionStatus는 @SessionAttributes를 활용해 Session에 남긴 데이터를 정리하는데 활용을 하는 인터페이스 입니다.
(Controller에 args로 선언해두면 injection이 되며 정리는 setComplete() 를 통해 정리 flag를 세팅합니다.)
SessionStatus 에 setComplete()를 호출하게 되면 내부적으로 complete boolean을 세팅하게 되고
RequestMappingHandlerAdapter에서 modelFactory의 updateModel() 내부에서 대상 attribute들을 정리하게 됩니다.
여기서 @SessionAttributes이 등장하는데
@SessionAttributes는 names를 args로 받게 되고
지정된 names들에 대해서 model에 접근하면 기존 model 저장소가 아닌 Session 영역까지 확장되도록 도움을 줍니다.
model.addAttribute("dutch", "hello");
일반적으로 위 코드 처럼 "dutch" 라는 키로 model에 세팅하면
응답 이후 값이 삭제 됩니다.
하지만 컨트롤러 클래스 상단에 @SessionAttribues 를 세팅 후 사용한다면 동작이 변경되게 됩니다.
@RequestMapping("dutch")
@Controller
@SessionAttributes("dutch")
public class DutchController
@SessionAttributes선언 후 model.addAttribute 를 호출한다면 해당 key,value가 Session에 저장 되고,
다음 요청이 동일 세션으로 왔을때 session의 Key를 "dutch"로 조회하면 addAttribute값이 존재하는것을 볼 수 있습니다. 그리고 model을 통해 "dutch"를 조회했을때도 값이 존재하는것을 확인 할 수 있습니다.
주의해야할 사항은 해당 컨트롤러가 아닌, 다른 컨트롤러에서 모델에서 "dutch"으로 값을 얻으려 시도하면
값이 들어 있지 않습니다.
위의 컨트롤러의 경우에는 model에 "dutch" 에 해당하는 값을 줘! 라고 하면 @SessionAttributes가 설정되어있는 Key는 Session에서 값을 찾지만
@SessionAttributes("dutch") 가 달려있지 않은 컨트롤러에서 model에 ""dutch" 에 해당하는 값을 줘!" 라고 한다면
Session에서 찾는게 아니라 정말 model에서 찾기 때문에 값이 존재 하지 않습니다.
'JAVA > Spring' 카테고리의 다른 글
SpringBoot App에 외부 libs 추가 (0) | 2023.11.19 |
---|---|
[JPA] LockType (0) | 2020.07.23 |
[Spring] LifeCycle, SmartLifeCycle (0) | 2020.06.23 |
[MSA] sidecar 패턴 (0) | 2020.01.13 |
[SpringConfig] Properties 암호화 (0) | 2019.12.24 |