본문 바로가기
스프링/스프링 웹 개발 활용

[Spring] 스프링 타임리프 통합 - 단일 체크박스 처리 hidden 자동 생성

by drCode 2023. 6. 26.
728x90
반응형

https://drcode-devblog.tistory.com/528

 

[Spring] 스프링 타임리프 통합 - 단일 체크박스 처리

단순 HTML 체크 박스 resources/templates/form/addForm.html 추가 판매 여부 판매 오픈 상품이 등록되는 곳에 다음과 같이 로그를 남겨서 값이 잘 넘어오는지 확인해보자. FormItemController 추가 @PostMapping("/add")

drcode-devblog.tistory.com

 

 

지난 포스팅에서는 input hidden 을 만들어서 체크박스 값을 전달했다.

 

개발할 때 마다 이렇게 히든 필드를 추가하는 것은 상당히 번거롭다.

 

타임리프가 제공하는 폼 기능을 사용하면 이런 부분을 자동으로 처리할 수 있다.

 

체크 박스의 기존 코드를 제거하고 타임리프가 제공하는 체크 박스 코드로 변경하자

 

타임리프 - 체크 박스 코드 추가

resources\templates\form\addForm.html

<hr class="my-4">

<!-- single checkbox -->
<div>판매 여부</div>
<div>
    <div class="form-check">
        <input type="checkbox" id="open" name="open" th:field="*{open}" class="form-check-input">
        <!--<input type="hidden" name="_open" value="on"/>  -->
        <label for="open" class="form-check-label">판매 오픈</label>
    </div>
</div>

 

타임리프 체크 박스 HTML 생성 결과

view-source:http://localhost:8080/form/items/add
타임리프 체크 박스 HTML 생성 결과

 

<input type="hidden" name="_open" value="on"/>

타임리프를 사용하면 체크 박스의 히든 필드와 관련된 부분도 함께 해결해준다.

HTML 생성 결과를 보면 히든 필드 부분이 자동으로 생성되어 있다.

 

실행 로그

실행 로그
실행 로그

상품 상세에 적용하자.

 

item.html

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

주의: item.html 에는 th:object 를 사용하지 않았기 때문에 th:field 부분에 ${item.open} 으로 적어주어야 한다.

disabled 를 사용해서 상품 상세에서는 체크 박스가 선택되지 않도록 했다.

 

HTML 생성 결과

타임리프의 체크 확인

checked="checked"

체크 박스에서 판매 여부를 선택해서 저장하면, 조회시에 checked 속성이 추가된 것을 확인할 수 있다.

이런 부분을 개발자가 직접 처리하려면 상당히 번거롭다.

타임리프의 th:field 를 사용하면, 값이 true 인 경우 체크를 자동으로 처리해준다

 

상품 수정에도 적용하자.

 

editForm.html

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

 

상품 수정도 th:object , th:field 를 모두 적용해야 한다.

 

실행해보면 체크 박스를 수정해도 반영되지 않는다. 실제 반영되도록 다음 코드를 수정하자.

 

ItemRepository - update() 코드를 다음과 같이 수정하자

public void update(Long itemId, Item updateParam) {
    Item findItem = findById(itemId);
    findItem.setItemName(updateParam.getItemName());
    findItem.setPrice(updateParam.getPrice());
    findItem.setQuantity(updateParam.getQuantity());
    findItem.setRegions(updateParam.getRegions());
    findItem.setItemType(updateParam.getItemType());
    findItem.setDeliveryCode(updateParam.getDeliveryCode());
}

 

open 이외에 나머지 필드도 업데이트 되도록 미리 넣어두자.

 

http://localhost:8080/form/items/2

 

http://localhost:8080/form/items/3?status=true

728x90
반응형

댓글