공부기록/스프링

스프링 HTTP Session 사용

gyungmean 2023. 5. 22. 23:03

@SessionAttributes

Controller 클래스에 적용되며 지정된 이름 또는 타입의 model객체들을 session에 저장 및 사용한다.

controller가 세션을 통해 임시적으로 유지 및 공유하고자 하는 model 객체들을 지정하기 위해 사용한다.

여러 controller 사이의 데이터 공유는 HttpSession을 직접 이용하는 것이 바람직하다.

@RequestMapping("/someURI")
public String process(HttpServletRequest request, ... ) {
    if (someCondition) {
        HttpSession session = request.getSession();
        ... // someCondition이 true인 경우에만 Session 생성 및 사용
    }
}
@RequestMapping("/someURI")
public String process(HttpSession session, ... ) {
    assert(session != null); // true
    //session이 이미 존재하면 그 session을 전달하고 아니라면 새로운session생성
    ..
}

 

session 사용 예

@Controller
@SessionAttributes("eventForm") // session에 저장할 객체 이름
public class EventCreationController {
    @ModelAttribute("eventForm") // EventForm 객체를 생성하여 session에 저장
    public EventForm formData() {
    	return new EventForm();
    }
    @RequestMapping("/newevent/step1") // Step1 요청 URL
    public String step1() {
    	return "event/creationStep1"; // Step1 view로 이동
    }
    // Step1에서 Step2로 이동
    @PostMapping("/newevent/step2")
    public String step2(@ModelAttribute("eventForm") EventForm formData,
    BindingResult result) { // session에 저장된 EventForm 객체 접근
        new EventFormStep1Validator().validate(formData, result);
        if (result.hasErrors()) // 검증 오류 발생 시
        	return "event/creationStep1"; // Step1 view로 이동
        return "event/creationStep2"; // Step2 view로 이동
    }
    // Step3에서 Step2로 되돌아옴
    @GetMapping("/newevent/step2")
    public String step2FromStep3(@ModelAttribute("eventForm") EventForm formData) {
    	return "event/creationStep2"; // Step2 view로 이동
    }
    // Step2에서 Step3로 이동
    @PostMapping("/newevent/step3")
    public String step3(@ModelAttribute("eventForm") EventForm formData,
    BindingResult result) { // session에 저장된 EventForm 객체 접근
        ValidationUtils.rejectIfEmpty(result, "target", "required");
        if (result.hasErrors()) // 검증 오류 발생 시
        	return "event/creationStep2"; // Step2 view로 이동
        return "event/creationStep3"; // Step3 view로 이동
    }
    // Step3에서 Step4로 이동
    @PostMapping("/newevent/done")
    public String done(@ModelAttribute("eventForm") EventForm formData,
    SessionStatus sessionStatus) {
        // formData 처리 …
        sessionStatus.setComplete(); // session에서 객체 삭제
        return "event/creationDone"; // Step4 view로 이동
    }
}

@SessionAttributes를 통해 세션을 생성하고

session을 적용시킬 command객체를 생성시킨다.

마지막 스텝에서 setComplete()를 통해 종료시킨다.