파게로그

[Spring MVC] Tiles를 통한 페이지 모듈 분리(Retired Framework) 본문

콤퓨타 왕기초/Spring

[Spring MVC] Tiles를 통한 페이지 모듈 분리(Retired Framework)

파게 2021. 4. 29. 11:50

프론트와 백의 구분이 점차 이루어지면서 Tiles도 잘 안 쓰이는 추세라고 한다.

 

페이지 모듈 집중화 <jsp:include>도 가능하지만, 이것도 페이지 만들 때마다 넣기 귀찮으니까 Tiles를 이용한다. header/footer/aside/main(content) layout

 

1.

HTML 파일(index.html 등등...)에서 <header>를 잘라내서...

 

2.

view 안에 inc 폴더를 만들어서...

 

3.

header.jsp를 생성 후 클립보드의 내용을 붙여넣기

 

4.

<footer>도 footer.jsp로 마찬가지

 

5.

<div id = "visual">도 잘라내서 (여러 페이지에 공통적으로 있으니까)

view/inc(include)는 완전 공통인 애들

얘는 그건 아니니까 view/customer/inc 폴더 만들어서 여기다가 visual.jsp를 생성 후 클립보드의 내용을 붙여넣기

즉 예를 들면 프로젝트 트리는 다음과 같이 구성될 수 있다...

 

6.

main까지 별도로 떼어내고 나면,

이렇게 흩어진 것들을 배치할 수 있는 영역(껍데기?)인 레이아웃만 남게된다.

 


 

Tiles 호출 과정

 

/notice/list라는 호출이 들어오면...

Controller가 notice/list를 부르면

-> 먼저 Tiles에서 찾고, 조각들 합쳐서 보여주고 (???)

-> 못 찾으면 ViewResolver가 /WEB-INF/view/notice/list.jsp로 바꿔서 찾고

-> 못 찾으면 오류

 

(???) 과정은 어떻게..?

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

  <property name="prefix" value="/WEB-INF/views/" />

  <property name="suffix" value=".jsp" />

  <property name="order" value="2" />

</bean>

 

 

<bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">

  <property name="viewClass" value="org.springframework.web.servlet.view.tiles3.TilesView" />

  <property name="order" value="1" />

</bean>

 

<bean class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">

  <property name="definitions" value="/WEB-INF/tiles.xml" />

</bean>

 

 

 

 

tiles.apache.org에...

-> 페이지 조작은 이제는 프론트에서도 하기에 백엔드에서 합쳐주는 Tiles는, 공식적으로는 retired 상태이다.

 

tiles.xml가 필요한데, 이 파일의 스펙에 대해서는

tiles.apache.org/framework/tutorial/basic/pages.html 참고

 

컨트롤러가 ModelAndView mv = new ModelAndView("notice.list"); //꼭 .으로 구분하는건아님. 단 제일편함

이렇게 notice.list를 반환하면 tiles.xml에서 <definition name="notice.list">를 찾는다.

template="/WEB-INF/view/customer/inc/layout.jsp"

그리고 나머지 put-attribute의 value에 주소 넣어서 다 갖다붙인다. 물론 /WEB-INF/부터 써줘야함

 

그럼 이렇게 필요한 페이지의 목록을 정의했다면, 어디에 어떻게 붙일지도 정의해주어야 한다.

 

tiles.xml의 <put-attribute name="header">를 사용하고자 한다면?

(Tiles가 제공하는 태그 라이브러리를 이용해야 한다. <%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %>를 맨 위에 추가해놓고(메이븐에 타일 org.apache.tiles tiles-jsp 추가해야함))

header부분에다가 <tiles:insertAttribute name="header"/> 이렇게 하면된다.

 

--패턴--

<definition name="notice.list" ...> ... </definition>

<definition name="notice.detail" ...> ... </definition>

일 때...

<definition name="notice.*" ...> ... </definition>으로 와일드카드 사용 가능

-> 이렇게 하면 <put-attribute name="body" value="/WEB-INF/view/customer/notice/{1}.jsp" />처럼

와일드카드에 들어온 문자열을 대입할 수 있음. notice.*.*처럼 2개면 {1}, {2} 사용 가능ㅇㅇ

(<definition name="REGEXP:정규식" ... 도 사용 가능하다..;;)

 

루트에 있는 걸 *로 찾아버리면 notice.*가 검색이 안되니까

Controller가 반환할 때부터, 그리고 <definition>에서 각각 root.something, root.* 로 하면 된다.

 

Comments