728x90
체크 박스 추가(addForm.html)
<!-- single checkbox -->
<div>판매 여부</div>
<div>
<div class="form-check">
<input type="checkbox" id="open" name="open" class="form-check-input">
<label for="open" class="form-check-label">판매 오픈</label>
</div>
</div>
- 값이 잘 전송되는지 Log를 찍어보자

- 체크가 되어 있을 경우 True가 전달된다.
- 체크가 되어 있지 않을 경우?
- false를 기대하지만, null 값이 전달이 된다.

- HTML checkbox는 선택이 안되면 클라이언트에서 서버로 값 자체를 보내지 않는다.
- 수정의 경우에는 상황에 따라서 이 방식이 문제가 될 수 있다.
- 사용자가 의도적으로 체크되어 있던 값을 체크를 해제해도 저장 시 아무 값도 넘어가지 않기 때문에, 서버 구현에 따라서 값이 오지 않은 것으로 판단해서 값을 변경하지 않을 수도 있다
- Spring은 이러한 문제를 해결하기 위해 약간의 트릭을 제공(_체크박스 명)
- 히든 필드를 하나 만들어서, _open 처럼 기존 체크 박스 이름 앞에 언더스코어( _ )를 붙여서 전송하면 체크를 해제했다고 인식할 수 있다(히든 필드는 항상 전송된다)
- 따라서 체크를 해제한 경우 여기에서 open 은 전송되지 않고, _open 만 전송되는데, 이 경우 스프링 MVC는 체크를 해제했다고 판단한다.
<!-- single checkbox -->
<div>판매 여부</div>
<div>
<div class="form-check">
<input type="checkbox" id="open" name="open" class="form-check-input">
<input type="hidden" name="_open" value="on" />
<label for="open" class="form-check-label">판매 오픈</label>
</div>
</div>
- 체크박스 체크시 open & _open 이 on 값이 전송되므로 _open 은 무시
- 체크박스 미체크시 _open 만 on 값이 전송되므로 SpringMVC가 체크되지 않았다고 판단하여 false로 바꿔준다.
- 매번 이렇게 hidden field를 넣기 불편하기 때문에 ThymeLeaf가 제공하는 기능을 사용해 보자
ThymeLeaf
- AddForm.html
<div>판매 여부</div>
<div>
<div class="form-check">
<input type="checkbox" id="open" th:field="*{open}" class="form-check-input">
<label for="open" class="form-check-label">판매 오픈</label>
</div>
</div>

- ItemForm.html
<div>판매 여부</div>
<div>
<div class="form-check">
<input type="checkbox" id="open" th:field="${item.open}" class="form-check-input" disabled>
<label for="open" class="form-check-label">판매 오픈</label>
</div>
</div>

- EditForm.html
<div>판매 여부</div>
<div>
<div class="form-check">
<input type="checkbox" id="open" th:field="*{open}" class="form-check-input">
<label for="open" class="form-check-label">판매 오픈</label>
</div>
</div>
- 타임리프를 사용하면 체크 박스의 히든 필드와 관련된 부분도 함께 해결해준다.
- HTML 생성 결과를 보면 히든 필드 부분이 자동으로 생성되어 있다.
- 체크 박스에서 판매 여부를 선택해서 저장하면, 조회 시에 checked 속성이 추가된 것을 확인할 수 있다.
- 이런 부분을 개발자가 직접 처리하려면 상당히 번거롭다. 타임리프의 th:field를 사용하면, 값이 true 인 경우 체크를 자동으로 처리해준다
728x90
'스프링 MVC 2편(백엔드 웹 개발 활용 기술)' 카테고리의 다른 글
| Ch02. 타임리프(스프링 통합과 폼) - 라디오 버튼 (0) | 2022.03.11 |
|---|---|
| Ch02. 타임리프(스프링 통합과 폼) - 체크 박스(멀티) (0) | 2022.03.11 |
| Ch02. 타임리프(스프링 통합과 폼) - 요구사항 추가 (0) | 2022.03.11 |
| Ch02. 타임리프(스프링 통합과 폼) - 입력 폼 처리 (0) | 2022.03.11 |
| Ch02. 타임리프(스프링 통합과 폼) - 타임리프 스프링 통합 (0) | 2022.03.11 |