반응형
<Tiles 기본>
  1.  tiles 란?
-  반복적으로 사용되는 header, footer와 같은 정보를 한곳에 모아둔 프레임 워크

  1.   tiles3로 오면서 설정이 더욱 간단해 졌다. tiles3는 spring3.2 버전 이상부터 쓰일 수 있으니 참고바람.

  1.     pom.xml에 3가지 dependency를 추가한다.

pom.xml

<dependency>
    <groupId>org.apache.tiles</groupId>
    <artifactId>tiles-extras</artifactId>
    <version>3.0.0</version>
</dependency>
<dependency>
    <groupId>org.apache.tiles</groupId>
    <artifactId>tiles-jsp</artifactId>
    <version>3.0.0</version>
</dependency>
<dependency>
    <groupId>org.apache.tiles</groupId>
    <artifactId>tiles-servlet</artifactId>
    <version>3.0.0</version>
</dependency></p>


  1.    tiles를 유동적으로 사용하고 싶다면 다음과 같이 설정한다.  우선 모든 view들은 tiles를 정의한 tiles 설정 파일의  definition들에서
binding될 jsp 등의 view 파일들을 찾게됩니다. 만약 각 views.xml에서 view 파일을 못찾게 되면 우선순위가 2인 InternalResourceViewResolver 에서 해당 view 파일을 찾게 됩니다.

참고 >> 
view resolver
- View Resolver는 Spring의 DispatcherServlet이 Controller의 응답 결과를 가져올 때, 어떤 방식으로 view 객체를 가져올지 정하고 해당 객체를 생성한다.
- View Resolver를 구현한 클래스는 InternalResourceViewResolver, BeanNameViewResolver, XmlViewResolver, UrlBasedViewResolver 등이 있다.
- DispatcherServlet은 여러개의 ViewResolver를 가질 수 있는데, 'order' property에 따라 어떤 ViewResolver를 결정할지 우선순위를 정할 수 있다. 우선순위를 명시하지 않으면 가장 낮은 우선순위를 가진다.
- 우선순위가 높은 ViewResolver에게 View 객체를 요청하는데, 만약 null을 리턴한다면 그 다음 우선순위의 ViewResolver에게 객체를 요청하게 된다.
- InternalResourceViewResolver는 항상 mapping되는 view 객체를 리턴하고, 없다고 null을 반환하지 않으므로 항상 가장 낮은 우선순위로 두어야한다.



dispatcher-servlet.xml

<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="1" />
</bean>

// tiles의 우선순위를 1로 설정해둔다.

 <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="prefix" value="/WEB-INF/views/"/>
  <property name="suffix" value=".jsp"/>
  <property name="order" value="2"></property>
 </bean>

//기존에 써있던 view resolver 에서 우선순위만 바꿔줬다.


<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
  <property name="definitions">
  <list>
  <value>/WEB-INF/tiles/tiles.xml</value>
  </list>
  </property>
</bean>

//tiles관련 설정파일 
//만약 여러개 하고 싶다면 list의 value를 추가해주면 된다.


  1. 다음은 tiles 설정파일 tills.xml

<!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN" "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">

<tiles-definitions>
  <definition name="default" template="/WEB-INF/views/layout/layout.jsp">
  <put-attribute name="header" value="/WEB-INF/views/layout/header.jsp" />
  <put-attribute name="body" value=""/>
  <put-attribute name="footer" value="/WEB-INF/views/layout/footer.jsp" />
  </definition>

//기본적인 defiinition 태그를 하나 만들어둔다.

  <definition name="tiles" extends="default">
<put-attribute name="body" value="/WEB-INF/views/layout/mainTest.jsp" />
</definition>

//  defiinition 을 상속받아 여러 타일즈를 만들수 있다.

</tiles-definitions>


빨간색으로 표시한 definition name="tiles" <- 이부분이 중요하다.  이부분때문에 오류가 많이난다.

  1. layout.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
  pageEncoding="EUC-KR"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
</head>

<body>
  <div id="wrap">
  <div >
  <div>
  <div>
  <tiles:insertAttribute name="header" />
  </div>
  </div>
  <div>
  <div>
  <tiles:insertAttribute name="body" />
  </div>
  </div>
  <div>
  <div>
  <tiles:insertAttribute name="footer" />
  </div>
  </div>
  </div>
  </div>
</body>
</html>



기본적으로 만들고 싶은 틀을 html 형식으로 만들어 준다.    <tiles:insertAttribute name="footer" /> 의 name은 tiles.xml에서 설정한 name과 같아야 한다. 

  1. Controller mapping 추가

@RequestMapping(value = "/test", method = RequestMethod.GET)
  public String hello(Locale locale, Model model) {

  Date date = new Date();
  DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

  String formattedDate = dateFormat.format(date);

  model.addAttribute("serverTime", formattedDate );
  return "tiles";
  }


return 값과 definition에서 정의한 name이 반드시 일치하게 해야 404 에러가 안난다. 기본적인 설정은 완료하였다. 
응용버전은 추후 추가하도록 하겠다.

  1. 기본적인 부분 완성!  - header.jsp , footer.jsp, mainTest.jsp 는 커밋해놓았으니 각자 코드를 확인해보기 바란다!



<Tiles 응용>
앞서 소개한 tiles 를 우리 프로젝트에 응용할 수 있도록 해보겠다.





우리가 앞서 소개한 부분은 defulat이다. 근데 나는 left 메뉴가 있는화면도 필요하다면 tiles.xml에 <definition>을 추가할 수 있다.


<!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN" "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">

<tiles-definitions>
  <definition name="default" template="/WEB-INF/views/layout/layout.jsp">
<put-attribute name="header" value="/WEB-INF/views/layout/header.jsp" />
<put-attribute name="body" value=""/>
<put-attribute name="footer" value="/WEB-INF/views/layout/footer.jsp" />
  </definition>

<1>
  <definition name="withLeft" template="/WEB-INF/views/layout/layout_left.jsp">
<put-attribute name="header" value="/WEB-INF/views/layout/header.jsp" />
<put-attribute name="left" value=""/>
<put-attribute name="body" value=""/>
<put-attribute name="footer" value="/WEB-INF/views/layout/footer.jsp" />
  </definition>  

  <definition name="tiles" extends="default">
<put-attribute name="body" value="/WEB-INF/views/layout/mainTest.jsp" />
</definition>

<2>
<definition name="user/*/*" extends="withLeft">
<put-attribute name="left" value="/WEB-INF/views/layout/left.jsp"/>
<put-attribute name="body" value="/WEB-INF/views/{1}/{2}.jsp" />
</definition>



</tiles-definitions>


<1>  template을 다르게 해서  definition을 추가했다. 이를 상속받아 <2>를 추가했다.

여기서 중요한것은 <2>번이다. 다들 이를 응용하여 개발하면 된다.
definition name="/" -- > controller mapping 형태를 말한다. 

참고>>>
definition name 형식 -
- ? : 한 글자, * : 아무글자나, [abc] : abc로 시작

IssueController.java
@RequestMapping(value={"/issue/list"} , method=RequestMethod.GET)
public String showIssueList(HttpServletRequest request) {
return "issue/issueList";
}
}


/issue/list를 매핑하여  issue/issueList를 return 한다.
그러면  issue가 {1}  issueList가 {2}가 된다.
즉 issue 폴더 아래에 있는 issueList에 적용한다는 것이다.


http://localhost:8081/toyProject/issue/list  를 호출하면 다음과 같은 화면이 나온다. 




layout_left.jsp 가 적용된 화면이니 이를 응용하여 프로젝트에 활용하면 된다 . 끝!







출처: http://creator1022.tistory.com/176 [무한도전]







반응형

'개발공부 > Spring' 카테고리의 다른 글

예외처리(1)  (0) 2020.10.01
Spring에서 Bean을 주입하는 방식  (0) 2020.03.16
SPRING AOP  (0) 2018.07.02
SLF4J와 Logback  (1) 2018.06.26
반응형
zookeeper(주키퍼)란?
분산 처리 시스템에서 일괄적으로 관리해주는 시스템

분산처리 환경에서는 기본적으로 서버가 몇대에서 수백대까지도 구축 가능 
- 이런 환경에서는 예상치 못하는 예외적인 부분이 많이 발생 (네트워크장애, 일부 서비스 기능 중지, 서비스 업그레이드 및 확장)

즉, 싱글 서버에서는 문제가 되지 않으나 멀티 서버 관리를 하면 문제가 될 수도 있는ㄷ 이러한 문제점들을 쉽게 해결해준다.

1)  네임서비스를 통한 부하분산
- 하나의 서버에만 서비스가 집중되지 않게 서비스를 알맞게 분산해 각각의 클라이언트들이 동시에 작업하게 해준다
- DNS 서버에 어느 서버로접속해야 하는지 물어보고 나서 직접 서버에 연결하는 방식

2) 데이터의 안정성 보장
- 하나의 서버에서 처리한 결과를 다른 서버들과 동기화하여 데이터의 안정성을 보장한다.

3) 장애상황 판단 및 복구
- 운영서버에 문제가 발생해서 서비스를 제공할 수 없을 경우, 다른 대기중인 서버를 운영 서버로 바꿔서 서비스가 중지없이 제공되게 한다.

4) 환경설정 관리
분산환경을 구성하는 서버의 환경설정을 따로 분산하지 않고 주키퍼 자체적으로 관리한다.

주키퍼는 다중의 서버 집합을 묶어서 관리해주는 시스템인데 그 중에서도 리더가 되는 서버 하나가 존재한다.
모든 서버의 중심이 되는 서버, 또한 하나의 서버에서 처리가 되어 데이터가 변경되면 모든 서버에 전달되어 동기화를 하게 된다.

분산 환경에서의 주키퍼 서버는 일반적으로 세대 이상을 사용하고 홀수로 구성한다. - 과반수룰을 적용하기 위해

SPOF(single Point Of Failure) 처리

액티브 서버 : 현재 서비스를 하고있는 서버

스탠바이 서버 : 장애 발생시 대처하기 위한 대기 서버

동작중이던 액티브 서버가 장애가 발생 할 경우 관리시스템이 판단하여 기존의 스탠바이 서버를 액티브 서버로 전환하여 서비스를 처리


주키퍼의 기본 구조와 상세 활용법에 대해서는 추후 업로드 하도록 하겠다.




출처: http://creatorw.tistory.com/entry/2-주키퍼zookeeper-기본-구조 []

출처: http://creatorw.tistory.com/entry/2-주키퍼zookeeper-기본-구조 []
출처 : http://exem-academy.com/?p=2927


반응형

+ Recent posts