: 일반적으로 폼에서 hidden 값을 폼전송시 넘겨줄때가 많다. 이제 @SessionAttribute 어노테이션을 이용해서 폼에 적어주는 hidden 필드를 생략해보고자 한다. 그림을 보고 난 다음에 설명을 해야 이해하기가 수월할것 같다. 아래 그림을 보자.
(1) 사용자가 폼 페이지로 이동하기위한 요청을 보낸다.
(2) GameRegForm() 메서드에서 GameDto 객체에 사용자의 이메일과 게임 타입 데이터를 저장한 후, 모델 객체에 담아서 뷰 페이지로 전송한다.
(3) 이때 GameController에 @SessionAttribute 어노테이션이 설정되어 있기때문에 모델 객체를 뷰페이지로 전송해주는것과 동시에 세션에도 game 모델 객체를 저장한다.
(4) 이제 폼 페이지에서 입력을 마친후, 폼 전송 처리 버튼을 누르게 되면 Game 컨트롤러의 gameReg() 핸들러 메서드로 폼 데이터를 전송한다.
(5) 이때 gameReg() 메서드의 GameDto 파라미더 객체에 @ModelAttribute의 이름이 game인것을 확인하고, 폼 데이터를 핸들러 메서드로 바로 전송하지않고, 세션에 저장된 game 모델 객체와 폼에서 전송된 데이터들이 합친후에 핸들러 메서드로 전송한다.
@SessionAttributes 어노테이션을 사용하지 않았을때에는 gameRegForm() 핸들러 메서드에서 뷰 페이지로 넘긴 사용자 이메일과 게임 타입 데이터는 폼에서 hidden 필드에 저장되어 다시 gameReg() 핸들러 메서드로 전송되었을것이다. 하지만 @SessionAttribute 어노테이션을 사용함으로 인해서 사용자 이메일과 게임 타입 데이터는 이미 세션에 저장이 되어 있는 상태이고, 폼 페이지에는 별도로 hidden 값으로 이메일과 게임타입 데이터를 넘길 필요가 없이 폼이 전송이 될때 세션에 저장되어 있는
game 모델 객체와 합쳐지므로, 자연스럽게 이메일과 게임타입 데이터를 가지고서 gameReg() 핸들러 메서드로 game 객체가 전달이 되는것이다.
폼의 수정페이지에서도 @SessionAttribute를 적용하게 되면, 폼 수정페이지에 필요한 hidden 필드들을 모두 없앨 수 있을것이다.