출처 - http://choija.com/212

 

[Spring3 MVC (1)] Spring3 MVC Framework 소개

2011/11/28 14:09 in 공부/FrameWork

 
 


viralpatel.net
이라는 사이트에서 스프링3 MVC 대한 간략한 소개 예제를 보게 되었다.
이해하기 쉽도록 설명하고 있고, 예제 또한 따라하기 쉽고 설명되어 있어서 나의 발번역으로 
보기 쉽게 ( 나중에 볼때 빨리 있게 ) 블로그에 남겨 놓고자 한다.
혹시라도 글을 보시는 분들께서는 영어 번역이 허접이라 많이 미숙하다는 점을 알고 봐주시면 감사하겠습니다.


Spring3 MVC Framework
소개
Spring MVC
Spring framework 컴포넌트 이다. 이것은 풍부한 기능을 제공하고, 견고한 어플리케이션을 만드는데 도움을 준다.
Spring MVC framework
모든 조각의 로직과 기능들이 highly configurable 하도록 디자인되고 설계되었다.
그리고 스프링은 Struts, Webwork, Java Server Faces, Tapestry 같은 다른 유명한 프레임 워크와도 효과적으로 통합된다.
이말은 이중 하나의 프레임워크를 이용하기 위해 Spring 프레임워크를 사용할 있다는 말이다.
또한 스프링은 클라이언트에게 렌더링 하여 화면을 보여주는 있어서 Servlet 또는 JSP 결합이 강하지 않다.
다른 View 기술들인 Velocity, Freemaker, Excel 또는 Pdf 까지 통합하는것이 가능하다.

요청 처리의 생명주기 ( Request Processing LifeCycle )
 


이미지 출처 : Springsrouce

Spring web MVC framework
다른 프레임워크 들과 마찬가지로 요청들에 대해서 컨트롤러 들로 분배하고, 프레임워크의 여러가지 기능을 제공하는 servlet 중심으로 설계되어 있다. 이게 바로 Spring에서 DispatcherServlet 인데 완전하게 Spring IoC container 통합되어 있으며, Spring 다른 모든 기능들을 사용 있도록 해준다.

Spring 3.0 MVC
요청 처리 절차는 아래와 같다.

1.
클라이언트가 http request 형태로 web container 요청을 보낸다.

2.
들어오는 request  Front Controller (DispatcherServlet) 의해서 가로채 지고, 적절한 HandlerMapping 찾는다.

3. Handler Mapping
도움으로, DispatcherServlet 들어온 요청을 적절한 Controller 보낸다.

4. Controller
들어온 요청을 처리하고(비즈니스로직수행) 결과로 Model View  ModelAndView 라는 객체의 인스턴스 형태로 Front Controller 다시 전달한다.

5. Front Controller
 ViewResolver 오브젝트를 이용하여  view 분석한다 (이것은 JSP 수도 있고, velocity, freemaker 등이 있다).

6.
선택된 view 변환되어 다시 클라이언트에게 보여진다
.

Spring 3.0
기능들

- Spring 3.0 framework
Java 5.0 지원 : annotation 기반의 설정을 지원한다. Java 5 기능인 generics, annotations, vargs 등을 스프링에서 사용 가능하다.

-
새로운 expression language Spring Expression Language SpEL 소개되었다.

- REST web service
지원한다.

-
데이터 변환이 매우 쉽다. 어노테이션 기반의 데이터 포멧팅을 지원한다. @DateTimeFormat(iso=ISO.DATE) @NumberFormat(style=STYLE.CURRENCY) 어노테이션을 이용하여 날짜형식  통화형식으로 형변환이 가능하다.

- JPA 2.0
지원이 시작됐다
.

Spring 3.0
설정하기

Spring 3.0 MVC
시작점은 바로 DispatcherServlet 이다. DispatcherServlet HttpServlet 부모클래스로하여 구현하고 있는 일반적인 servlet 클래스 이다. 따라서 web.xml 설정을 해줄 필요가 있다.

view plaincopy to clipboardprint?

  1. <web-app>     

  1.         
  2. <servlet>           
  3.   <servlet-name>example</servlet-name>           
  4.   <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>           
  5.   <load-on-startup>1</load-on-startup>       
  6. </servlet>   
  7.          
  8. <servlet-mapping>           
  9.   <servlet-name>example</servlet-name>           
  10.   <url-pattern>*.html</url-pattern>       
  11. </servlet-mapping>   
  12.     
  13. </web-app>   


코드를 통해 web.xml DispatcherServlet 설정해 주었다.
예제의 DispatcherServlet 에서 *.html url패턴의 요청에 대해 매핑을 해준것을 기억 하길 바란다.
따라서 *.html 형태의 요청이 들어왔을 , Spring 3.0 MVC Front Controller 호출 것이다.



DispatcherServlet
초기화 되고 나면, [서블릿이름]-servlet.xml 이란 파일을 어플리케이션의 WEB-INF 폴더 하위에서 찾게 된다.
위의 예에서는 프레임워크가 example-servlet.xml 이란 파일을 찾을 것이다.

다음  [Spring3 MVC (2)] Spring 3.0 MVC Hello world 프로젝트 만들기 에서 실제로 동작하는
Hello world
어플리케이션을 만들어 보도록 한다.

 

 

[Spring3 MVC (2)] Spring 3.0 MVC Hello world 어플리케이션 만들기

2011/12/02 17:21 in 공부/FrameWork

 
 


*
시작하기 앞서 발번역 실력으로 서툰 문장이 있을 수도 있음을 미리 알려드립니다 ^^;

이전글에서 스프링3.0 대한 간략한 소개와 요청을 처리하는 수명주기(life cycle), 아키텍쳐 다이어그램 등을 살펴보았다.
이제는 간단한 Hello world 어플리케이션을 만들어 보도록 한다.

hello world
데모 어플리케이션을 만들기 위해 Eclipse IDE 사용할 것이다.

필요한것들

예제인 hello world 어플리케이션을 만들기위해 다음과 같은 것들이 필요하다.

1. JDK 1.5
이상
2. Tomcat 5.x
이상 또는 기타 다른 컨테이너 (GlassFish, JBoss, Websphere, Weblogic )
3. eclipse 3.2.x
이상
4. spring 3.0 MVC jar
파일들. 아래 목록이 이번 샘플 어플리케이션을 만들기 위해 필요한 JAR 파일 들이다

  1. package net.viralpatel.spring3.controller;     
  2. import org.springframework.stereotype.Controller;   
  3. import org.springframework.web.bind.annotation.RequestMapping;   
  4. import org.springframework.web.servlet.ModelAndView;     
  5.     
  6. @Controllerpublic class HelloWorldController {        
  7.     
  8.     @RequestMapping("/hello")      
  9.     public ModelAndView helloWorld() {             
  10.     
  11.         String message = "Hello World, Spring 3.0!";           
  12.         return new ModelAndView("hello""message", message);       
  13.     }   
  14. }   



우리가 @Controller @RequestMapping("/hello") 라는 어노테이션을 사용했다는 것을 기억하라.
스프링이 우리의 패키지들을 스캔할 , request요청을 처리함에 있어 클래스를 Controller 빈으로서 처리할 것으로 인식 것이다.
그리고 @RequestMapping("/hello") 라는 어노테이션은 스프링에게 URL path에서 "/hello" 시작하는 모든 요청에 대해
Controller 처리할 것이라고 전할 것이다.
이는 /hello/* /hello.html 등을 모두 포함한다.

helloWorld()
메소드는 ModelAndView 객체를 리턴한다. ModelAndView 객체는 "hello" 라는 이름을 가진 뷰를 찾도록 것이고, 데이터 모델들은 다시 브라우저로 전달되어 JSP에서도 데이터에 접근할 있도록 해준다. 뷰의 논리적인 이름은 "/WEB-INF/jsp/hello.jsp" 것이다.
ModelAndView
객체에서 "hello" 라고 리턴된 뷰의 이름이 어떻게 "/WEB-INF/jsp/hello.jsp" 해석될 있는가에 대해서는 잠시후에 다뤄보도록 한다.

ModelAndView
객체는 "Hello World, Spring3.0 !" 라는 내용을 "message"라는 키를 가지고 있는 메세지를 포함한다.
이것은 우리가 화면에 뿌려줄 데이터이다. 일반적으로 화면에 뿌려 value object(VO) 것이다.
이번 예에서는 간단한 스트링 문자만 가지고 있는 객체이다.

화면 : JSP 파일 만들기

hello world
메세지를 화면에 보여주기위해서 JSP파일을 만들어 주어야 한다. JSP파일은 /WEB-INF/jsp 폴더 안에다가 만든다.
/WEB-INF/jsp
hello.jsp 라는 파일을 만들고, 아래 내용을 넣어준다.

File: WEB-INF/jsp/hello.jsp

view plaincopy to clipboardprint?

  1. <html>   
  2. <head>  
  3.      <title>Spring 3.0 MVC Series: Hello World - ViralPatel.net</title>  
  4.  </head>  
  5.  <body>  
  6.      ${message}  
  7.  </body>  
  8.  </html>   



위의 JSP ${message} 라는 구문을 이용하여 단순히 화면에 메세지를 보여주는 페이지 이다
"message"
라는 이름은 우리가 컨트롤러에서 ModelAndView 객체에 메세지와 함게 세팅해준 이름인 것을 기억하길 바란다.

다음으로 우리 어플리케션의 입구가 index.jsp 파일도 필요하다. WebContent 폴더 아래 index.jsp라는 파일을 만들고
아래의 내용을 입력하도록 한다.

File: WebContent/index.jsp

view plaincopy to clipboardprint?

  1. <html>  
  2.  <head>  
  3.      <title>Spring 3.0 MVC Series: Index - ViralPatel.net</title>  
  4.  </head>  
  5.  <body>  
  6.      <a href="hello.html">Say Hello</a>  
  7.  </body>  
  8.  </html>   



WEB.xml
파일에 Spring MVC 매핑 시키기

앞의 글에서도 이야기 했듯이, Spring MVC 어플리케이션의 입구가 서블릿은 DispatcherServlet 이며
WEB.xml
파일에 세팅을 해줌으로서 사용할 있다.
WEB.xml
파일을 열고 아래 내용을 추가로 넣어서 수정해 준다.

File: WEB-INF/web.xml

view plaincopy to clipboardprint?

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3. xmlns="http://java.sun.com/xml/ns/javaee"  
  4. xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"  
  5. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"  
  6. id="WebApp_ID" version="2.5">  
  7. <display-name>Spring3MVC</display-name>       
  8.     
  9.     
  10. <welcome-file-list>           
  11. <welcome-file>index.jsp</welcome-file>     
  12. </welcome-file-list>      
  13.     
  14.     
  15. <servlet>         
  16.     <servlet-name>spring</servlet-name>   
  17.     <servlet-class>         
  18.     org.springframework.web.servlet.DispatcherServlet       
  19.     </servlet-class>      
  20.     <load-on-startup>1</load-on-startup>   
  21. </servlet>  
  22.     
  23. <servlet-mapping>     
  24.     <servlet-name>spring</servlet-name>     
  25.     <url-pattern>*.html</url-pattern>    
  26. </servlet-mapping>  
  27.     
  28. </web-app>   



web.xml
설정된 코드를 보면 *.html 패턴을 가진 모든 요청에 대해서 DispatcherServlet 으로 매핑 것이다.
index.jsp
파일을 welcome-file 지정 것도 같이 기억해 두도록 한다.

여기서 우리가 한가지 알아두어야 점은, web.xml파일에서 서블릿의 이름을 나타내주는 <servlet-name>태그이다.
DispatcherServlet
초기화가 되고나면, 웹어플리케이션의 WEB-INF 폴더에서 [서블릿이름]-servlet.xml 이름을 가진
파일을 찾을 것이다.
이번 예에서는 spring-servlet.xml 이란 이름을 가진 파일을 찾게 것이다.

스프링 설정 파일

WEB-INF
폴더에 spring-servlet.xml 이라는 파일을 만들고, 아래 내용을 입력한다.

File: WEB-INF/spring-servlet.xml

view plaincopy to clipboardprint?

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4. xmlns:p="http://www.springframework.org/schema/p"  
  5. xmlns:context="http://www.springframework.org/schema/context"  
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans  
  7. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
  8. http://www.springframework.org/schema/context  
  9. http://www.springframework.org/schema/context/spring-context-3.0.xsd">  
  10.     
  11. <context:component-scan base-package="net.viralpatel.spring3.controller" />  
  12.     
  13.     <bean id="viewResolver"  
  14.         class="org.springframework.web.servlet.view.UrlBasedViewResolver">  
  15.     <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />  
  16.     <property name="prefix" value="/WEB-INF/jsp/" />  
  17.     <property name="suffix" value=".jsp" />  
  18.     </bean>  
  19. </beans>   


위의 xml 설정파일에서, <context:component-scan>이라는 태그를 지정해주었다.
이것은 net.viralpatel.spring3.controller 패키지 모든 하위 패키지에 있는 컴포넌트 들을 Spring 구동시 불러 것이다.
이때 HelloWorldController 클래스도 불러올 것이다
또한 viewResolver 빈을 설정해 주었는데, 이것은 뷰를 만들 , prefix /WEB-INF/jsp suffix .jsp ModelAndView 에서 설정한 view 이름과 조합하여 해석 것이다
우리가 HelloWorldController 클래스에서 ModelAndView 객체를 리턴할 'hello" 라는 이름을 사용했기 때문에,
이것은 "/WEB-INF/jsp/hello.jsp" 라는 경로로 만들어져 해석된다.

준비는 !

빨리 결과를 보고 싶을 것이다. 이클립스에 톰캣 설정을 한다
Window > ShowView > Server
클릭하여 창을 띄운다음,
마우스 오른쪽 클릭 > new > server 클릭하고 나머지 설정을 추가해서 서버를 등록한다.

프로젝트를 구동하기위해 프로젝트익스프로러에서 프로젝트 이름에 마우스 오른쪽 클릭 > Run as > Run on Server (단축키 : Alt+Shift+X, R)
클릭한다.



소스코드 다운받기

 Spring3MVC-part1.zip


다음 살펴볼

이번 듀토리얼에서 Spring3 MVC 샘플 어플리케이션을 만들어보았다.
스프링 환경 설정을 하는 것과 @Controller, @RequestMapping 같은 어노테이션을 사용하는 것도 보았다.
다음 번엔 스프링3 MVC 에서 form 데이터를 컨트롤하는 방법  보도록 한다.

 

 

[Spring3 MVC (3)] 스프링3.0 MVC에서 (Forms) 다루기

2011/12/05 14:17 in 공부/FrameWork

 
 


Spring3 MVC
시리즈의 3번째 입니다. 저번시간에는 스프링3 Hello World 어플리케이션으 만들어보았습니다.
스프링 MVC web.xml 설정하는법, 그리고 @Controller, @RequestMapping 같은 어노테이션을 사용하는 방법도 알아보았습니다.
이번 글에서는 스프링3MVC에서 (Forms) 다루는 법을 알아보도록 하겠습니다.
(
쓰다보니 이전글까지는 반말로 썼는데 갑자기 존댓말로 쓰고있네요..ㅋㅋ 양해를..)

이전 글에서 만들었던 프레임워크를 기반으로 해서 기능을 추가해 보는 방식으로 진행합니다.
이번에 만들어 것은 연락처관리 어플리케이션입니다.

목표

이번 목표는 간단한 연락처 관리 어플리케이션을 만들어 보는 것입니다. 앱은 사용자로부터 연락처에 대한 정보를 입력받는 폼을 가지고 있습니다. 지금부터 자세한 것들을 로그로 찍어 것입니다. 스프링3 MVC에서 데이터가 어떻게 처리되는지 배우게 것입니다.



시작하기

만들고있었던 Hello World 스프링3 MVC 앱에 연락처 관리 추가해 보도록 하겠습니다.
index.jsp
파일을 열고 아래 내용으로 수정합니다.

File : WebContent/index.jsp

view plaincopy to clipboardprint?

  1. <jsp:forward page="contacts.html"></jsp:forward>   


코드는 contacts.html 페이지로 리다이렉팅 시켜주는 역할을 합니다.

- contact.jsp 파일

유저에게 연락처 폼을 보여주는 페이지를 만들어 보도록 하겠습니다.

File : WebContent/WEB-INF/jsp/contact.jsp

view plaincopy to clipboardprint?

  1. <%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>  
  2. <html>  
  3. <head>  
  4.     <title>Spring 3 MVC Series - Contact Manager</title>  
  5. </head>  
  6. <body>   
  7. <h2>Contact Manager</h2>  
  8. <form:form method="post" action="addContact.html">    
  9.     <table>    
  10.     <tr>       
  11.         <td><form:label path="firstname">First Name</form:label></td>       
  12.         <td><form:input path="firstname" /></td>     
  13.     </tr>      
  14.     <tr>       
  15.         <td><form:label path="lastname">Last Name</form:label></td>     
  16.         <td><form:input path="lastname" /></td>   
  17.     </tr>    
  18.     <tr>     
  19.         <td><form:label path="lastname">Email</form:label></td>     
  20.         <td><form:input path="email" /></td>   
  21.     </tr>   
  22.     <tr>      
  23.         <td><form:label path="lastname">Telephone</form:label></td>   
  24.         <td><form:input path="telephone" /></td>     
  25.     </tr>    
  26.     <tr>     
  27.         <td colspan="2">        
  28.             <input type="submit" value="Add Contact"/>    
  29.         </td>      
  30.     </tr>  
  31.     </table>   
  32. </form:form>  
  33. </body>  
  34. </html>  


파일에서 폼을 보여 줍니다. 폼이 submit 되면 addContact.html 페이지로 요청된다는 사실을 기억하시기 바랍니다.

스프링3 (Form) 컨트롤러(Controller) 추가하기

이제 스프링3에서 데이터를 출력하고, 값들을 가져오는 로직을 추가해보겠습니다.
먼저 2개의 java 파일을 만들어야 합니다. 첫번째는 화면으로부터 데이터를 가져오고/보여주는 역할을 하는 Contact.java 파일이고,
두번째는 스프링 컨트롤러 클래스인 ContactController.java 파일입니다.


File : net.viralpatel.spring3.form.Contact.java

view plaincopy to clipboardprint?

  1. package net.viralpatel.spring3.form;    
  2.     
  3. public class Contact {    
  4.     private String firstname;    
  5.     private String lastname;     
  6.     private String email;     
  7.     private String telephone;     
  8.         
  9.     //.. getter and setter for all above fields.    
  10. }   


파일은 화면으로부터 연락처 정보를 담고있는 파일입니다. getter setter 메소드를 보여주지 않은 것을 확인하세요.
getter/setter
메소드 들은 Alt + Shift + S, R 단축키를 눌러서 만들 있습니다.

File : net.viralpatel.spring3.controller.ContactController.java

view plaincopy to clipboardprint?

  1. package net.viralpatel.spring3.controller;   
  2. import net.viralpatel.spring3.form.Contact;    
  3. import org.springframework.stereotype.Controller;  
  4. import org.springframework.validation.BindingResult;  
  5. import org.springframework.web.bind.annotation.ModelAttribute;  
  6. import org.springframework.web.bind.annotation.RequestMapping;   
  7. import org.springframework.web.bind.annotation.RequestMethod;  
  8. import org.springframework.web.bind.annotation.SessionAttributes;  
  9. import org.springframework.web.servlet.ModelAndView;    
  10.     
  11. @Controller  
  12. @SessionAttributespublic  
  13. class ContactController {     
  14.     
  15.     @RequestMapping(value = "/addContact", method = RequestMethod.POST)   
  16.     public String addContact(@ModelAttribute("contact")   
  17.                         Contact contact, BindingResult result) {       
  18.         System.out.println("First Name:" + contact.getFirstname() +            
  19.                         "Last Name:" + contact.getLastname());       
  20.         return "redirect:contacts.html";      
  21.     }     
  22.     
  23.     @RequestMapping("/contacts")      
  24.     public ModelAndView showContacts() {        
  25.         return new ModelAndView("contact""command"new Contact());     
  26.     }  
  27. }   


컨트롤러 클래스에서/contacts  /addContact 라는 RequestMapping 가진 두개의 메소드를 만들었다는 것을 기억하세요.
유저가 contacts.html 이라는 url 가진 요청을  , showContacts() 메소드가 호출 것입니다.
메소드는 "contact" 라는 이름을 가진 모델을 만들 것입니다
ModelAndView
객체를 리턴할 같이 전달하는 Contact객체의 이름이 "command" 라는 것을 확인하세요.
만약 jsp 파일에서 스프링을 사용하고 있다면, command 라는 이름을 가진 객체를 찾게 것입니다.

addContact() 메소드에 RequestMapping 어노테이션 설정해주고 인자에 method="RequestMethod.POST" 넘겨주었습니다.
/addContact.html
이란 url 가진 POST 방식의 요청을 했을 , 메소드가 호출 것입니다.
메소드 인자로 Contact 객체를 넘길 , @ModelAttribute 라는 어노테이션을 추가해 주었습니다
이것이 들어온 요청(request)로부터 데이터를 받아와 Contact 객체에 바인딩을 시켜줍니다. 메소드에서 우리는 FirstName LastName 출력하고, contacts.html 리다이렉팅 시켜주었습니다.

완료

폼이 모두 완성되었습니다. 이클립스에서 Alt + Shift + X, R 키를 눌러 어플리케이션을 실행해 보시기 바랍니다.
연락처 관리 폼을 보여 것입니다. 값들을 입력하고 서브밋 버튼을 클릭해 보세요. 버튼을 클릭 했을때, sysout 로그로 이름과 성을 출력할 것입니다.



소스코드 다운받기

 Spring3MVC-part2.zip


다음글에서는..

이번 글에서는 스프링3 에서 폼을 어떻게 만드는지, jsp에서 어떻게 출력하는지에 대해서 알아보았습니다.
그리고 @ModelAttribute 어노테이션을 이용하여 폼의 값들을 가져오는 방법도 알아보았습니다. 다음 글에서는 검증과 데이터 변환 메소드에 대해서 알아보도록 하겠습니다.

관련글여러 row 가진 데이터 서브밋 예제 (번역안됨)

 

 

[Spring3 MVC (4)] 이클립스에서 Tiles 플러그인 예제 따라하기

2011/12/06 14:47 in 공부/FrameWork

 
 


벌써 4번째 글입니다
지난글에서는 스프링3에서 폼을 만들고 보여주는 것에 대해서 배워보았습니다.
@ModelAttribute 어노테이션 사용법도 살펴봤습니다.

이번 글에서는 Tiles 프레임워크와 그것을 스프링3 통합하는 것에 대해서 알아보겠습니다. 이전 글까지 만들었던 어플리케이션에 Tiles 추가해 보도록 하겠습니다. 만약 소스코드가 없다면 이전글로 돌아가 소스코드를 다운받아서 진행하도록 합니다.

Tiles2
소개

요즘 대부분의 웹사이트 들은 여러페이지에 걸쳐 재사용되는 조각들로 페이지가 나누어져 있습니다. 예를 들어서 페이지의 헤더, 푸터, 메뉴 등이 그것입니다. 이것들은 웹사이트 전체에 걸쳐서 일관된 화면을 보여줍니다. 이렇게 반복되어 나타나는 페이지들을 웹사이트의 전체에 걸쳐서 하드코딩하기란 굉장히 힘든 일일 것입니다. 만약 수정사항이라도 발생하는 날엔 모든 페이지에 걸쳐 같은 수정작업을 반복해야 됩니다.
그래서 우리는 템플릿 메카니즘을 사용합니다. 일반적인 헤더, 푸터, 메뉴페이지를 하나씩 만들어놓고 각각의 페이지에서 그것을 불러오는 것입니다.

Tiles
플러그인은 바로 설명과같이 템플릿화, 컴포넌트화 하는것을 도와주는 프레임워크입니다. 사실 메카니즘은 매우 비슷합니다. 하나의 완성된 페이지 또는 다른 페이지의 일부를 만들기 위해 페이지의 부분들을 정의하는것입니다. ( 페이지를 조각조각 나누어 조립하는것이 "타일" 비슷하다고 해서 이름을 "Tiles" 라고 만든 같습니다.) 각각의 파트 들은 변수를 취할 있고, 동적인 컨텐츠를 가질 있으며 Java언어의 메소드로도 보여질 있습니다. 타일즈는 웹어플리 케이션의 모든페이지를 일관된 &필로 유지하기 위한 템플릿 시스템 이라고 있습니다. 이것은 코드의 중복성을 줄이고, 템플릿의 재사용성을 높여줍니다.

일반적인 웹사이트의 레이아웃은 하나의 중심이 되는 설정파일에 정의되고, 이것은 웹사이트의 모든 페이지에서 확장 있습니다.

만들려고 하는 어플리케이션의 레이아웃

우리의 목표는 이전에 만들었던 Hello world 어플리케이션에 헤더, 푸터, 메뉴를 추가하는 것입니다. 다음 그림의 형태가 것입니다.


필요한 JAR 파일들

스프링3 어플리케이션에 Tiles 추가하기 위해, 개의 jar 파일들이 필요합니다. 다음 리스트가 필요한 파일들입니다. jar 파일들을 WEB-INF/lib 폴더에 추가해 주시기 바랍니다.

파랗게 선택된 파일들이 Tiles 추가를 위해 새로 필요한 파일들입니다.

Spring MVC
에서 Tiles 설정하기

Tiles
설정해주기 위해, Tiles 설정을 위한 빈을 spring-servlet.xml 만들어 줘야 합니다. WEB-INF폴더에 있는 spring-servlet.xml 파일을 열어서 아래 코드를 <beans> </beans> 태그 사이에 입력해 주시기 바랍니다.

File : /WebContent/WEB-INF/spring-servlet.xml

view plaincopy to clipboardprint?

  1. <bean id="viewResolver"    

  1.     class="org.springframework.web.servlet.view.UrlBasedViewResolver">    
  2.     <property name="viewClass">       
  3.         <value>             
  4.         org.springframework.web.servlet.view.tiles2.TilesView      
  5.         </value>     
  6.     </property>   
  7. </bean>  
  8.     
  9. <bean id="tilesConfigurer"   
  10.     class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">     
  11.     <property name="definitions">      
  12.         <list>        
  13.         <value>/WEB-INF/tiles.xml</value>      
  14.         </list>     
  15.     </property>  
  16. </bean>   



설정에서 /WEB-INF/tiles.xml 이라는 파일을 빈의 변수로서 넣어주었는데, 바로 파일에서 웹사이트의 Tiles 관한 설정을 하게 것입니다. WEB-INF 폴더에 tiles.xml 파일을 만들고, 아래 코드를 입력해 주시기 바랍니다.

File : /WebContet/WEB-INF/tiles.xml

view plaincopy to clipboardprint?

  1. <?xml version="1.0" encoding="UTF-8" ?>   
  2. <!DOCTYPE tiles-definitions PUBLIC      
  3. "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"    
  4. "http://tiles.apache.org/dtds/tiles-config_2_0.dtd">  
  5.     
  6. <tiles-definitions>    
  7.     
  8. <definition name="base.definition"   
  9.     template="/WEB-INF/jsp/layout.jsp">    
  10.     <put-attribute name="title" value="" />         
  11.     <put-attribute name="header" value="/WEB-INF/jsp/header.jsp" />    
  12.     <put-attribute name="menu" value="/WEB-INF/jsp/menu.jsp" />       
  13.     <put-attribute name="body" value="" />        
  14.     <put-attribute name="footer" value="/WEB-INF/jsp/footer.jsp" />    
  15. </definition>       
  16.     
  17. <definition name="contact" extends="base.definition">     
  18.     <put-attribute name="title" value="Contact Manager" />      
  19.     <put-attribute name="body" value="/WEB-INF/jsp/contact.jsp" />     
  20. </definition>   
  21.     
  22. </tiles-definitions>   



위의 tiles.xml 파일에 base.definition 이라는 템플릿을 정의했습니다. 레이아웃은 헤더, 타이틀, 바디, 메뉴, 푸터같은 것들을 포함하고 있습니다. 그리고나서 템플릿은 새롭게 정의한 Contact 페이지에서 확장(extend) 되고 있습니다. 기본 페이지들은 덮어쓰고, Body Title 해당하는 내용들만 바꾸어 주었습니다
.

JSP
파일 만들기


layout.jsp
라는 JSP파일에 템플릿 들을 정의해 것입니다. 템플릿은 여러 다른 웹페이지(메뉴, 푸터, 해더 ) 조각들로 구성됩니다. layout.jsp, menu.jsp, header.jsp, footer.jsp 이렇게 4개의 JSP 파일들을 만들고 아래의 코드를 입력해 주시기 바랍니다.

File: /WebContent/WEB-INF/jsp/layout.jsp

view plaincopy to clipboardprint?

  1. <%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"%>  
  2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  3. <html>   
  4. <head>  
  5. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  6. <title><tiles:insertAttribute name="title" ignore="true" /></title>  
  7. </head>   
  8. <body>  
  9.     <table border="1" cellpadding="2" cellspacing="2" align="center">     
  10.         <tr>         
  11.             <td height="30" colspan="2"><tiles:insertAttribute name="header" />   
  12.             </td>     
  13.         </tr>   
  14.         <tr>    
  15.             <td height="250"><tiles:insertAttribute name="menu" /></td>    
  16.             <td width="350"><tiles:insertAttribute name="body" /></td>    
  17.         </tr>     
  18.     <tr>     
  19.         <td height="30" colspan="2"><tiles:insertAttribute name="footer" />    
  20.         </td>     
  21.     </tr>  
  22.     </table>  
  23. </body>  
  24. </html>   



File : /WebContent/WEB-INF/jsp/header.jsp

view plaincopy to clipboardprint?

  1. <h1>Header</h1>   



File : /WebContent/WEB-INF/jsp/menu.jsp

view plaincopy to clipboardprint?

  1. <p>Menu</p>   



File : /WebContent/WEB-INF/jsp/footer.jsp

view plaincopy to clipboardprint?

  1. <p>Copyright © ViralPatel.net</p>   




준비 !

이클립스에서 컴파일하고 어플리케이션을 실행시켜서, 헤더, 메뉴, 푸터가 제대로 들어가 있는지 확인한다.



소스코드 다운로드

 Spring3MVC-part3.zip



다음글에서는...

오늘 우리는 스프링3에서 Tiles 프레임워크를 설정하고 사용하는 방법을 배웠습니다. Tiles 설정 파일을 사용하기 위해서 org.springframework.web.servlet.view.tiles2.TilesConfigurer 사용해서 설정했습니다. 다음글 에서는 Internationalization / Localization (다국어화/지역화) 이것을 스프링3에서 하는 방법을 대해서 알아보도록 하겠습니다. 여러분께 이글이 도움이 되었으면 좋겠습니다.
도움되셨으면 많은 댓글 피드백 부탁드립니다.

 

 

[Spring3 MVC (5)] 국제화(Internationalization) & 현지화(Localization) 예제로 알아보기

2011/12/07 14:53 in 공부/FrameWork

 
 


벌써 5번째 글이 되었습니다
이전 글에서는 Tiles 스프링3 MVC에서 설정하고 사용하는 법에 대해서 살펴 봤습니다. Tiles 설정 파일을 정의 하기 위해서 org.springframework.web.servlet.view.tiles2.TilesConfigurer 클래스를 정의하는데 사용 했습니다. 이걸 이용해서 만들었던 HelloWorld 어플리케이션을 헤더와 푸터 메뉴 등으로 나누었습니다

이번 파트에서는 스프링3 MVC 국제화(Internationalization - I18N ) 현지화(Localization - L10N ) 대해서 알아보도록 하겠습니다.
이번 시리즈 내내 만들어왔던 Hello world 어플리케이션에 l10n 다라 i18n 기능을 덧붙여 보겠습니다.
소스가 없다면 이전글로 돌아가서 소스를 다운받아 실습하시기를 권해드립니다.

i18n
L10n 이란 무엇인가? 

컴퓨터에서 국제화와 현지화 라는것은, 다른 언어와 지역적인 차이들을 소프트웨어에 적용시킨다는 것을 말합니다. 국제화라는 것은 여러가지 다른 언어와 지역적 차이들을 기술적인 변경 없이 소프트웨어에 적용할 있도록 설계하는 과정을 말합니다. 현지화 라는 것은 국제화가 소프트웨어에 특정 지역이나 언어에 대해서 지역특색의 컴포넌트를 추가한다거나 번역을해서 적용시키는 것을 말합니다.

용어는 i18n 이라고 자주 줄여 씁니다. ( internationalization 단어의 첫글자인 i 끝글자인 n 사이에 18개의 글자가 있다고해서 i18n )
L10n
에서는 대문자 L 쓰고 i18n 에서는 소문자 i 써서  소문자 l 대문자 I 혼동하는것을 피합니다.

목표

우리의 목표는 국제화, 현지화 기능을 스프링 MVC 어플리케이션에 추가하는 것입니다. 끝마치고 나면 다음과 같은 모습이 됩니다.

   

두개의 언어지원 기능을 추가  겁니다 : 영어와 독일어. 유저가 사용하는 브라우저의 지역적인 세팅에 따라서 적절한 언어가 선택됩니다.
유저가 우상단에 있는 언어 선택 링크를 직접 클릭하여 언어를 변경할 있습니다.

메세지 자원 파일 (Message Resources File)

어플리케이션에서 표시되는 모든 문자를 담게 두개의 properties 파일을 만들 것입니다. 두개의 파일은 "resources" 라고 불리우는 자원 폴더에 저장 것입니다. 프로젝트 이름에 마우스 오른쪽 클릭 > New > Source Folder  클릭하고 이름을 resources  하여 자원 폴더를 만듭니다.

만든 폴더에 messages_de.properties messages_en.properties 두개의 파일을 만들고 아래의 내용을 입력합니다.

File : resources/messages_en.properties

label.lastname=Last Name 
label.email=Email 
label.telephone=Telephone 
label.addcontact=Add Contact  

label.menu=Menu
label.title=Contact Manager 

label.footer=© ViralPatel.net 


File : resources/messages_de.properties

label.firstname=Vorname

label.lastname=Familiename

label.email=Email

label.telephone=Telefon

label.addcontact=Addieren Kontakt 

    

label.title=Kontakt Manager

label.menu=Men&#252;

    

label.footer=&copy; ViralPatel.net


스프링3 MVC에서 국제화(Internatinalization - i18n) 현지화( Localization - L10n) 설정해주기

방금 두개의 메시지들이 담긴 파일을 만들었습니다. 이제 이파일들을 스프링 설정에서 지정해 주는 작업을 해야 합니다.
그러기 위해서 org.springframework.context.support.ReloadableResourceBundleMessageSource 클래스를 사용할 것입니다.

유저가 직접 언어를 선택할 있는 기능도 추가 것입니다. 기능은 org.springframework.web.servlet.i18n.LocaleChangeInterceptor  클래스를 통해서 구현됩니다. LocaleChangeInterceptor 클래스는 지역적인 차이가 발생됐을 이것을 잡아냅니다. 그리고 변경 내역은 다음 요청에 대비하기 위해 쿠키에 저장됩니다. 이런 지역적인 변화를 쿠키에 저장하기 위해서 org.springframework.web.servlet.i18n.CookieLocaleResolver 클래스 파일이 사용됩니다.

다음 코드를 spring-servlet.xml 파일에 추가합니다.

File : WebContent/WEB-INF/spring-servlet.xml

view plaincopy to clipboardprint?

  1. <bean id="messageSource"  

  1.     class="org.springframework.context.support.ReloadableResourceBundleMessageSource">   
  2.     <property name="basename" value="classpath:messages" />   
  3.     <property name="defaultEncoding" value="UTF-8"/>   
  4. </bean>   
  5.      
  6. <bean id="localeChangeInterceptor"  
  7.     class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">   
  8.     <property name="paramName" value="lang" />   
  9. </bean>   
  10.      
  11. <bean id="localeResolver"  
  12.     class="org.springframework.web.servlet.i18n.CookieLocaleResolver">   
  13.     <property name="defaultLocale" value="en"/>   
  14. </bean>   
  15.      
  16. <bean id="handlerMapping"  
  17.     class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">   
  18.     <property name="interceptors">   
  19.         <ref bean="localeChangeInterceptor" />   
  20.     </property>   
  21. </bean>  



messageSource
설정의 basename 프로퍼티의 값을 "classpath:messages" 설정한 것을 보시기 바랍니다
설정으로 인해서 스프링은 기본적인 자원파일을 찾을 , messages_ 시작하는 파일을 찾을 것입니다
.

JSP
화면 변경하기

지금까지 두개의 메세지 파일일을 만들고 스프링에 설정을 완료 주었는데 이제 이를 JSP파일에서 사용할 차례이다 . 실습하고 있는 어플리케이션의 jsp 파일들을 열고 아래의 내용을 수정한다.

File : WebContent/WEB-INF/jsp/header.jsp

view plaincopy to clipboardprint?

  1. <%@taglib uri="http://www.springframework.org/tags" prefix="spring"%>   
  2.       
  3. <h3><spring:message code="label.title"/></h3>   
  4.       
  5. <span style="float: right">   
  6.     <a href="?lang=en">en</a>   
  7.     |   
  8.     <a href="?lang=de">de</a>   
  9. </span>  



File : WebContent/WEB-INF/jsp/menu.jsp

view plaincopy to clipboardprint?

  1. <%@taglib uri="http://www.springframework.org/tags" prefix="spring"%>    
  2.     
  3. <p><spring:message code="label.menu"/></p>   



File : WebContent/WEB-INF/jsp/footer.jsp

view plaincopy to clipboardprint?

  1. <%@taglib uri="http://www.springframework.org/tags" prefix="spring"%>     
  2.     
  3. <spring:message code="label.footer"/>   



File : WebContent/WEB-INF/jsp/contact.jsp

view plaincopy to clipboardprint?

  1. <br />  
  2. <%@taglib uri="http://www.springframework.org/tags" prefix="spring"%>   
  3. <%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>   
  4. <html>   
  5. <head>   
  6.     <title>Spring 3 MVC Series - Contact Manager</title>   
  7. </head>   
  8. <body>   
  9.       
  10. <form:form method="post" action="addContact.html">   
  11.       
  12.     <table>   
  13.     <tr>   
  14.         <td><form:label path="firstname"><spring:message code="label.firstname"/></form:label></td>   
  15.         <td><form:input path="firstname" /></td>   
  16.     </tr>   
  17.     <tr>   
  18.         <td><form:label path="lastname"><spring:message code="label.lastname"/></form:label></td>   
  19.         <td><form:input path="lastname" /></td>   
  20.     </tr>   
  21.     <tr>   
  22.         <td><form:label path="lastname"><spring:message code="label.email"/></form:label></td>   
  23.         <td><form:input path="email" /></td>   
  24.     </tr>   
  25.     <tr>   
  26.         <td><form:label path="lastname"><spring:message code="label.telephone"/></form:label></td>   
  27.         <td><form:input path="telephone" /></td>   
  28.     </tr>   
  29.     <tr>   
  30.         <td colspan="2">   
  31.             <input type="submit" value="<spring:message code="label.addcontact"/>"/>   
  32.         </td>   
  33.     </tr>   
  34. </table>     
  35.       
  36. </form:form>   
  37. </body>   
  38. </html>  



위의 JSP에서 리소스 파일 에서 메세지를 읽어오기 위해 <spring:message> 태그를 사용했다는 것을 기억하시기 바랍니다.

header.jsp
파일에서 우리가 기억해야 것은, 언어 선택을 위해 2개의 링크를 적어 줬다는 것입니다.
유저가 링크를 클릭 했을때, request 파라메터를 lang?=  설정해 주게 됩니다. 스프링에서는 파라메터를 LocaleChangeInterceptor  이용해서 가로채고, 적절한 지역 세팅으로 바꾸어 줍니다. 우리가 LocaleChangeInterceptor 클래스를 spring-servlet.xml 파일에 설정 , "param-name" 프로퍼티에 대해서 "lang" 이라는 값을 설정해 주었다는 것을 기억하시기 바랍니다.

view plaincopy to clipboardprint?

  1. <property name="paramName" value="lang" />   


따라서 스프링은 "lang" 이라는 이름의 파라메터가 요청에 있는지 찾게 됩니다.

이제 준비 !

이제 국제화 & 현지화 기능 추가를 완료했습니다. Alt + Shift + X, R 단축키를 눌러 실행해 봅시다!


소스 코드 다운받기

 Spring3MVC-part5.zip


글을 마지막으로 스프링3 MVC 따라하기 번역을 마치도록 하겠습니다.
사실 뒤에 스프링3 하이버네이트 연동하기에 대한 글이 한개 있지만, 현재 제가 사용하는 환경이 ibatis 이기 때문에
제대로 살펴보지 못했습니다. 기회가 되면 후에 ibatis 연동하는 법에 대해서 글을 올리도록 하겠습니다.

감사합니다.

 

출처 - http://choija.com/212 

Posted by linuxism