Model 객체를 세션에 저장했다가 다시 활용하게 해주는 기능이다.

서블릿은 기본적으로 상태를 유지하지 않으려 하는데, 상태를 유지해줘야 하는 경우에 사용한다.



1. @ModelAttributes

Command Object. 클라이언트측 파라미터를 1:1로 전담하는 property에 담아내는 방식이다.

해당 어노테이션을 붙이면 자동으로 바인딩 되고, 중간 과정을 생략한다. (인자에 넣기만 하면 된다.)

getter / setter 등의 과정을 알아서 생략할 수 있다.


Enum 객체 같은 경우여도 파라미터 이름만 알면 자동으로 매핑해준다.

그러나, 만약 같은 객체가 2개 이상 전달되는 폼 구성인 경우 굉장히 까다로워진다.

세션으로 사용자 파라미터를 List 형태로 저장하게 되는데, DB 입력 후 @ModelAttributes가 적용되지 않는다. (컬렉션을 지원하지 않기 떄문에)


1
2
3
4
5
6
7
// @ModelAttributes는 해당 값을 복수로 받고 싶을 땐
// 오로지 Java Bean 객체를 배열로 선언하는 방법 뿐이다.
public class A {
    private String[] id;
    private String[] pw;
    ...
}
cs


=> 해당 값을 복수로 받고 싶다면, 오로지 Java Bean 객체를 배열로 선언하는 방법 밖에는 없다.

=> 유동적으로 변하는 <form>에는 대응이 까다로워진다.

=> 해당 파라미터에 문제가 있을 경우, 타 단일 객체와 같이 배열이 아닌 배열 속의 객체에 바인딩 에러를 처리해주는 기술이 별도로 필요하다.



2. @SessionAttributes

어노테이션에서 설정한 Model 객체를 세션에 저장하는 역할을 한다. 해당 모델 객체를 사용할 시,

세션에서 불러와 사용하며 view에서도 이름으로 접근 가능하다. @SessionAttributes를 컨트롤러에 붙이고 모델명을 인자로 넣어준다.


 

 용도

 1

 Spring framework에서 제공하는 form 태그 라이브러리 이용시

 2

 몇 단계에 걸쳐 완성되는 form 구성시

 3

 지속적으로 사용자의 입력 값을 유지하고 싶을 떄


스프링에서 상태 유지를 위해 제공하며, 객체 위치는 view와 Controller 사이에 존재한다.

해당 어노테이션이 붙은 컨트롤러는 지정하는 세션명을 @RequestMapping으로 설정한 모든 view에서 공유하고 있어야 한다.

(공유하지 않을 시 에러가 발생함)


=> * 해결 방법

ㄱ. 해당 컨트롤러에서 맨 처음 읽어들이는 Model 객체를 통해 수동적으로 파라미터를 보내주는 것.

(반드시 첫 번째로 해당하는 view를 통해야 한다는 제약 조건)

ㄴ. @ModelAttributes 어노테이션이 붙은 메소드 사용 : 해당 컨트롤러로 접근하는 모든 요청에 어노테이션이 붙은

메소드 command() 로 메소드의 리턴값을 설정된 모델명으로

자동 포함해주는 역할을 담당한다.

클라이언트 접근시 어노테이션이 붙은 메소드의 리턴값을 보장받는다.


해당 어노테이션의 설정값과 동일한 이름을 Model 객체에서 발견시 세션 값으로 자동 변경시켜준다.

그 Model 객체가 세션값으로 대체되면, 세션값을 지우기 전까지 저장된 해당 값을 불러오게 된다.


* @SessionAttributes 사용 예시

- 고객 입력 폼 등에서 잘못 입력되어 경고창을 띄우고 다시 페이지를 만든다고 생각할 때, 최초 입력한 정보를 세션에 저장해두고 이를 바탕으로 입력 화면을 다시 띄우는 경우

- 등록 화면이 여러 페이지에 걸쳐 입력되는 경우, 미리 모델 객체를 생성해 첫번쨰 화면 내용을 객체에 저장해두고

   다음 입력 화면에서 나머지 고객 정보를 입력해 세션 객체에 추가로 저장하는 경우 (유효성 검사 시에도 유리함)


* @ModelAttributes와 같이 컬렉션 프레임워크를 지원하지 않는다. (List 지원 안 함)



3. SessionStatus 객체

사용 완료된 객체는 사용 후 SessionStatus.setComplete(); 메소드로 제거해줘야 한다. 수동으로 제거해주지 않으면 값이 계속 남아 있게 된다.

+ Recent posts