@SessionAttributes 어노테이션에 대한 질문입니다..
- 작성자 :
- 장*주
- 작성일 :
- 2010-10-22 16:30:12
- 조회수 :
- 4,014
- 구분 :
- 실행환경
- 진행상태 :
- 완료
Q
제가 알고 있기로 Spring에서 가장 문제가 됬었던게 글저장, 글수정, 글삭제
처리때의 문제 입니다..
즉, 예를 들어서 글저장 한다음에 return "forward:/test/bbsList.do"; 로
포워딩을 하고 그상태에서 Replace 버튼을 누르게 되면 방금 저장된 데이터가
다시 DB에 저장되는 결과를 초래했었습니다.. 그래서 저는 기존에 글저장, 수정, 삭제
처리를 한다음 무조건 Redircet 를 시켰습니다...
그런데 지금 전자정부 프레임워크 제공하고 있는 게시판 이나, 기타 다른 샘플들 보면
전부 forwad를 시키고 있더라구요...
그래서 보다보니 샘플로 제공하는 샘플코드를 보니 @SessionAttributes 이라는걸
선언해 놓고 저장이 완료가 되면 status.setComplete(); 을 시키더라구요...
이게 제가 말하는 중복저장을 방지하기 위해서 하는거 같은데 맞는건가요???
그런데 이상한거는 공통컴포넌트에서 제공하는 게시판 소스를 보면 저런 처리도 안해
놓고 그냥 리스트 페이지로 foward 시키고 있더라구요... 그러면 분명히 새로고침
하면 데이터가 중복으로 들어갈텐데 말이죠....
1. @SessionAttributes, status.setComplete(); 를 사용하면 데이터 중복
입력되는 상황을 막을수 있는건가요???
제가 한번 테스트 해보려고 클래스 위에 @SessionAttributes(types=TestVO.class)
로 선언해 놓고 돌렸더니 아래와 같은 에러가 나더라구요...
Session attribute 'testVO' required - not found in session
그래서 샘플과 똑같이 아래것을 추가 했는데...
@RequestMapping("/sample/selectSample.do")
public @ModelAttribute("testVO") ... { }
그런데도 같은 에러가 납니다....
@SessionAttributes 이걸로 데이터 중복을 방지 할수 있는지와 셋팅을 어디를
어떻게 해야 에러가 나질 않는건가요???
사용법에 대한 설명 나와 있는 부분이 어디에 없나요??
2. 만약 저부분이 데이터 중복 방지가 아니라면 전자정부 프레임워크를 전부 다
뒤져봤지만 그 부분에대한 설명은 없더라구요... 소스도 보면 다 forward 시키고
있는데 (게시판) 특별히 새로고침할때 데이터 중복을 방지하기 위한 설정은
안보이던데 혹시 다른 방법이 있는건가요???
처리때의 문제 입니다..
즉, 예를 들어서 글저장 한다음에 return "forward:/test/bbsList.do"; 로
포워딩을 하고 그상태에서 Replace 버튼을 누르게 되면 방금 저장된 데이터가
다시 DB에 저장되는 결과를 초래했었습니다.. 그래서 저는 기존에 글저장, 수정, 삭제
처리를 한다음 무조건 Redircet 를 시켰습니다...
그런데 지금 전자정부 프레임워크 제공하고 있는 게시판 이나, 기타 다른 샘플들 보면
전부 forwad를 시키고 있더라구요...
그래서 보다보니 샘플로 제공하는 샘플코드를 보니 @SessionAttributes 이라는걸
선언해 놓고 저장이 완료가 되면 status.setComplete(); 을 시키더라구요...
이게 제가 말하는 중복저장을 방지하기 위해서 하는거 같은데 맞는건가요???
그런데 이상한거는 공통컴포넌트에서 제공하는 게시판 소스를 보면 저런 처리도 안해
놓고 그냥 리스트 페이지로 foward 시키고 있더라구요... 그러면 분명히 새로고침
하면 데이터가 중복으로 들어갈텐데 말이죠....
1. @SessionAttributes, status.setComplete(); 를 사용하면 데이터 중복
입력되는 상황을 막을수 있는건가요???
제가 한번 테스트 해보려고 클래스 위에 @SessionAttributes(types=TestVO.class)
로 선언해 놓고 돌렸더니 아래와 같은 에러가 나더라구요...
Session attribute 'testVO' required - not found in session
그래서 샘플과 똑같이 아래것을 추가 했는데...
@RequestMapping("/sample/selectSample.do")
public @ModelAttribute("testVO") ... { }
그런데도 같은 에러가 납니다....
@SessionAttributes 이걸로 데이터 중복을 방지 할수 있는지와 셋팅을 어디를
어떻게 해야 에러가 나질 않는건가요???
사용법에 대한 설명 나와 있는 부분이 어디에 없나요??
2. 만약 저부분이 데이터 중복 방지가 아니라면 전자정부 프레임워크를 전부 다
뒤져봤지만 그 부분에대한 설명은 없더라구요... 소스도 보면 다 forward 시키고
있는데 (게시판) 특별히 새로고침할때 데이터 중복을 방지하기 위한 설정은
안보이던데 혹시 다른 방법이 있는건가요???
A
안녕하세요, 장선주님
[답변1]
@SessionAttributes는 model attribute를 session에 저장, 유지할 때 사용하는 어노테이션입니다.
사용목적은 연속해서 클라이언트로부터 submit이 날라오는 경우 중복 submit을 방지할 때 이용됩니다. SessionAttributes을 담은 객체는 SessionStatus의 setComplete()를 호출해주기 전까지 계속 담겨 있습니다.
그래서 Controller의 메소드에서 SessionStatus의 isComplete() 확인을 통해 Session내에 지정된 model이 있는지 체크/중복(실행)할 수 있습니다.
testVO.class 클래스 타입에 해당되는 객체가 @ModelAttribute를 통해 model에 담아질 때에 session에 보관됩니다. @ModelAttribute를 지정하면 해당 VO(또는 Object)을 model에 담아서 View(JSP)로 넘기도록 되어 있습니다.
즉 @SessionAttributes에 지정된 이름이 Controller의 메소드 파라미터의 @ModelAttribute에 지정된 이름으로 나타나야 해당 VO 정보가 session에 보관되는 방식입니다.
일반적으로는 @ModelAttribute 사용하시면 session에 정보를 보관하실 수 있지만 추가적으로 addAttribute를 통해 model에 해당 이름(@SessionAttributes에 지정된 이름)으로 넣으셔도 처리되도록 되어 있습니다.
일단 @SessionAttributes에 지정된 이름이 호출되는 Controller 메소드의 파라미터 중 @ModelAttribute로 지정되고 해당 이름이 @SessionAttributes로 지정된 이름과 같은지 확인하시기 바랍니다.
[답변2]
새로고침을 할 때에 "다시 시도"를 선택하면 화면이 나타나도록 되어 있는데
이 경우 "예"를 선택하시면 브라우저가 동일한 요청을 다시 서버에 던지기 때문에 서버에서는 새로운 요청과 같이 처리되도록 되어 있습니다.
이 부분을 회피하려면 session에 필요한 정보들을 추가로 적용하시면 됩니다. (해당 부분은 전자정부 표준프레임워크에서 적용되어 있지 않은 상태로 별도로 조치하여야 합니다.)
감사합니다.
[답변1]
@SessionAttributes는 model attribute를 session에 저장, 유지할 때 사용하는 어노테이션입니다.
사용목적은 연속해서 클라이언트로부터 submit이 날라오는 경우 중복 submit을 방지할 때 이용됩니다. SessionAttributes을 담은 객체는 SessionStatus의 setComplete()를 호출해주기 전까지 계속 담겨 있습니다.
그래서 Controller의 메소드에서 SessionStatus의 isComplete() 확인을 통해 Session내에 지정된 model이 있는지 체크/중복(실행)할 수 있습니다.
testVO.class 클래스 타입에 해당되는 객체가 @ModelAttribute를 통해 model에 담아질 때에 session에 보관됩니다. @ModelAttribute를 지정하면 해당 VO(또는 Object)을 model에 담아서 View(JSP)로 넘기도록 되어 있습니다.
즉 @SessionAttributes에 지정된 이름이 Controller의 메소드 파라미터의 @ModelAttribute에 지정된 이름으로 나타나야 해당 VO 정보가 session에 보관되는 방식입니다.
일반적으로는 @ModelAttribute 사용하시면 session에 정보를 보관하실 수 있지만 추가적으로 addAttribute를 통해 model에 해당 이름(@SessionAttributes에 지정된 이름)으로 넣으셔도 처리되도록 되어 있습니다.
일단 @SessionAttributes에 지정된 이름이 호출되는 Controller 메소드의 파라미터 중 @ModelAttribute로 지정되고 해당 이름이 @SessionAttributes로 지정된 이름과 같은지 확인하시기 바랍니다.
[답변2]
새로고침을 할 때에 "다시 시도"를 선택하면 화면이 나타나도록 되어 있는데
이 경우 "예"를 선택하시면 브라우저가 동일한 요청을 다시 서버에 던지기 때문에 서버에서는 새로운 요청과 같이 처리되도록 되어 있습니다.
이 부분을 회피하려면 session에 필요한 정보들을 추가로 적용하시면 됩니다. (해당 부분은 전자정부 표준프레임워크에서 적용되어 있지 않은 상태로 별도로 조치하여야 합니다.)
감사합니다.