티스토리 뷰

Model

스프링에서 모델 객체는 컨트롤러에서 생성된 데이터를 담아 View로 전달할 때 사용하는 객체이다.

Model 객체를 model이라고 하면 model.addAttribute("key", "value") 형태의 메소드를 이용해 view에 데이터를 전달한다.

@GetMapping("/{itemId}")
    public String item(@PathVariable long itemId, Model model) {
        Item item = itemRepository.findById(itemId);
        model.addAttribute("item", item);
        return "form/item";
    }

 

@ModelAttribute

등록, 조회, 수정 폼에서 모두 공통된 데이터를 보여주어야 하는 경우에 어노테이션을 사용하지 않으면 해당 함수 내에서 같은 코드를 반복적으로 작성해야한다. 즉 각각의 컨트롤러에서 model.addAttribute(...)을 사용해서 구성하는 데이터를 반복해서 넣어주어야 한다.


@ModelAttribute 는 이렇게 컨트롤러에 있는 별도의 메서드에 적용할 수 있다.

ModelAttribute는 전달받은 파라미터를 Model 객체에 담아서 전달하도록 할 때 필요한 어노테이션이다. 해당 컨트롤러를 요청하게 되면 자동으로 Model 객체에 데이터가 담겨진다. 이렇게하면 해당 컨트롤러를 요청할 때 regions 에서 반환한 값이 자동으로 모델( model )에 담기게 된다. 물론 이렇게 사용하지 않고, 각각의 컨트롤러 메서드에서 모델에 직접 데이터를 담아서 처리해도 된다.

 

// 컨트롤러가 호출되면 자동으로 Model 객체에 담긴다
    @ModelAttribute("regions")
    public Map<String, String> regions(){
        Map<String, String> regions = new LinkedHashMap<>();
        regions.put("SEOUL", "서울");
        regions.put("BUSAN", "부산");
        regions.put("JEJU", "제주");
        return regions;
    }

 

View를 보여주는 코드, 어노테이션 ( ) 내부에 있는 값을 통해서 데이터들을 호출할 수 있다

<div>
    <div>등록 지역</div>
    <div th:each="region : ${regions}" class="form-check form-check-inline">
        <input type="checkbox" th:field="*{regions}" th:value="${region.key}"
               class="form-check-input">
        <label th:for="${#ids.prev('regions')}"
               th:text="${region.value}" class="form-check-label">서울</label>
    </div>
</div>
댓글