김영한 강사님의 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술을 듣고 정리한 내용입니다. 자세한 내용은 강의를 참고해주세요
저번 스프링 mvc1에서 했던 예제를 추가하는 형식으로 실습을 진행한다
Spring mvc- 웹 페이지 만들기
th:object : 커맨드 객체를 지정한다, view에 연결되는 객체이다*{} : 선택 변수 식, th:object에서 선택한 객체를 접근하는 식이다th:field : html 태그의 id,name,value속성을 자동으로 처리해준다@GetMapping("/add")
public String addForm(Model model) {
model.addAttribute("item", new Item());
return "form/addForm";
}
Model을 파라미터로 받고 addAttribute()를 이용해 Model에 item객체를 생성한다
th:object ="${item}"으로 커맨드 객체를 지정한다th:field ="*{itemName}" 이렇게 접근할 수 있다th:field="${item.itemName}"이렇게 접근할 수 있다th:field 는 id , name , value 속성을 모두 자동으로 만들어준다.th:object th:field 덕분에 폼을 개발할 때 약간의 편리함을 얻었다마찬가지로 editForm또한 수정해준다
판매 여부
등록 지역
상품 종류
배송 방식

@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; // 배송 방식
@Data를 이용해 여러 기능을 추가 해주었다.
${item.open}이렇게 프로퍼티 방식으로 필드값에 채워진다on으로 보내고_open은 무시됨_open만 있는 것을 보고 item.getOpen을 해보면 null이 아니라 false로 저장됨

<div class="form-check">
<input type="checkbox" id="open" name="open" class="form-check-input">
<input type="hidden" name="_open" value="on"/> <!-- 히든 필드 추가 -->
<label for="open" class="form-check-label">판매 오픈</label>
</div>
<div class="form-check">
<input type="checkbox" id="open" th:field="*{open}" class="form-checkinput">
<label for="open" class="form-check-label">판매 오픈</label>
</div>
th:field="*{open}"_open을 추가해준다@ModelAttribute("regions")
public Map<String, String> regions() {
Map<String, String> regions = new LinkedHashMap<>();
regions.put("SEOUL", "서울");
regions.put("BUSAN", "부산");
regions.put("JEJU", "제주");
return regions;
}
@ModelAttribute : 컨트롤러가 호출될때마다, 자동으로 @ModelAttribute("region")부분이 실행되고 ->이는 "region"이름으로 Model에 return값을 넣는다.
th:each="region : "${regions}"를 이용한다@ModelAttribute로 모델에 담은 것이다th:field="*{regions}" = th:field = "${item.fidle}이다#ids.prev('region')은 그 동적으로 만든 id를 찾아주는 코드이다ids.prev, ids.next 이런 방식이 있다
th:field로 인해 동적으로 생성되고...
<label for="id 값"> 에 지정된 id 가 checkbox 에서 동적으로 생성된 regions1 , regions2 ,regions3 에 맞추어 순서대로 입력된 것을 확인할 수 있다item.html 즉 상품 상세 확인 정보에서는 th:object를 사용하지 않았으므로 th:field에 th:field="${item.region}"이렇게 넣어줘야 한다disabled를 추가해서 상품 상세에서는 체크 박스가 선택되지 않게 해야한다editForm.html도 추가해준다public enum ItemType {
BOOK("도서"), FOOD("식품"), ETC("기타");
private final String description;
ItemType(String description) {
this.description = description;
}
public String getDescription() {
return description;
}
}
@ModelAttribute("itemTypes")
public ItemType[] itemTypes() {
return ItemType.values();
}
<!-- radion 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>
${type.name()} ->Book이 들어가고"&{type.description}" -> getter프로퍼티를 이용한 도서가 들어간다
@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;
}
@ModelAttribute를 이용해 컨트롤러가 실행될 때, Model에 저장하는 특별한 사용법을 적용하였다<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>
<hr class="my-4">
<Select>로 시작하고<option>태그로 처음 제목을 넣고<option>태그로 선택 박스를 둔다 -> 이때 th:each문법을 써서 반복문을 사용한다value값과, text으로 넣는다