@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이후에서만 된다.
댓글 없음:
댓글 쓰기