2016년 11월 15일 화요일

80day / Final Project / Tiles Framework & 정규화


Tiles Framework와 정규화에 대하여 알아보았다.



↗ Page1에서 Page2로 이동할 때 기존의 Layout은 그대로 두고
Body부분만 바뀐다는 설명을 보여주는 이미지이다.

사실 JSP에서 <jsp:include>로 저런 Layout은 충분히 구현가능한데
굳이 Tile Framework가 왜 필요할까?

그 이유는 유지보수와 코드간결화가 아닐까 싶다.
위의 이미지를 예를 들어 설명하자면

ex) Page1 (Tiles Framework 미적용)
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Page 1</title>
</head>
    <body>
        <jsp:include page="Header"/>
        <jsp:include page="Menu"/>
        <a href="Page2">Link to Page2</a>
        Body 1
        <jsp:include page="Footer"/>
    </body>
</html>
cs

ex) Page2 (Tiles Framework 미적용)
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Body2</title>
</head>
    <body>
        <jsp:include page="Header"/>
        <jsp:include page="Menu"/>
        Body2
        <jsp:include page="Footer"/>
    </body>
</html>
cs

ex) Page1 (Tiles Framework 적용)
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<a href="Page2">Link to Page2</a>
Body 1
cs

ex) Page2 (Tiles Framework 적용)
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
Body 2
cs
중복되었던 코드가 굉장히 많이 줄었다!!!😊😊😊

위와 같이 적용하려면 당연히 세팅은 필수이다!!

ex) spring 설정 xml & Tiles 설정 xml
            ----------- spring setting xml -----------
<bean id="tilesConfigurer"
    class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
    <property name="definitions">
        <list>
            <value>/WEB-INF/tiles-*.xml</value>
        </list>
    </property>
</bean>
    * Tiles ViewResolver 설정 *
<bean id="tilesViewResolver"
    class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <property name="viewClass"
        value="org.springframework.web.servlet.view.tiles3.TilesView" />
    <property name="order" value="0" />
</bean>
<bean id="viewResolver"
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/"></property>
    <property name="suffix" value=".jsp"></property>
    <property name="order" value="1"></property>
</bean>
            ----------- Tiles Setting xml -----------
<tiles-definitions>
    <definition name="home" template="/WEB-INF/views/templates/layout.jsp">
        <put-attribute name="title" value="kosta" />
        <put-attribute name="header" value="/WEB-INF/views/templates/header.jsp" />
        <put-attribute name="left" value="/WEB-INF/views/templates/left.jsp" />
        <put-attribute name="footer" value="/WEB-INF/views/templates/footer.jsp" />
        <put-attribute name="main" value="/WEB-INF/views/home.jsp" />
    </definition>    
    * 상속받아 변경부분만 재정의한다 *
    
    * {디렉토리명}/{view이름} *
    <definition name="*/*" extends="home">
        <put-attribute name="main" value="/WEB-INF/views/{1}/{2}.jsp" />        
        <put-attribute name="title" value="{2}" />
    </definition>
   * {디렉토리명}/{디렉토리명}/{view이름} *
    <definition name="member/admin/*" extends="home">
        <put-attribute name="header" value="/WEB-INF/views/templates/admin/header.jsp" />
        <put-attribute name="main" value="/WEB-INF/views/member/admin/{1}.jsp" />        
        <put-attribute name="title" value="{1}" />
    </definition>
</tiles-definitions>
cs

ex) Controller
@Controller
public class TilesController {
     * @PathVariable : 요청 url 정보를 변수로 할당 받는다 
     * 요청 url 과 일치하는 url 매핑 정보가 있으면(별도의 메서드가 있으면) 
       그 메서드가 실행되고 없으면 @PathVariable 적용 메서드가 실행된다 
    @RequestMapping("{viewName}.do")
    public String showView(@PathVariable String viewName){
        System.out.println("@PathVariable:"+viewName);
        return viewName;
    }
    @RequestMapping("{dirName}/{viewName}.do")
    public String showView(@PathVariable String dirName,@PathVariable String viewName){
        System.out.println("@PathVariable:"+dirName+"/"+viewName);
        return dirName+"/"+viewName;
    }
    @RequestMapping("member/admin/{viewName}.do")
    public String showAdminLoginForm(@PathVariable String viewName){
        System.out.println("@PathVariable showAdminLoginForm");
        return "member/admin/"+viewName;
    }
}
cs

ex) /WEB-INF/views/templates/layout.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="tiles"  uri="http://tiles.apache.org/tags-tiles" %>    
<!DOCTYPE html>
<html>
<head>
* title이 null인 경우는 무시된다 *
<title><tiles:insertAttribute name="title" ignore="true" /></title>
</head>
<body>
    <div id="container">
        <div id="header"><tiles:insertAttribute name="header" /></div>
        <div id="left"><tiles:insertAttribute name="left" /></div>
        <div id="main"><tiles:insertAttribute name="main" /></div>
        <div id="footer"><tiles:insertAttribute name="footer" /></div>
    </div>
</body>
</html>
cs
익숙하지 않아서 그런지 설정이 번거롭고
Controller에서 Return시킬때 기존의 Return방식과 혼동되는 부분이 매우 많다.
하지만 계속 사용하면서 익숙해질 필요가 있을정도로 유용한 Freamework이다!!


http://gerardnico.com
데이터베이스 정규화
관계형 데이터베이스의 설계에서 중복을 최소화하여
데이터를 구조화하는 프로세스를 정규화라고 한다.

제 1 정규화
복수의 속성값을 갖는 속성을 분리
제 2 정규화
주 식별자에 종속되지 않는 속성을 분리, 부분 종속 속성을 분리
제 3 정규화
속성에 종속적인 속성을 제거, 이전 종속 속성의 분리

데이터베이스는 점점 어려워진다.
일단 정규화는 제 5 정규화까지 있으며 (제 6 정규화까지 있다는 말이 있어 검색 중)
제 3 정규화까지만 완료되어도 어느 정도 정규화를 마쳤다고 본다고 한다.

기존의 DB를 쪼개고 나누던 방식에 정규화를 도입하여 조금 더 정밀하게
데이터베이스의 모델링을 할 수 있도록 도와준다.

결국은 이 모든 것이 데이터베이스의 무결성을 보장하는 것이 아닐까 싶다!


0 개의 댓글:

댓글 쓰기