본문 바로가기

Springあるある

[타임리프와 스프링의 통합]의 진짜 의미!

타임리프의 메뉴얼 2가지 형태로 제공된다. 

1] 타임리프만 사용할 경우의 메뉴얼

2] 스프링과 통합할 경우의 메뉴얼

그런데 Spring MVC 구조를 살펴보면 Spring이 제공하는 viewResolver를 통하여 자동으로 뷰 페이지 경로를 찾고, 

Spring이 제공하는 Model 객체를 통해서 뷰에서 데이터를 꺼내 쓸 수가 있는 것이다. 그럼 이것 또한 Spring과 이미 통합된

상태에서 타임리프를 사용하고 있다고 말할 수 있는 것 아닌가??

결론부터 말하면 타임리프가 사용된 뷰 페이지에 스프링이 Model 객체를 이용하여 단방향으로 데이터를 뿌려주기만 한다

면 그건 타임리프와 스프링이 통합되었다고 할 수 없다.

그 반대로도 즉 타임리프를 통해 스프링 MVC로 데이터가 전송이 돼서 Spring이 제공하는 여러 기능들을 사용할 수 있게

타임리프가 도와 줘야 타임리프가 진정한 의미로 스프링과 통합됐다고 말 할 수가 있다. 

(더 정확한 이해는 아래 예시를 보면 이해할 수 있다)

(이 과정에서 타임리프 엔진이 스프링 컨테이너에 있는 MessageResolver 등의 스프링 빈을 조회하여 이용한다는 점이 통

합의 포인트이다)

예시

 

흐름 1

 

<form action="item.html" th:action th:obejct="${item}" method="post">
    <div>
        <label for="itemName">상품명</label>
        <input type="text" id="itemName" name="itemName" 
        th:field="*{itemName}" class="form-control" placeholder="이름을 입력하세요">
    </div>
    <div>
        <label for="price">가격</label>
        <input type="text" id="price" name="price" 
        th:field="*{price}" class="form-control" placeholder="가격을 입력하세요">
    </div>
    <div>
        <label for="quantity">수량</label>
        <input type="text" id="quantity" name="quantity" 
        th:field="*{quantity}" class="form-control" placeholder="수량을 입력하세요">
    </div>

    <hr class="my-4">

    <div class="row">
        <div class="col">
            <button class="w-100 btn btn-primary btn-lg" type="submit">상품 등록</button>
        </div>

 

 

흐름 2

흐름 3]

 

->  FORM 태그를 타임리프로 수정하였고, 상품 등록에 사용자가 데이터를 입력하는 순간 스프링 서버는 

그 데이터를 받는다. 여기서 스프링과 통합돼 사용된 부분은 FORM 태그의 데이터를 스프링이 제공하는

@ModelAttribute로 바인딩을 할 수 있게 th:object="${object}", th:field를 사용했다는 점이다. 

이런 점에서 이 타임리프 예시는 스프링과 통합된 사용이라고 말할 수가 있다. 

 

* 타임리프가 스프링과 통합됨으로써 얻는 위력은 Bean Validation 부분에서 진짜 나타난다.