이번에는 MVC중에서 M 즉 모델에 적용할 수 있는 Convention을 살펴보겠습니다.

Spring의 컨트롤러에서 모델을 넘겨줄 때 ModelAndView 객체를 사용합니다. 보통은 다음과 같이 사용합니다.

    public ModelAndView list(HttpServletRequest request, HttpServletResponse response){
        return new ModelAndView("issue/list", "issueList", issueService.getAll());
    }

또는 뷰와 모델을 명확하게 구분하기 위해 다음과 같이 사용합니다.

    public ModelAndView list(HttpServletRequest request, HttpServletResponse response){
        return new ModelAndView("issue/list")
            .addObject("issueList", issueService.getAll());
    }

갑자기 기억나는 이야기지만 객체의 이름은 ModelAndView인데 View먼저 등록하니까 이름을 ViewAndModel로 해야하는 것 아니였나.. 라는 글이 생각납니다.

Anyway addObject 메소드가 오버로딩으로 또 다른 메소드 하나가 더 존재합니다. 그것을 사용하면 코드를 다음과 같이 변경 할 수 있습니다.

    public ModelAndView list(HttpServletRequest request, HttpServletResponse response){
        return new ModelAndView("issue/list")
            .addObject(issueService.getAll());
    }

모델의 이름이 생략됐습니다.

바로 이겁니다. 모델의 이름을 생략할 수 있습니다. 생략하고 보내면 View에서는 그럼 이 모델을 어떤 이름으로 찾게 될 것인가?

if(객체타입 == List || Set || 배열){
    객체의 camel-case 맨 뒤에 List를 붙인 이름을 가지게 됩니다.
} else {
    객체의 camel-case 이름을 가지게 됩니다.
}

샘플
x.y.Foo 타입의 객체는 foo 라는 이름을 가지게 됩니다.
x.y.z.FooBar 타입의 객체는 fooBar 라는 이름을 가지게 됩니다.
List<Foo> 타입의 객체는 fooList 라는 이름을 가지게 됩니다.
FooBar[] 타입의 객체는 fooBarList 라는 이름을 가지게 됩니다.

이 메소드를 사용할 때 한 가지 주의할 것이 있습니다.

Note: Empty Collections are not added to the model when using this method because we cannot correctly determine the true convention name. View code should check for null rather than for empty collections as is already done by JSTL tags.

비어있는 콜렉션을 추가할 수 없다는 군요.