LinkedHashMap
을 사용했다.@ModelAttribute
@ModelAttribute
의 매개변수가 Web 계층에서 사용할 변수명이다.⚠️ 성능 최적화를 위해선 이 Method 를 static 영역에 생성후 필요할 때만 호출하는 방법이 더 효과적이다.
@Slf4j
@Controller
@RequestMapping("/form/items")
@RequiredArgsConstructor
public class FormItemController {
private final ItemRepository itemRepository;
@ModelAttribute("regions")
public Map<String, String> regions() {
Map<String, String> region = new LinkedHashMap<>();
region.put("SEOUL", "서울");
region.put("BUSAN", "부산");
region.put("JEJU", "제주");
return region;
}
filed
속성은 Entity 와 연결해야 되기 때문에 Entity 의 필드값이다.value
속성은 param 으로 보내야 되기 때문에 map 의 key 값이다.th:text
속성에서 설정해준 map 의 value 가 체크박스의 이름으로 랜더링 된다.${#ids.prev('...')}
th:field
는 each 문 내에 설정될 경우 index 마다 동적으로 id, name 을 바꿔주는데,for
속성과 매핑되기위해 field
의 동적 id
값을 구해주는 기능이다.<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-inline"></label>
</div>
th:field
id
가 겹치지 않게 동적으로 생성되었다.name
은 중복되어도 상관없다.th:for="${#ids.prev('...')}"
id
값을 for
와 잘 매핑시켰다.th:text
<div class="form-check form-check-inline">
<input type="checkbox"
value="SEOUL"
class="form-check-input"
id="regions1"
name="regions">
<input type="hidden"
name="_regions"
value="on"/>
<label for="regions1"
class="form-check-inline">서울</label>
</div>
<div class="form-check form-check-inline">
<input type="checkbox" value="BUSAN" class="form-check-input" id="regions2" name="regions"><input type="hidden" name="_regions" value="on"/>
<label for="regions2"
class="form-check-inline">부산</label>
</div>
<div class="form-check form-check-inline">
<input type="checkbox" value="JEJU" class="form-check-input" id="regions3" name="regions"><input type="hidden" name="_regions" value="on"/>
<label for="regions3"
class="form-check-inline">제주</label>
</div>
INFO 45865 --- [nio-8080-exec-1] h.i.web.form.FormItemController
: item.regions = [SEOUL, BUSAN, JEJU]
INFO 45865 --- [nio-8080-exec-1] h.i.web.form.FormItemController
: item.regions = []
<!-- edite -->
<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-inline"></label>
</div>
<!-- itme -->
<div th:each="region : ${regions}" class="form-check form-check-inline">
<input type="checkbox" th:field="${item.regions}" th:value="${region.key}" class="form-check-input" disabled>
<label th:for="${#ids.prev('regions')}"
th:text="${region.value}"
class="form-check-inline"></label>
</div>