[Spring] 스프링 MVC 2편 02

알재·2023년 10월 9일

스프링 MVC 2편

목록 보기
2/11

김영한님의 스프링 MVC 2편 을 공부하여 정리한 글입니다.

입력 폼 처리

    <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>
    </form>
  • th:object
    < form > 에서 사용할 객체를 지정한다.
    선택 변수 식( *{ } )을 적용할 수 있다.

  • th:field="{ }"
    th:field 는 id , name , value 속성을 모두 자동으로 만들어준다.
    ${item.itemName} 은
    {itmeName}과 같다.


체크박스 - 단일

        <!-- 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 for="open" class="form-check-label">판매 오픈</label>
            </div>
        </div>
  • 체크 박스를 체크하면 HTML Form에서 open=on 이라는 값이 넘어간다.
    스프링은 on 이라는 문자를 true 타입으로 변환해준다.

  • HTML에서 체크 박스를 선택하지 않고 폼을 전송하면 open 이라는 필드 자체가 서버로 전송되지 않는다.

  • 히든 필드를 하나 만든다.
    기존 체크 박스 이름 앞에 언더스코어( _ )를 붙여서 전송하면 체크를 해제했다고 인식할 수 있다.
    히든 필드는 항상 전송된다.
    따라서 체크를 해제한 경우 _open 만 전송되는데, 이 경우 스프링 MVC는 체크를 해제했다고 판단한다.


        <!-- 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>
  • 타임리프를 사용하면 히든필드 까지도 해결해준다.

체크 박스 - 멀티

@ModelAttribute

    @ModelAttribute("regions")
    public Map<String, String> regions() {
        Map<String, String> regions = new LinkedHashMap<>();
        regions.put("SEOUL", "서울");
        regions.put("BUSAN", "부산");
        regions.put("JEJU", "제주");
        return regions;
    }

컨트롤러에 있는 별도의 메서드에 적용할 수 있다.
이렇게하면 해당 컨트롤러를 요청할 때 regions 에서 반환한 값이 자동으로 모델( model )에 담기게 된다.


        <!-- multi checkbox -->
        <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>
  • 타임리프는 체크박스를 each 루프 안에서 반복해서 만들 때 임의로 id 뒤에 숫자를 뒤에 붙여준다.
  • 타임리프는 ids.prev() , ids.next() 을 제공해서 동적으로 생성되는 id 값을 사용할 수 있도록 한다.

라디오 버튼

        <!-- 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>
  • 라디오 버튼은 이미 선택이 되어 있다면, 수정시에도 항상 하나를 선택하도록 되어 있으므로 체크 박스와 달리 별도의 히든 필드를 사용할 필요가 없다.

셀렉트 박스

    <!-- SELECT -->
    <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>
profile
저장소

0개의 댓글