컨트롤러에서 데이터 바인딩과 @ModelAttibute에 관하여 질문드립니다.

2,366 views
Skip to first unread message

Hyungwon Jeon

unread,
Aug 17, 2014, 5:38:33 AM8/17/14
to ks...@googlegroups.com
SHTBoard
private int    subjectCode;
private String title;
private String content;


PageVO
private int    subjectCode;
private int    pageNo;
 
@RequestMapping(value="write", method=RequestMethod.POST)
public String write(@ModelAttribute SHTBoard shtBoard, @ModelAttribute PageVO pageVO) {
 logger
.info("write");
 logger
.info(shtBoard.toString());
 logger
.info("pageVO : " + pageVO.toString());
 
 shtBoardService
.write(shtBoard);
 
return "/boards/secondHandTrade/board/read";
}

** 기본 상황
서버쪽에서 JSP의 리퀘스트를 처리할 컨트롤러와 데이터를 바인딩받을 객체는 위와 같습니다.
JSP에서 서버로 보내는 데이터를 subjectCode, title, content, pageNo 이렇게 4가지입니다. 그리고
2개의 객체에느 subjectCode를 공통으로 가지고 있습니다. 

** 질문1
JSP에서 서버로 위 서버의 컨트롤러를 호출하면 HTTP STATUS 400이 나옵니다. 아무래도 두 객체의 중복된 변수인 subjectCode 때문인것 같습니다. PageVO를 지우고 테스트해보면 정상적으로 동작합니다.
이 때 각 객체에 중복된 데이터를 각각 바인딩 받으려면 방법이 있을까요?

** 질문 2
컨트롤러에서 각 객체는 @ModelAttribute로 설정되어 있습니다. 토비에서 보면 @ModelAttribute으로 설정된 객체는 자동으로 Model에
추가된다고 나와있습니다. 그런데 저 상태로 로직을 처리하고 다른 페이지로 리턴해서 @ModelAttribute로 설정된 객체의 데이터를
확인해보면 나오지 않습니다.
따로 Model을 선언하고 여기에 다시 담아줘야 정상적으로 나오는데 제가 놓친 부분이 있을까요?

이용구

unread,
Aug 19, 2014, 11:11:10 PM8/19/14
to ks...@googlegroups.com
질문 1:
ModelAttribute 는 제가 알고있기로는 한개만 바인딩 가능합니다. (아닐 수도 있습니다...)

그리고 코드의 가독성과 명료성을 위해 하나로 통일하는게 나을 것 같습니다.

하나의 오브젝트로 바인딩 한 후에 로직상 각각의 오브젝트로 분리하는 로직을 구현하는게 나을 것 같습니다.


질문 2:
@ModelAttribute 라고 자동으로 리턴되는 Model Interface 에 값으로 바인딩 되는 것은 아닙니다.

토비님의 책에서 말하는 자동으로 Model에 추가된다는 부분은 잘못 해석하신게 아닌가 싶습니다.


--
이 메일은 Google 그룹스 'Korea Spring User Group Q&A' 그룹에 가입한 분들에게 전송되는 메시지입니다.
이 그룹에서 탈퇴하고 더 이상 이메일을 받지 않으려면 ksug+uns...@googlegroups.com에 이메일을 보내세요.
http://groups.google.com/group/ksug에서 이 그룹을 방문하세요.
웹에서 이 토론을 보려면 https://groups.google.com/d/msgid/ksug/c61be042-717b-4e97-82ef-d15f7a63fcfc%40googlegroups.com을(를) 방문하세요.
더 많은 옵션을 보려면 https://groups.google.com/d/optout을(를) 방문하세요.



--
- Koo Lee

천용관

unread,
Aug 20, 2014, 12:15:23 PM8/20/14
to ks...@googlegroups.com
이번에 저도 비슷하게 사용할 일이 있어 미흡하지만 답변 달아 봅니다.

위와 같이 2개의 VO를 @ModelAttribute로 받기 위해서는 VO를 하나로 만들어서 사용하시는게 편합니다.

SHTBoard
private int    subjectCode;
private String title;
private String content;


PageVO
private int    subjectCode; 
private int    pageNo;

두개의 VO를 SHTBoardPageVO.java로... 아래 처럼 만드신 후

SHTBoardPageVO
private SHTBoard shtBoard;
private PageVO pageVO;


jsp페이지에서는 <form:form>을 사용하신다면
<form:form modelAttribute="shtBoardPageVO ">
    <form:input path="shtBoard.subjectCode "/>
    <form:input path="pageVO.subjectCode "/>
</form:form>
이렇게 사용하실 수 있습니다.

컨트롤러에서는 
public String write(@ModelAttribute SHTBoardPageVO shtBoardPageVO ) {
 logger.info("write");
 logger.info(shtBoardPageVO .toString());

SHTBoard shtBoard = shtBoardPageVO.getSHTBoardPageVO();
PageVO pageVO = shtBoardPageVO.getPageVO();

 shtBoardService.write(shtBoard);
 return "/boards/secondHandTrade/board/read";
}

이렇게 사용하시면 됩니다.

2014년 8월 17일 일요일 오후 6시 38분 33초 UTC+9, Hyungwon Jeon 님의 말:

Hyungwon Jeon

unread,
Aug 20, 2014, 7:28:35 PM8/20/14
to ks...@googlegroups.com
저렇게하면 깔끔하겠네요. 그런데 새로운 객체를 만들고 그안에 기존 객체를 넣어도 각 객체에 중복으로 선언되어있는 변수문제를 해결하긴 힘들것 같은데 이 문제는 아예 중복된 데이터지만 변수명을 틀리게 하거나, 두 객체 자체를 함쳐서 사용하는 방법밖에는 생각이 안나네요 ㅠ

014년 8월 21일 목요일 오전 1시 15분 23초 UTC+9, 천용관 님의 말:
Reply all
Reply to author
Forward
0 new messages