...

@ModelAttribute에 대한 정리 본문

백엔드

@ModelAttribute에 대한 정리

gi2 2022. 4. 16. 20:57
@Getter @Setter
public class OrderSearch {

    private String MemberName; //회원 이름
    private OrderStatus orderStatus; //주문 상태 [ORDER,CANCEL]
}

OrderSearch 클래스가 있다.

회원 이름과 주문상태를 확인할 수 있으며, bean 클래스이고 getter와 setter가 명명 규칙에 맞게 들어가 있어야 한다. 

 

http://localhost:8080/orders?MemberName=박지성&OrderStatus=ORDER

와 같이 접속이 들어올 경우

 

@GetMapping("/orders")
public String orderList(@ModelAttribute("orderSearch") OrderSearch orderSearch, Model model) {
    List<Order> orders = orderService.findOrders(orderSearch);
    model.addAttribute("orders", orders);

    return "order/orderList";
}

orderList 메소드가 실행될 것이다. 

그렇다면 내 컴퓨터, 스프링 컨테이너는 자동적으로 OrderSearch 클래스의 orderSearch 객체를 자동 생성한다. 

 

이후, 생성된 오브젝트 (orderSearch)는 HTTP로 넘어온 값들을 자동으로 바인딩한다. 

 

마지막으로, @ModelAttribute 어노테이션이 붙은 orderSearch 객체가 자동으로 Model에 추가되고 뷰단으로 전달된다.

 

<뷰단> -> {orderSearch} 확인하기

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="fragments/header :: header"/>
<body>

<div class="container">

    <div th:replace="fragments/bodyHeader :: bodyHeader"/>

    <div>
        <div>
            <form th:object="${orderSearch}" class="form-inline">
                <div class="form-group mb-2">
                    <input type="text" th:field="*{memberName}" class="form-control" placeholder="회원명"/>
                </div>
                <div class="form-group mx-sm-1 mb-2">
                    <select th:field="*{orderStatus}" class="form-control">
                        <option value="">주문상태</option>
                        <option th:each="status : ${T(jpabook.jpashop.domain.OrderStatus).values()}"
                                th:value="${status}"
                                th:text="${status}">option
                        </option>
                    </select>
                </div>
                <button type="submit" class="btn btn-primary mb-2">검색</button>
            </form>
        </div>

 

Comments