Springあるある
input 태그 속에 th:field와 th:value가 동시에 있는 경우
JIN_YOUNG _KIM
2025. 1. 10. 19:09
public enum ItemType {
Book("도서"),
Food("음식"),
ETC("기타");
private final String description;
ItemType(String description) {
this.description = description;
}
public String getDescription(){
return description;
}
}
@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; // 배송 방식
public Item() {
}
public Item(String itemName, Integer price, Integer quantity) {
this.itemName = itemName;
this.price = price;
this.quantity = quantity;
}
}
@Controller
@RequestMapping("/form/items")
@RequiredArgsConstructor
public class FormItemController {
private final ItemRepository itemRepository;
@ModelAttribute("regions")
public Map<String,String> regions(){
LinkedHashMap<String, String> regions = new LinkedHashMap<>();
regions.put("SEOUL","서울");
regions.put("BUSAN","부산");
regions.put("JEJU","제주");
return regions;
}
@ModelAttribute("itemTypes")
public ItemType[] itemTypes(){
ItemType[] values = ItemType.values(); // Enum에 정의된 모든 정보를 배열로 반환!
return values;
}
@GetMapping
public String items(Model model) {
List<Item> items = itemRepository.findAll();
model.addAttribute("items", items);
return "form/items";
}
Model 객체에 itemTypes라는 배열형이 들어 가 있다(즉, ItemType[]이 들어 가 있으며, ItemType은 Enum 형이다.
이 배열 안에 Enum 클래스에서 정의한 모든 정보가 들어가 있다)
th:value = type.name(ItemType[]에 들어 있는 enum 정보를 반복문을 돌면서 하나씩 뱉어 낸다.)이 뱉어 내는 데이터와
th:field=item.itemType이 뱉어 내는 데이터가 일치하면 input 태그 안에 checked="checked"를 넣어 주어서 활성화 시키고
일치하지 않으면 해당 라이도 버튼은 활성화 되지 x.
=> 위 조건 분기 작업은 타임리프에서 지원하는 기능이다. 이 기능을 만약 개발자가 짠다면 매우 복잡해 지며 어렵다.
타임리프는 radio 타입 뿐 아니라 checkbox와 selectbox에도 똑같은 기능을 자동 지원한다.