Thymeleaf - ์คํ๋ง ํตํฉ ๊ธฐ๋ฅ
by rlaehddnd0422ํ์๋ฆฌํ๋ ์์ ๋ค๋ฃฌ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋ฅ ์ธ์ ์คํ๋ง๊ณผ ํตํฉํด์ ๋์ํ๋ ์ถ๊ฐ์ ์ธ ์คํ๋ง ํตํฉ ๋ฉ๋ด์ผ์ ์ ๊ณตํฉ๋๋ค.
์ถ๊ฐ ์คํ๋ง ํตํฉ ๊ธฐ๋ฅ
- ์คํ๋ง์ SpringEL ๋ฌธ๋ฒ ํตํฉ
- ex) {@myBean.doSomething()}์ฒ๋ผ ์คํ๋ง ๋น ํธ์ถ ์ง์
- ํธ๋ฆฌํ ํผ ๊ด๋ฆฌ๋ฅผ ์ํ ์ถ๊ฐ ์์ฑ
- th:object(๊ธฐ๋ฅ ๊ฐํ, ํผ ์ปค๋งจ๋ ๊ฐ์ฒด ์ ํ)
- th:field, th:errors, th:errorclass
- ํผ ์ปดํฌ๋ํธ ๊ธฐ๋ฅ
- checkbox, radio button, Select box(List) ๋ฑ์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋ ๊ธฐ๋ฅ ์ง์
- ์คํ๋ง์ ๋ฉ์์ง, ๊ตญ์ ํ ๊ธฐ๋ฅ์ ํธ๋ฆฌํ ํตํฉ
- ์คํ๋ง์ ๊ฒ์ฆ, ์ค๋ฅ์ฒ๋ฆฌ ํตํฉ
- ์คํ๋ง์ ๋ณํ ์๋น์ค ํตํฉ
์ง๊ธ๋ถํฐ ์ด ์ ์ ์ํ๊ด๋ฆฌ ํ๋ก์ ํธ๋ฅผ ์์ ํ๋ฉด์ ํ๋์ฉ ์์๋ณด๊ฒ ์ต๋๋ค.
์ ๋ ฅ ํผ ์ฒ๋ฆฌ
- th:object ๋ ์ปค๋งจ๋ ๊ฐ์ฒด๋ฅผ ์ง์ ํฉ๋๋ค.
- th:object๋ฅผ ์ ์ฉํ๋ ค๋ฉด ํด๋น ์ค๋ธ์ ํธ ์ ๋ณด๋ฅผ ์ปจํธ๋กค๋ฌ์์ ๋ชจ๋ธ์ ๋ด์์ ๋๊ฒจ์ฃผ์ด์ผ ํฉ๋๋ค.
- th:object๋ก ์ง์ ๋ ๊ฐ์ฒด์ ๋ํด์ *{...}๋ฅผ ์ฌ์ฉํด ๊ฐ์ฒด์ ๋ํ ๋ณ์์ ์ ๊ทผํ ์ ์์ต๋๋ค.
- th:field - HTML ํ๊ทธ์ id, name, value ์์ฑ์ ์๋์ผ๋ก ์ฒ๋ฆฌํด์ค๋๋ค.
- HTML์์ id๋ ๊ณ ์ ํ ์๋ณ์ ๋ชฉ์ ์ผ๋ก ํ๋ ๊ฒฝ์ฐ ์ฌ์ฉํ๋๋ฐ ํ์ด์ง์์ ํ๋์ ์์๋ง ์ง์ ๊ฐ๋ฅํฉ๋๋ค.
- name์ form ์ปจํธ๋กค ์์์ ๊ฐ(value)๋ฅผ ์๋ฒ๋ก ์ ์กํ๊ธฐ ์ํด ํ์ํ ์์ฑ์ ๋๋ค. ๊ฐ์ ์ ๋ฌํ๊ธฐ ์ํ ๋ชฉ์ ์ผ๋ก ๊ฐ์ง๊ณ ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง๊ณ ๋ค์ค ์ค์ ์ด ๊ฐ๋ฅํฉ๋๋ค.
- value๋ ํผ ์ปจํธ๋กค ์์์ ๊ฐ์ผ๋ก name=value๋ก ์ ์กํฉ๋๋ค.
https://okky.kr/questions/645583
https://velog.io/@dongeranguk/input-%ED%83%9C%EA%B7%B8-id%EC%99%80-name%EC%9D%98-%EC%B0%A8%EC%9D%B4
๋ฑ๋ก ํผ
ํตํฉ ์ปจํธ๋กค๋ฌ
@GetMapping("/add")
public String addForm(Model model) {
model.addAttribute("item",new Item());
return "form/addForm";
}
addForm์์ th:object๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ๋ชจ๋ธ์ ๋ด์์ฃผ์์ต๋๋ค.
addForm.html(์์ ์ )
<form action="item.html" th:action method="post">
<div>
<label for="itemName">์ํ๋ช
</label>
<input type="text" id="itemName" name="itemName" class="form-control" placeholder="์ด๋ฆ์ ์
๋ ฅํ์ธ์"> </div>
<div>
<label for="price">๊ฐ๊ฒฉ</label>
<input type="text" id="price" name="price" class="form-control" placeholder="๊ฐ๊ฒฉ์ ์
๋ ฅํ์ธ์">
</div>
<div>
<label for="quantity">์๋</label>
<input type="text" id="quantity" name="quantity" class="form-control" placeholder="์๋์ ์
๋ ฅํ์ธ์">
</div>
addForm.html (์์ ํ)
<form action="item.html" th:action th:object="${item}" method="post">
<div>
<label>์ํ๋ช
</label>
<input type="text" th:field="*{itemName}" class="form-control" placeholder="์ด๋ฆ์ ์
๋ ฅํ์ธ์">
</div>
<div>
<label>๊ฐ๊ฒฉ</label>
<input type="text" th:field="*{price}" class="form-control" placeholder="๊ฐ๊ฒฉ์ ์
๋ ฅํ์ธ์">
</div>
<div>
<label>์๋</label>
<input type="text" th:field = "*{quantity}" class="form-control" placeholder="์๋์ ์
๋ ฅํ์ธ์">
</div>
- th:object="${item}" : <form> ์์ ์ฌ์ฉํ ๊ฐ์ฒด๋ฅผ ์ง์ ํด์ฃผ์์ต๋๋ค. ์ด์ ์ ํ ๋ณ์ ์ *{...}์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- th:field="*{itemName}"
- ์ด์ <form>ํ๊ทธ ๋ด์์ object๋ฅผ item์ผ๋ก ์ง์ ํ ๋๋ถ์ item๊ฐ์ฒด์ ๋ํ ์ ํ๋ณ์ ์์ *{...}์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- th:field๋ id, name, value ์์ฑ์ ๋ชจ๋ ์๋์ผ๋ก ๋ง๋ค์ด์ค๋๋ค.
- th:field="*{itemName}" โถ๏ธ id="itemName", name="itemName", value="" (value๋ th:field์์ ์ง์ ํ ๋ณ์์ ๊ฐ์ ์ฌ์ฉํฉ๋๋ค. ๋ฑ๋ก ํผ์ด๊ธฐ ๋๋ฌธ์ ์ง์ ๋์ง ์์ ์ํ )
th:object, th:field ๋๋ถ์ ํผ์ ๊ฐ๋ฐํ ๋ ์กฐ๊ธ ํธ๋ฆฌํด์ก์ต๋๋ค. ์ฌ์ค th:object, th:field์ ์ฅ์ ์ ๊ฒ์ฆ ๋จ๊ณ์์ ๋ํ๋ฉ๋๋ค.
ํผ ์ฒ๋ฆฌ์ ๊ด๋ จ๋ ๋ถ๋ถ์๊ฒ์ฆ ๋จ๊ณ์์ ๋ ๊น๊ฒ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์๊ตฌ์ฌํญ ์ถ๊ฐ for Checkbox, RadioButton, SelectBox
์ด์ ํ์๋ฆฌํ๋ฅผ ์ฌ์ฉํด ํผ์์ ์ฒดํฌ๋ฐ์ค, ๋ผ๋์ค๋ฒํผ, ์ ๋ ํธ ๋ฐ์ค๋ฅผ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์์๋ณด๊ธฐ ์ํด ์ํ ๊ด๋ฆฌ ํ๋ก์ ํธ์์ ์๊ตฌ์ฌํญ์ ๋ช ๊ฐ์ง ์ถ๊ฐ ํ๊ฒ ์ต๋๋ค.
1. ํ๋งค ์ฌ๋ถ - Check box
2. ๋ฑ๋ก ์ง์ญ - Check box(๋ค์ค ์ ํ)
3. ์ํ ์ข ๋ฅ - Radio button(๋ค์ค ์ผํ)
4. ๋ฐฐ์ก ๋ฐฉ์ - Select box(๋ค์ค ์ผํ)
์ฐ์ Item ํด๋์ค์ ์ถ๊ฐ ์์๋ฅผ ๋ฃ์ด์ฃผ์ด์ผ๊ฒ ์ฃ
@Data
public class Item {
private Long id;
private String itemName;
private Integer price;
private Integer quantity;
private Boolean open; // ํ๋งค์ฌ๋ถ
private List<String> regions; // ๋ฑ๋ก์ง์ญ
private ItemType itemType; // ์ํ ์ข
๋ฅ ( ๋์, ์ํ, ๊ธฐํ )
private String deliveryCode; // ๋ฐฐ์ก ๋ฐฉ์ ( ๋น ๋ฆ, ์ผ๋ฐ, ๋๋ฆผ )
์ํ ์ข ๋ฅ ItemType์ enum์ผ๋ก ํ์ ์ ์ง์ ํด์ฃผ์์ต๋๋ค.
public enum ItemType {
BOOK("๋์"), FOOD("์ํ"), ETC("๊ธฐํ");
private final String description;
ItemType(String description)
{
this.description = description;
}
public String getDescription() {
return description;
}
}
๋ฐฐ์ก ๋ฐฉ์ Delivery๋ผ๋ ํด๋์ค ์ฌ์ฉ
code - FAST๊ฐ์ ์์คํ ์ ์ ๋ฌํ๋ ๊ฐ
displayName - "๋น ๋ฅธ ๋ฐฐ์ก"๊ฐ์ด ํด๋ผ์ด์ธํธ์ ๋ณด์ฌ์ฃผ๋ ๊ฐ
/**
* FAST : ๋น ๋ฅธ๋ฐฐ์ก
* NORMAL : ์ผ๋ฐ ๋ฐฐ์ก
* SLOW : ๋๋ฆฐ ๋ฐฐ์ก
*/
@Data
@AllArgsConstructor
public class DeliveryCode {
private String code;
private String displayName;
}
ํ๋งค ์ฌ๋ถ - Check box
addForm์ <form>ํ๊ทธ ์๋์ ์ถ๊ฐ
<hr class="my-4">
<!-- single checkbox -->
<div>ํ๋งค ์ฌ๋ถ</div>
<div>
<div class="form-check">
<input type="checkbox" id="open" name="open" class="form-check-input">
<label class="form-check-label">ํ๋งค ์คํ</label>
</div>
</div>
์ปจํธ๋กค๋ฌ์ ๋ก๊ทธ๋ฅผ ๋จ๊ฒจ์ POST๋ก ์ ๋์ด์ค๋์ง ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
Controller - @Slf4j ์ถ๊ฐ
@PostMapping("/add")
public String addItem(@ModelAttribute Item item, RedirectAttributes redirectAttributes) {
log.info("item.open = {}",item.getOpen());
Item savedItem = itemRepository.save(item);
redirectAttributes.addAttribute("itemId", savedItem.getId());
redirectAttributes.addAttribute("status", true);
return "redirect:/form/items/{itemId}";
}
HTML checkbox๋ ์ ํ์ด ์๋๋ฉด ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก ๊ฐ ์์ฒด๋ฅผ ๋ณด๋ด์ง ์์ต๋๋ค.
์์ ์ ๊ฒฝ์ฐ์๋ ์ฌ์ฉ์๊ฐ ์๋์ ์ผ๋ก ์ฒดํฌ๋์ด ์๋ ๊ฐ์ ํด์ ํด๋ ์ ์ฅ ์ ์๋ฌด ๊ฐ๋ ๋์ด๊ฐ์ง ์๊ธฐ ๋๋ฌธ์, ์๋ฒ ๊ตฌํ์ ๋ฐ๋ผ์ ๊ฐ์ด ์ค์ง ์์ ๊ฒ์ผ๋ก ํ๋จํด์ ๊ฐ์ ๋ณ๊ฒฝํ์ง ์์ ์๋ ์๋ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์์ต๋๋ค.
Solution 1
ํ๋ ํ๋๋ผ๋ ๊ฒ์ ํ๋ ๋ง๋ค์ด _open ์ฒ๋ผ ๊ธฐ์กด ์ฒดํฌ ๋ฐ์ค ์ด๋ฆ ์์ ์ธ๋์ค์ฝ์ด๋ฅผ ๋ถ์ฌ์ ์ ์กํ๋ฉด ์ฒดํฌ๋ฅผ ํด์ ํ๋ค๊ณ ์ธ์ํ ์ ์์ต๋๋ค.
<hr class="my-4">
<!-- 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 class="form-check-label">ํ๋งค ์คํ</label>
</div>
</div>
ํ๋ ํ๋๋ ํญ์ ์ ์กํ๊ธฐ ๋๋ฌธ์ checkbox๊ฐ check ๋์ง ์์ผ๋ฉด ํ๋ ํ๋์์ _open์ด on์ผ๋ก ์ค์ ๋์ด ์๋ฒ์์๋
- check ํ์ ๊ฒฝ์ฐ : open=on&_open=on์ด ์๋ฒ๋ก ์ ์ก
- check ์ํ์ ๊ฒฝ์ฐ : _open=on๋ง ์๋ฒ๋ก ์ ์ก
์ฒดํฌ ์ฌ๋ถ๋ฅผ ์๋ฒ์์ ๋ ๊ฐ์ด ๋์ด์๋์ง ํ๋๋ง ๋์ด์๋์ง์ ์ฌ๋ถ๋ก ํ๋จํ ์ ์์ต๋๋ค.
ํ์ง๋ง ์ด๋ฐ ํ๋๋ฅผ ํญ์ ์ถ๊ฐํ๋ ๊ฒ์ ์ข ๋ฒ๊ฑฐ๋ก์ด ์ผ์ ๋๋ค.
ํ์๋ฆฌํ๊ฐ ์ ๊ณตํ๋ ํผ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ์ด๋ฐ ๋ถ๋ถ์ ์๋์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
Solution 2
์ฒดํฌ ๋ฐ์ค์ ๊ธฐ์กด ์ฝ๋๋ฅผ ์ ๊ฑฐํ๊ณ ํ์๋ฆฌํ๊ฐ ์ ๊ณตํ๋ ์ฒดํฌ ๋ฐ์ค ์ฝ๋๋ก ๋ณ๊ฒฝํ๋ฉด ํ๋ ํ๋์ ๊ด๋ จ๋ ๋ถ๋ถ๋ ํจ๊ป ํด๊ฒฐํด ์ค๋๋ค.
<hr class="my-4">
<!-- single checkbox -->
<div>ํ๋งค ์ฌ๋ถ</div>
<div>
<div class="form-check">
<input type="checkbox" id="open" th:field = "*{open}" class="form-check-input">
<label class="form-check-label">ํ๋งค ์คํ</label>
</div>
</div>
์ด์ ์ํ ์์ธ ํผ๊ณผ ์์ ํผ์๋ ์ ์ฉํด๋ณด๊ฒ ์ต๋๋ค.
์์ ํผ ์์
@PostMapping("/{itemId}/edit")
public String edit(@PathVariable Long itemId, @ModelAttribute Item item) {
log.info("item.open = {}",item.getOpen());
itemRepository.update(itemId, item);
return "redirect:/form/items/{itemId}";
}
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.setOpen(updateParam.getOpen());
findItem.setItemType(updateParam.getItemType());
findItem.setDeliveryCode(updateParam.getDeliveryCode());
findItem.setRegions(updateParam.getRegions());
}
์์ ํผ์ ์ถ๊ฐ
<!-- single checkbox -->
<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>
์์ธ ํผ์ ์ถ๊ฐ
item์ ์ถ๊ฐ
<hr class="my-4">
<!-- single checkbox -->
<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>
์ฃผ์ / item์์๋ th:object๋ฅผ ์ฌ์ฉํ์ง ์์๊ธฐ ๋๋ฌธ์ th:field ๋ถ๋ถ์ ${item.open}์ผ๋ก ์ ์ด์ฃผ์ด์ผ ํฉ๋๋ค.
์ถ๊ฐ์ ์ผ๋ก disabled ์ต์ ์ ์ฌ์ฉํด์ ์ํ ์์ธ์์๋ ์ฒดํฌ ๋ฐ์ค๊ฐ ์ ํ๋์ง ์๋๋ก ์ค์ .
ํ์๋ฆฌํ์ ์ฒดํฌ ํ์ธ
checked="checked"
์ฒดํฌ ๋ฐ์ค์์ ํ๋งค ์ฌ๋ถ๋ฅผ ์ ํํด์ ์ ์ฅํ๋ฉด, ์กฐํ์์ checked ์์ฑ์ด ์ถ๊ฐ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
- ์ด๋ฐ ๋ถ๋ถ์ ๊ฐ๋ฐ์๊ฐ ์ง์ ์ฒ๋ฆฌํ๋ ค๋ฉด ์๋นํ ๋ฒ๊ฑฐ๋กญ์ต๋๋ค. ํ์๋ฆฌํ์ th:field ๋ฅผ ์ฌ์ฉํ๋ฉด, ๊ฐ์ด true ์ธ ๊ฒฝ์ฐ ์ฒดํฌ๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํด์ค๋๋ค.
๋ฑ๋ก ์ง์ญ - Check Box ๋ค์ค ์ ํ
์ด๋ฒ์๋ ์ฒดํฌ๋ฐ์ค๋ฅผ ๋ฉํฐ๋ก ์ฌ์ฉํด์ ํ๋ ์ด์์ ์ฒดํฌํ ์ ์๋๋ก ํด๋ณด๊ฒ ์ต๋๋ค.
๋ฑ๋ก ์ง์ญ : ์์ธ , ์ ์ฃผ , ์๋์ผ๋ก ์ฒดํฌ ๋ฐ์ค๋ก ๋ค์ค ์ ํํ ์ ์์ต๋๋ค.
๋ฑ๋ก ํผ, ์์ ํผ, ์์ธ ํ๋ฉด์์ ๋ชจ๋ ์์ธ, ์ ์ฃผ, ์๋์ด๋ผ๋ ์ฒดํฌ๋ฐ์ค๋ฅผ ๋ฐ๋ณตํด์ ๋ณด์ฌ์ฃผ์ด์ผ ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ ค๋ฉด model.addAttribute()๋ฅผ ์ฌ์ฉํด์ ์ฒดํฌ๋ฐ์ค๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ณตํด์ ํ๋๋ฐ ์ข ๊ท์ฐฎ์ต๋๋ค.
@ModelAttribute๋ ์ปจํธ๋กค๋ฌ์ ์๋ ๋ณ๋์ ๋ฉ์๋์ ์ ์ฉํ ์ ์๋ ์ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
@ModelAttribute("regions")
public Map<String, String> regions()
{
Map<String, String> regions = new LinkedHashMap<>();
regions.put("SEOUL","์์ธ");
regions.put("JEONJU","์ ์ฃผ");
regions.put("ANDONG","์๋");
return regions;
}
์ด๋ ๊ฒ ์ปจํธ๋กค๋ฌ์ ์ค์ ํด์ฃผ๋ฉด Model์ ์๋์ผ๋ก "regions"๋ผ๋ ์ด๋ฆ์ผ๋ก ๋ด๊ธฐ๊ฒ ๋ฉ๋๋ค.
๋ฌผ๋ก ์ด๋ ๊ฒ ์ฌ์ฉํ์ง ์๊ณ ๊ฐ๊ฐ์ ์ปจํธ๋กค๋ฌ ๋ฉ์๋์ ๋ชจ๋ธ์ ์ง์ ๋ด์์ ์ฒ๋ฆฌํด๋ ๋ฉ๋๋ค๋ง ์ด๋ ๊ฒ ํ๋๊ฒ ๊น๋ํ๋๊น ์ด ๋ฐฉ์์ผ๋ก ํ๋๋ก ํ๊ฒ ์ต๋๋ค.
๋ฑ๋ก ํผ์ ์ถ๊ฐ
<div>
<div>๋ฑ๋ก ์ง์ญ</div>
<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>
</div>
</div>
- th:each ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํด์ regions map์ ๋ด๊ธด ๊ฐ์ฒด๋ค์ ํ๋์ฉ ๋ฐ๋ณตํด์ check box ํผ์ผ๋ก ์ถ๋ ฅํ๋๋ก ์ค์ ํ์ต๋๋ค.
- <input type> ์ th:field="*{regions}"์์ regions๋ item ๊ฐ์ฒด์ ์ ํ๋ณ์์ ๋๋ค.
- th:value="${region.key}"์์ region.key๋ SEOUL, JEONJU, ANDONG ์ผ๋ก item์ ๋ณ์ region์ ๋ด๊ธธ ๊ฐ์ ๋๋ค.
- th:for="${#ids.prev('regions')}"
- ๋ฉํฐ ์ฒดํฌ๋ฐ์ค๋ ๊ฐ์ ์ด๋ฆ์ ์ฌ๋ฌ ์ฒดํฌ๋ฐ์ค๋ฅผ ๋ง๋ค ์ ์๋๋ฐ, ๋ฌธ์ ๋ ์ด๋ ๊ฒ ๋ฐ๋ณตํด์ HTMLํ๊ทธ๋ฅผ ์์ฑํ ๋, ์์ฑ๋ HTMLํ๊ทธ ์์ฑ์์ name์ ๊ฐ์๋ ๋์ง๋ง id๋ ๊ณ ์ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๋ฌ๋ผ์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ ํ์๋ฆฌํ๋ ์ฒดํฌ๋ฐ์ค๋ฅผ each๋ฃจํ ์์์ ๋ฐ๋ณตํด์ ๋ง๋ค ๋ ์์๋ก 1,2,3 ์ซ์๋ฅผ ๋ค์ ๋ถ์ฌ์ค๋๋ค.
- hidden ํ๋ ์๋ ์ถ๊ฐ๋ ๊ฒ์ ๋ณผ ์ ์์.
- <label for="id๊ฐ">์ ์ง์ ๋ id๊ฐ checkbox์์ ๋์ ์ผ๋ก ์์ฑ๋ regions1, regions2, regions3 ์๋ง์ถ์ด ์์๋๋ก ์ ๋ ฅ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
- check๋ ๋ถ๋ถ์ check="checked" ์ต์ ์ด ์๋ ์ถ๊ฐ๋ ๊ฒ์ ๋ณผ ์ ์์.
- <label for="id ๊ฐ">์ ์ง์ ๋ id๊ฐ checkbox์์ ๋์ ์ผ๋ก ์์ฑ๋ regions1, regions2, regions3 ์๋ง์ถ์ด ์์๋๋ก ์ ๋ ฅ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
์์ ํผ์ ์ถ๊ฐ
<div>๋ฑ๋ก ์ง์ญ</div>
<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>
</div>
์์ธ ํผ์ ์ถ๊ฐ
<div>๋ฑ๋ก ์ง์ญ</div>
<div th:each="region : ${regions}" class = "form-check form-check-inline">
<input type="checkbox" th:field="${item.regions}" th:value="${region.key}" class="form-check-input" disabled>
<label th:for="${#ids.prev('regions')}"
th:text="${region.value}" class="form-check-label">์์ธ</label>
</div>
์ฃผ์ / item์์๋ th:object๋ฅผ ์ฌ์ฉํ์ง ์์๊ธฐ ๋๋ฌธ์ th:field ๋ถ๋ถ์ ${item.regions}์ผ๋ก ์ ์ด์ฃผ์ด์ผ ํฉ๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก disabled ์ต์ ์ถ๊ฐ
์ํ ์ข ๋ฅ - radio button(๋ค์ค 1ํ)
๋ผ๋์ค ๋ฒํผ์ ์ฌ๋ฌ ์ ํ์ง ์ค์ ํ๋๋ง ์ ํํ ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
@ModelAttribute("itemTypes")
public ItemType[] itemTypes()
{
return ItemType.values();
}
๋ฑ๋ก ํผ์ ์ถ๊ฐ
<!--radio button -->
<div>
<div>์ํ ์ข
๋ฅ</div>
<div th:each="type : ${itemTypes}" class="form-check form-check-inline">
<input type="radio" th:field="*{itemType}" th:value="${type.name()}" class="form-check-input">
<label th:for="${#ids.prev('itemType')}" th:text="${type.description}" class="form-check-label">
BOOK
</label>
</div>
</div>
๋ค์ค check box์ ๋์ผํ ๋ฐฉ์
์์ ํผ์ ์ถ๊ฐ
<!--radio button -->
<div>
<div>์ํ ์ข
๋ฅ</div>
<div th:each="type : ${itemTypes}" class="form-check form-check-inline">
<input type="radio" th:field="*{itemType}" th:value="${type.name()}" class="form-check-input">
<label th:for="${#ids.prev('itemType')}" th:text="${type.description}" class="form-check-label">
BOOK
</label>
</div>
</div>
์์ธ ํผ์ ์ถ๊ฐ
<!--radio button -->
<div>
<div>์ํ ์ข
๋ฅ</div>
<div th:each="type : ${itemTypes}" class="form-check form-check-inline">
<input type="radio" th:field="${item.itemType}" th:value="${type.name()}" class="form-check-input" disabled>
<label th:for="${#ids.prev('itemType')}" th:text="${type.description}" class="form-check-label">
BOOK
</label>
</div>
</div>
์ฃผ์ / item์์๋ th:object๋ฅผ ์ฌ์ฉํ์ง ์์๊ธฐ ๋๋ฌธ์ th:field ๋ถ๋ถ์ ${item.itemType}์ผ๋ก ์ ์ด์ฃผ์ด์ผ ํฉ๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก disabled ์ต์ ์ถ๊ฐ
๋ฐฐ์ก ๋ฐฉ์ - select box(list)
์ ๋ ํธ ๋ฐ์ค๋ํ ์ฌ๋ฌ ์ ํ์ง ์ค์ ํ๋๋ฅผ ์ ํํ ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
@ModelAttribute("deliveryCodes")
public List<DeliveryCode> deliveryCodes()
{
List<DeliveryCode> deliveryCodes = new ArrayList<>();
deliveryCodes.add(new DeliveryCode("FAST","๋น ๋ฅธ ๋ฐฐ์ก"));
deliveryCodes.add(new DeliveryCode("NORMAL","์ผ๋ฐ ๋ฐฐ์ก"));
deliveryCodes.add(new DeliveryCode("SLOW","๋๋ฆฐ ๋ฐฐ์ก"));
return deliveryCodes;
}
/**
* FAST : ๋น ๋ฅธ๋ฐฐ์ก
* NORMAL : ์ผ๋ฐ ๋ฐฐ์ก
* SLOW : ๋๋ฆฐ ๋ฐฐ์ก
*/
@Data
@AllArgsConstructor
public class DeliveryCode {
private String code;
private String displayName;
}
์์ ์ ์ํ DeliveCode๋ผ๋ ์๋ฐ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด์ @ModelAttribute๋ก ๋ฏธ๋ฆฌ ๋ชจ๋ธ์ ๋ด์ ์ฌ์ฉํ์ต๋๋ค.
๋ฑ๋ก ํผ์ ์ถ๊ฐ
<!--select box-->
<div>
<div>๋ฐฐ์ก ๋ฐฉ์</div>
<select th:field="*{deliveryCode}" class="form-select">
<option value="">== ๋ฐฐ์ก ๋ฐฉ์ ์ ํ ==</option>
<option th:each="deliveryCode : ${deliveryCodes}" th:value="${deliveryCode.code}"
th:text="${deliveryCode.displayName}">FAST
</option>
</select>
</div>
์์ ํผ์ ์ถ๊ฐ
<!--select box-->
<div>
<div>๋ฐฐ์ก ๋ฐฉ์</div>
<select th:field="*{deliveryCode}" class="form-select">
<option value="">== ๋ฐฐ์ก ๋ฐฉ์ ์ ํ ==</option>
<option th:each="deliveryCode : ${deliveryCodes}" th:value="${deliveryCode.code}"
th:text="${deliveryCode.displayName}">FAST
</option>
</select>
</div>
์์ธ ํผ์ ์ถ๊ฐ
<!--select box-->
<div>
<div>๋ฐฐ์ก ๋ฐฉ์</div>
<select th:field="${item.deliveryCode}" class="form-select" disabled>
<option value="">== ๋ฐฐ์ก ๋ฐฉ์ ์ ํ ==</option>
<option th:each="deliveryCode : ${deliveryCodes}" th:value="${deliveryCode.code}"
th:text="${deliveryCode.displayName}">FAST
</option>
</select>
</div>
์ฃผ์ / item์์๋ th:object๋ฅผ ์ฌ์ฉํ์ง ์์๊ธฐ ๋๋ฌธ์ th:field ๋ถ๋ถ์ ${item.DeliveryCode}์ผ๋ก ์ ์ด์ฃผ์ด์ผ ํฉ๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก disabled ์ต์ ์ถ๊ฐ
'๐ Backend > Thymeleaf Template' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Thymeleaf ๊ธฐ๋ฅ - ํ ํ๋ฆฟ ์กฐ๊ฐ, ํ ํ๋ฆฟ ๋ ์ด์์ (0) | 2023.03.17 |
---|---|
Thymeleaf ๊ธฐ๋ฅ - ๊ธฐ๋ณธ (0) | 2023.03.17 |
Spring MVC - ์น ํ์ด์ง ๋ง๋ค๊ธฐ with Thymeleaf (0) | 2023.03.15 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422