ModelAttribute

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

        Map<String, String> regions = new LinkedHashMap<>(); //순서 보장
        regions.put("SEOUL", "서울");
        regions.put("BUSAN", "부산");
        regions.put("JEJU",  "제주");
        model.addAttribute("regions", regions);

        return "form/item";
    }
@GetMapping("/add")
    public String addForm(Model model)
    {
        model.addAttribute("item", new Item());
        Map<String, String> regions = new LinkedHashMap<>(); //순서 보장
        regions.put("SEOUL", "서울");
        regions.put("BUSAN", "부산");
        regions.put("JEJU",  "제주");
        model.addAttribute("regions", regions);

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

        Map<String, String> regions = new LinkedHashMap<>(); //순서 보장
        regions.put("SEOUL", "서울");
        regions.put("BUSAN", "부산");
        regions.put("JEJU",  "제주");
        model.addAttribute("regions", regions);

        return "form/editForm";
    }

위 3개의 코드를 보면 중복되는 부분이 있다.

Map<String, String> regions = new LinkedHashMap<>(); //순서 보장
        regions.put("SEOUL", "서울");
        regions.put("BUSAN", "부산");
        regions.put("JEJU",  "제주");
        model.addAttribute("regions", regions);

이 부분을 어떻게 줄일 수 있을까?

@ModelAttribute("regions")
    public Map<String, String> regions(){
        Map<String, String> regions = new LinkedHashMap<>(); //순서 보장
        regions.put("SEOUL", "서울");
        regions.put("BUSAN", "부산");
        regions.put("JEJU",  "제주");
        return regions;
    }
@ModelAttribute("regions")

이렇게하면 해당 컨트롤러를 요청할 때 region 에서 변환한 값이 자동으로 model에 담기게 된다.


multi checkbox

addForm.html

<!-- multi checkbox -->
 <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>