콘텐츠로 건너뛰기

ModelAndView의 addObject() 분석

최근에는 API서버만 개발하다보니 RestContoller만 다루다가, 간만에 ModelAndView를 다룰 일이 생겼다. 오랜만에 ModelAndView를 사용하니 Object를 어떻게 추가해야하는지 기억이 가물가물해서 찾아본 김에 기록을 남긴다.

ModelAndView를 다룰 때는 단순히 return new ModelAndView("/foo");와 같이 쓰는 경우는 드물고, 대부분 아래처럼 object parameter를 mapping해서 사용하게 된다.

위의 addObject 세가지 케이스가 어떻게 다른지 확인을 해봤다.

우선, addObject를 할 때 들어가는 곳은 ModelAndView.model 이다. 이 모델은 ModelMap 이라는 객체타입인데, 결국 아래와 같이 LinkedHashMap 으로 만들어져있다.

그래서 addAllAttributes(Map) 라는 간단한 메소드를 제공할 수 있다. 입력되는 object의 type이 Map이라면 위에 정의된 ModelMap에 값을 모두 복사하면 되기 때문이다.

그리고 아래처럼 key, value의 형태로 object mapping하는 게 가장 흔한 방법이다. Map이 아닌 일반적인 Object의 경우에는 key, value형태로 mapping하기 때문에 Map에는 key와 value형태로 들어가게 된다.

마지막으로 아래처럼 그냥 object만으로 mapping하는 케이스가 있다. 여러 가지 복잡한(?) 구현이 되어 있지만, 결국 하는 일은 object의 class shortName을 key로 넣고, object를 value로 넣어서 mapping하고 있다.

소스를 보다가 추가로 알게 된 사실이 있다. Array나 Collection 타입의 경우에는 class shortName에 추가로 List가 붙어서 attributes가 된다. 해당 로직이 오래 되었나보다. 요즘엔 List보다는 plural type으로 그냥 s를 붙이는 경우가 많기 때문이다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다