본문 바로가기

스프링 프레임워크

Spring MVC (스프링 웹 MVC) 14강 ~ 24강

14강 - 페이지 모듈 분리하기

 

15강 - Tiles 지시서 작성하기

 

기존에 MVC Model2 방식은 Client가 /notice/list 를 요청하면 Controller 는 요청에 대한 처리를 하고

앞 뒤에 /WEB-INF/view.jsp 를 붙여서 /WEB-INF/view/notice/list.jsp 에 처리한 값들을 넣어 View에 보여주었다.

 

이번에는 MVC Model2 방식 + Tiles 라는 개념을 결합하면 Client가 /notice/list 를 요청할때

Controller는 Tiles 에게 notice.list 를 요청하면 Content 와 Layout 을 결합하고 Controller에게 요청에 대한 처리한 값을 넣어 View에 보여준다.

 

현재 Tiles 를 요청하려면 notice.list, 일반 jsp 파일을 요청하는 것은 notice/list 이다.

=> Spring 은 Client가 /notice/list 요청이 올때 Tiles로 갈지 일반 jsp 파일로 갈지 모른다.

따라서 Tiles를 먼저 거친 다음 없다면 jsp 파일에서 찾게 우선 순위를 부여할 것이다.

 

 

/WEB-INF 폴더 내부에 tiles.xml 파일을 생성해서 Controller 와 연결해주는 설정과

Controller에서 notice.list 라는 값이 왔을떄 Content 와 Layout을 합쳐주는 설정을 해야한다.

 

<definition name="notice.list" template="/WEB-INF/view/customer/inc/layout.jsp">

    <put-attribute name="title" value="Tiles tutorial homepage" />

    <put-attribute name="header" value="/WEB-INF/view/inc/header.jsp" />

    <put-attribute name="visual" value="/WEB-INF/view/customer/inc/visual.jsp" />

    <put-attribute name="aside" value="/WEB-INF/view/customer/inc/aside.jsp" />

    <put-attribute name="body" value="/WEB-INF/view/customer/notice/list.jsp" />

    <put-attribute name="footer" value="/WEB-INF/view/inc/footer.jsp" />

  </definition>

 

컨트롤러에서 notice.list 라는 요청이 Tiles에게 들어오면 Tiles 는 /WEB-INF/view/customer/inc/layout.jsp 페이지에

title, header, visual, aside, body, footer 이름을 사용하여 해당 속성에 대한 value값에 jsp 페이지를 매칭시켜주어

Layout + content(title, header, visual, aside, body, footer) 을 하게 한다. (설정은 tilse.xml 에서) 

 

16강 - 레이아웃 페이지 만들기와 Tiles 라이브러리 설정하기

tiles.xml 파일에서 설정한 title, header, visual, aside, body, footer 조각들을 페이지 어디에 위치시킬 것인가

지정해야한다.

 

먼저 jsp 파일 맨 위에 tiles 를 사용할 수 있게 

<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %>

등록을 해주고

layout.jsp 페이지에 해당 위치에 아래와 같이 지정해주면 된다.

<tiles:insertAttribute name="title"/>
<tiles:insertAttribute name="header"/>
<tiles:insertAttribute name="visual"/>
<tiles:insertAttribute name="aside"/>
<tiles:insertAttribute name="body"/>
<tiles:insertAttribute name="footer"/>

17강 - Tiles ViewResolver 설정하기

현재까지 만든 것

 

Controller에서 notice.list 를 요청했을때 해당하는 페이지를 tiles 에서 찾아주는(연결해주는) Resolver를 설정해주어야한다.

 

<!-- Tiles가 정의되어있는 곳을 설정 -->

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

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

</bean>

 

<!-- Resolver 등록 -->

<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>

 

18강 - Tiles 설정에 Wildcard(*) 이용하기

 

<definition name="notice.*" template="/WEB-INF/view/customer/inc/layout.jsp">

    <put-attribute name="title" value="공지사항" />

    <put-attribute name="header" value="/WEB-INF/view/inc/header.jsp" />

    <put-attribute name="visual" value="/WEB-INF/view/customer/inc/visual.jsp" />

    <put-attribute name="aside" value="/WEB-INF/view/customer/inc/aside.jsp" />

    <put-attribute name="body" value="/WEB-INF/view/customer/notice/{1}.jsp" />

    <put-attribute name="footer" value="/WEB-INF/view/inc/footer.jsp" />

  </definition>

 

설명1)

<definition name="notice.*" template="/WEB-INF/view/customer/inc/layout.jsp">

</definition> 으로 설정하면

Controller 가 notice.XXX 로 들어오는 것은 모두 받아서 /WEB-INF/view/customer/inc/layout.jsp 페이지에서

처리하겠다.

 

설명2)

<put-attribute name="body" value="/WEB-INF/view/customer/notice/{1}.jsp" /> 에서 {1} 은 첫번째 와일드카드(*) 를 의미한다.

ex. name="notice.*.*" 로 설정 되어있을때 두번째 와일드 카드를 사용하고 싶다면 {2} 로 값을 사용할 수 있다.

 

위와 같이 설정하고

<put-attribute name="body" value="/WEB-INF/view/customer/notice/{1}.jsp" />

ex) notice.list 가 넘어오면 <put-attribute name="body" value="/WEB-INF/view/customer/notice/list.jsp" />

 

<put-attribute name="body" value="/WEB-INF/view/customer/notice/{1}/{2}.jsp" />

ex) notice.list.detail 이 넘어오면 <put-attribute name="body" value="/WEB-INF/view/customer/list/detail.jsp" />

 

19강 - Root 페이지들을 위한 Layout 페이지 만들기

 

위의 사진 같이 tiles.xml 에 설정하면, 컨트롤러에서 root.index 를 넘기면 

1) tiles.xml 파일을 찾는다.

2) definition name="root.*" 을 보고 template="/WEB-INF/view/inc/layout.jsp" 에 가서 

3) 세팅한 title, header, body, footer 에서 내용(data)을 가져와 layout.jsp 에 넣어준다.

4) 세팅 완료한 layout.jsp 를 View로 보여준다.

 

20강 - 데이터 서비스 클래스(NoticeService 준비하기)

 

21강 - Service 객체 사용하기

 

ListController 에서 NoticeService 클래스에 대한 객체를 생성해서 notice의 리스트를 불러와야한다.

 

Spring에서는 객체를 직접 생성하는 것이 아니라 IoC 컨테이너에서 객체를 관리해준다.

=> dispatcher-servlet.xml 파일에서 NoticeService 클래스를 bean 등록해주자!

 

IoC 컨테이너에 담겨있는 NoticeService 는 Controller 에서 어떻게 가져다 쓸까?

=> DI(Dependency Injection) 을 하면 된다.

dispatcher-servlet.xml 에 등록한 <property name = "noticeService" ref="noticeService" /> 때문에

setter 메서드가 필요한 상황

 

 

name="noticeService" 는 setNoticeService() 이고,

ref="noticeService" 는 set메서드 매개변수 NoticeService noticeService 로 전달된다.

※ EL 표기법을 사용할때 field값에 대한 getter 가 존재해야한다!!!

 

22강 - Service 객체 분리하기

Service 기능에 대한 인터페이스를 생성해서 사용하면 Service의 종류가 바뀌어도 (JDBCService ~> JPAService)

이슈화 되지 않는다.

1. NoticeService의 전체적인 기능을 정의한 인터페이스를 생성

2. JDBC 전용 Service 클래스 JDBCNoticeService 를 만들고 implements NoticeService 해준다.

3. ListController 에서는 NoticeService 인터페이스를 필드로 두고 set 메서드도 인터페이스에 대해서

    set하는 메서드를 만든다.

ex.

private NoticeService noticeService;

public void setNoticeService(NoticeService noticeService) {
this.noticeService = noticeService;
}

4. dispatcher-servlet.xml 파일에 JDBCNoticeService bean 등록

<!-- IoC 컨터에너에 JDBCNoticeService 클래스 담아주기 -->

<bean id="noticeService" class="com.newlecture.web.service.jdbc.JDBCNoticeService" />

5. 위와 같이 설정했을때 JPANoticeService가 필요해지면

<!-- IoC 컨터에너에 JPANoticeService 클래스 담아주기 -->

<bean id="noticeService" class="com.newlecture.web.service.jpa.JPANoticeService" />

 

만 변경해서 간편하게 등록할 수 있다. (결합도가 낮아짐으로써 쉽게 변경 가능)

23강 - 연결정보 분리하기

24강 - 스프링 설정파일 분리하기


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

출처: 뉴렉처
www.youtube.com/watch?v=9Tmzt6Q9WI8&list=PLq8wAnVUcTFUHYMzoV2RoFoY2HDTKru3T&index=27