2012-08-10

스프링 @MVC 수정 폼 처리하기

Spring MVC 3.0: How do I bind to a persistent object

@ModelAttribute의 쓰임새는 무엇인고?

How does @ModelAttribute work?

@RequestMapping(value="/user/{id}", method=RequestMethod.PUT)
public String submit(@ModelAttribute User user) {
   ...
}

@ModelAttribute("user")
User loadUser(@RequestParam(defaultValue="-1") long id) {
    if (id == -1)
        return new User();
    log.info("Loading user info from db: " + id);
    return userService.findById(id);
}

이 코드가 의도하는 것은 @ModelAttribute 가 바인딩 되기 전에 db로 부터 User 객체를 로드하는 것이다. 이렇게 db에서 user를 로드한 다음 바인딩하면, User 필드에는 있지만 폼에는 필드가 없어서 기존 db 필드를 null로 지워버리는 불상사를 막을 수 있다.

문제는 위 코드의 경우 loadUser()가 이 컨트롤러의 다른 메소드에도 실행된다는 것이다. 이건 좀 깔끔하지 못하다. 좋은 방법을 모르겠다. 위 코드만 따로 뽑아서 새로운 컨트롤러를 만들 수도 있겠다. 이렇게 하면 엔티티마다 XxxModifyController 를 만들어야 한다. 이것도 그리 썩 좋지는 않지만 다른 방법이 없네.

ConversionService로도 안될 것 같고. @SessionAttributes를 사용하면 한 세션에 여러 엔티티에 대한 폼을 열 경우 문제가 된다.


update(2012.9.6): 위 해결책도 나름 방법이긴 하지만 ConversionService를 이용하면 된다. 그러나 스프링 3.1이후에서만 된다.

댓글 없음:

댓글 쓰기