-
Spring MVC - 타임리프(Thymeleaf)를 이용한 입력 폼(Form) 사용법Spring/Spring MVC 2022. 2. 4. 12:13728x90반응형
타임리프(Thymeleaf)를 이용한 입력 폼(Form) 사용법
- th:object
- 커멘드 객체를 지정하여 Form에서 사용 - *{ ... }
- 선택 변수식이라고 한다. th:object 에서 선택한 객체를 편리하게 프로퍼티 접근법을 이용할 수 있다. - th:field
- HTML 태그의 id, name, value 속성을 자동으로 처리해 준다.
등록 form 사용 예시
<form action="item.html" th:action th:object="${item}" method="post">
- th:action
- 값을 안 넣어주면 같은 URL에 POST 메서드 방식으로 요청한다. - th:object="${item}"
- request 영역에 저장되어있는 item 객체를 가져온다
- 해당 폼에서 item 객체 사용 가능
<input type="text" id="itemName" th:field="*{itemName}" class="formcontrol" placeholder="이름을 입력하세요">
- th:field="*{itemName}"
- 선택 변수 식이라고 한다. th:object에서 선택한 객체 프로퍼티에 접근할 수 있다.
- ${item.itemName} = *{itemName}
- 자동으로 id="itemName", name="itemName", value="" 추가 해준다.
전체 코드
<form action="item.html" th:action th:object="${item}" method="post"> <div> <label for="itemName">상품명</label> <input type="text" id="itemName" th:field="*{itemName}" class="form-control" placeholder="이름을 입력하세요"> </div> <div> <label for="price">가격</label> <input type="text" id="price" th:field="*{price}" class="form-control" placeholder="가격을 입력하세요"> </div> <div> <label for="quantity">수량</label> <input type="text" id="quantity" th:field="*{quantity}" class="form-control" placeholder="수량을 입력하세요"> </div> <hr class="my-4"> <div class="row"> <div class="col"> <button class="w-100 btn btn-primary btn-lg" type="submit">상품 등록</button> </div> <div class="col"> <button class="w-100 btn btn-secondary btn-lg" onclick="location.href='items.html'" th:onclick="|location.href='@{/form/items}'|" type="button">취소</button> </div> </div> </form>
랜더링된 HTML의 소스 코드를 보면 다음과 같다.
<form action="" method="post"> <div> <label for="itemName">상품명</label> <input type="text" id="itemName" class="form-control" placeholder="이름을 입력하세요" name="itemName" value=""> </div> <div> <label for="price">가격</label> <input type="text" id="price" class="form-control" placeholder="가격을 입력하세요" name="price" value=""> </div> <div> <label for="quantity">수량</label> <input type="text" id="quantity" class="form-control" placeholder="수량을 입력하세요" name="quantity" value=""> </div> <hr class="my-4"> <div class="row"> <div class="col"> <button class="w-100 btn btn-primary btn-lg" type="submit">상품 등록</button> </div> <div class="col"> <button class="w-100 btn btn-secondary btn-lg" onclick="location.href='/form/items'" type="button">취소</button> </div> </div> </form>
th:object를 사용하는 이유
그런데 생각해보면 name="itemName" 이런 식으로 데이터를 전달해주면 될 것 같은데 굳이 Item 객체를 form에서 th:object로 지정하여 사용하는 이유가 뭘까?
다음과 같은 이유가 존재한다.
- name으로 넘긴 데이터명이 저장할 객체의 필드명과 일치하지 않아 바인딩이 안되어도 실행된다.
- 바인딩이 안되었다는 건 데이터가 제대로 전달하지 못했다는 의미이다. 근데 그대로 실행이 되기
때문에 나중에 이 문제를 찾기가 어려워진다. - 검증에 사용된다. 검증에 통과하지 못하면 입력했던 값들을 화면에 다시 출력하기 위해 사용된다.
728x90반응형'Spring > Spring MVC' 카테고리의 다른 글
Spring MVC - 타임리프(Thymeleaf)을 사용한 multi checkbox(멀티 체크박스) (0) 2022.02.04 Spring MVC - 타임리프(Thymeleaf)을 사용한 단일 checkbox (0) 2022.02.04 Spring MVC - 타임리프(Thymeleaf) 템플릿 조각과 레이아웃 (th:fragment, th:insert, th:replace) (0) 2022.02.03 Spring MVC - 타임리프(Thymeleaf) 블록과 자바스크립트 인라인 (0) 2022.02.03 Spring MVC - 타임리프(Thymeleaf) 반복 기능(th:each), 조건부 기능(th:if, th:unless, th:switch) (0) 2022.02.03 - th:object