-
[김영한 스프링] 11. 타임리프 스프링 통합과 폼 - 입력 폼 처리 & 요구사항 추가Spring/스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 2023. 8. 21. 22:33
입력 폼 처리
타임리프가 제공하는 입력 폼 기능을 적용해서 기존 프로젝트의 폼 코드를 타임리프가 지원하는 기능을 사용해서 효율적으로 개선해 보자.
- th:object : 커맨드 객체를 지정한다.
- *{...} : 선택 변수 식이라고 한다. th:object에서 선택한 객체에 접근한다.
- th:field
- HTML 태그의 id, name, value 속성을 자동으로 처리해 준다.
렌더링 전
<input type="text" th:field="*{itemName}" />
렌더링 후
<input type="text" id="itemName" name="itemName" th:value="*{itemName}" />
등록 폼
th:object를 적용하려면 먼저 해당 오브젝트 정보를 넘겨주어야 한다. 등록 폼이기 때문에 데이터가 비어있는 빈 오브젝트를 만들어서 뷰에 전달하자.
FormItemController 변경
@GetMapping("/add") public String addForm(Model model) { model.addAttribute("item", new Item()); return "form/addForm"; }
addForm.html
<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>
- th:object="${item}" : <form>에서 사용할 객체를 지정한다. 선택 변수 식(*{...})을 적용할 수 있다.
- th:field="*{itemName}"
- *{itemName}는 선택 변수 식을 사용했는데, ${item.itemName}과 같다. 앞서 th:object로 item을 선택했기 때문에 선택 변수 식을 적용할 수 있다.
- th:field는 id, name, value 속성을 모두 자동으로 만들어준다.
- id : th:field에서 지정한 변수 이름과 같다. id="itemName"
- name : th:field에서 지정한 변수 이름과 같다. name="itemName"
- value : th:field에서 지정한 변수의 값을 사용한다. value=""
참고로 해당 예제에서 id 속성을 제거해도 th:field가 자동으로 만들어준다.
실행
수정 폼
FormItemController 유지
@GetMapping("/{itemId}/edit") public String editForm(@PathVariable Long itemId, Model model) { Item item = itemRepository.findById(itemId); model.addAttribute("item", item); return "form/editForm"; }
editForm.html 변경
<form action="item.html" th:action th:object="${item}" method="post"> <div> <label for="id">상품 ID</label> <input type="text" id="id" name="id" class="form-control" value="1" th:value="${item.id}" th:field="*{id}" readonly> </div> <div> <label for="itemName">상품명</label> <input type="text" id="itemName" class="form-control" th:field="*{itemName}"> </div> <div> <label for="price">가격</label> <input type="text" id="price" class="form-control" th:field="*{price}"> </div> <div> <label for="quantity">수량</label> <input type="text" id="quantity" class="form-control" th:field="*{quantity}"> </div>
수정 폼은 앞서 설명한 내용과 같다. 수정 폼의 경우 id , name , value를 모두 신경 써야 했는데, 많은 부분이 th:field 덕분에 자동으로 처리되는 것을 확인할 수 있다.
실행
요구사항 추가
타임리프를 사용해서 폼에서 체크박스, 라디오 버튼, 셀렉트 박스를 편리하게 사용하는 방법을 학습해보자.
기존 상품 서비스에 다음 요구사항이 추가되었다.
- 판매 여부
- 판매 오픈 여부
- 체크 박스로 선택할 수 있다.
- 등록 지역
- 서울, 부산, 제주
- 체크 박스로 다중 선택할 수 있다.
- 상품 종류
- 도서, 식품, 기타
- 라디오 버튼으로 하나만 선택할 수 있다.
- 배송 방식
- 빠른 배송
- 일반 배송
- 느린 배송
- 셀렉트 박스로 하나만 선택할 수 있다.
예시 이미지
ItemType - 상품 종류
package hello.itemservice.domain.item; public enum ItemType { BOOK("도서"), FOOD("음식"), ETC("기타"); private final String description; ItemType(String description) { this.description = description; } }
main/java/hello/itemservice/domain/item/ItemType 생성
상품 종류는 ENUM을 사용한다. 설명을 위해 description 필드를 추가했다.
배송 방식 - DeliveryCode
package hello.itemservice.domain.item; import lombok.AllArgsConstructor; import lombok.Data; /** * FAST : 빠른 배송 * NORMAL : 일반 배송 * SLOW : 느린 배송 */ @Data @AllArgsConstructor public class DeliveryCode { private String code; private String displayName; }
main/java/hello/itemservice/domain/item/DeliveryCode 생성
배송 방식은 DeliveryCode라는 클래스를 사용한다. code는 FAST 같은 시스템에서 전달하는 값이고, displayName은 빠른 배송 같은 고객에게 보여주는 값이다.
Item - 상품
private Boolean open; // 판매 여부 private List<String> regions; // 등록 지역 private ItemType itemType; // 상품 종류 private String deliveryCode; // 배송 방식
ENUM, 클래스, String 같은 다양한 상황을 준비했다. 각각의 상황에 어떻게 폼의 데이터를 받을 수 있는지 하나씩 알아보자.
정리
th:object, th:field 덕분에 폼을 개발할 때 약간의 편리함을 얻었다.
쉽고 단순해서 크게 어려움이 없었을 것이다.
사실 이것의 진짜 위력은 뒤에 설명할 검증(Validation)에서 나타난다. 이후 검증 부분에서 폼 처리와 관련된 부분을 더 깊이 있게 알아보자.
출처 : https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2
'Spring > 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술' 카테고리의 다른 글
[김영한 스프링] 13. 타임리프 스프링 통합과 폼 - 멀티 체크 박스 (0) 2023.08.23 [김영한 스프링] 12. 타임리프 스프링 통합과 폼 - 단일 체크 박스 (0) 2023.08.22 [김영한 스프링] 10. 타임리프 스프링 통합과 폼 - 프로젝트 설정 & 타임리프 스프링 통합 (0) 2023.08.21 [김영한 스프링] 09. 타임리프 기본 기능 - 템플릿 조각 & 템플릿 레이아웃 (0) 2023.08.12 [김영한 스프링] 08. 타임리프 기본 기능 - 자바스크립트 인라인 (0) 2023.08.11