본문 바로가기
Framework & Library/Spring Boot

[Spring Boot] : 타임리프 체크 박스 여러개 만들고 체크하기

by 오주현 2022. 2. 8.
반응형

체크 박스를 여러개 만들고 복수 체크가 가능하도록 만들 수 있다.

 

그 전에 @ModelAttribute 어노테이션도 사용해 봤는데 이 어노테이션은 여러 화면에서 체크 리스트 내용을 중복으로 보여줘야 할 때 각각 Mapping부분에 중복해서 적어주지 않고 별도의 메서드를 만들어 사용할 수 있다. 그렇게 되면 컨트롤러를 요청할 때 @ModelAttribute에서 반환한 값이 자동으로 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;
}

먼저 순서 보장을 위해 해쉬맵을 안 쓰고 링크드해쉬맵을 사용했다. 이렇게 되면 model이 있는 컨트롤러에서 요청이 오면 model에 자동으로 regions가 담긴다.

 

원래는 하나하나 다 적어줘야 하지만 이렇게 중복을 줄일 수 있다.

 

<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>

핵심은 이거다.

 

먼저 each로 반복을 해준다. regions만큼 해준다. regions는 위에서 @ModelAttribute에서 만들고 각 컨트롤러 model에 담았다.

 

그리고 체크 박스를 만들어주고 regions의 key값을 벨류로 가져왔다.

 

마지막 라인에서 처음 보는 문법이 나왔는데 HTML에서 name의 값은 같아도 되는데 id값은 같으면 안 된다. 때문에 타임리프에서 ids.prev(...)문법을 통해 동적으로 생성되는 id값을 사용할 수 있게 한다. ids.prev()를 사용하면 id값 뒤에 넘버링이 된다. 여기서는 regions1, regions2 이런식으로 id값이 증가되면서 반복되는 것을 확인할 수 있다.

 

서울과 부산을 선택하면

regions=SEOUL&_regions=on&regions=BUSAN&_regions=on&_regions=on

위와 같이 오게 되고 로그를 찍어보면 item.regions=[SEOUL, BUSAN] 이렇게 나온다.

지역을 선택하지 않으면

_regions=on&_regions=on&_regions=on

이렇게 오게 되고 로그를 찍어보면 item.regions=[] 이렇게 나온다.

 

_regions는 앞에서 사용했던 것과 같다. 참고 사항으로는 _regions도 보내지 않게 되면 null이 된다는 것이다.


스프링 MVC 2편 - 백엔드 웹 개발 활용 기술을 참고하여 공부하였습니다.

반응형

댓글