1. Controller
컨트롤러는 Dispatcher Servlet 에 의해 불리어지며 비즈니스 로직을 처리한다. 스프링은 다양한 컨트롤러 컴포넌트들을 포함한다. 스프링에서 모든 컨트롤러 컴포넌트는 org.springframework.web.servlet.mvc.Controller 인터페이스를 구현한 것이다. 다음은 스프링에서 활용가능한 컨트롤러 컴포넌트이다.
위 컨틀롤러에 대해서 상세하게 알아보기로 하자.
가. Abstract Controller
만약에 여러분들이 컨트롤 인터페이스를 구현하는것 대신에 어느 정도 기초하에서 커스텀 컨트롤러 컴포넌트를 구현하기를 원한다면
GET 과 POST 메소드를 지원하는 AbsrtactController 를 상속하여 구현 가능하다. 이 컨트롤러는 간단한 목적을
위해 사용되어야 한다. 예를 들자면 요청 패러미터를 검사할 필요없이 클라이언트에게 간단한 리소스를 리턴하는 경우이다.
MySimpleController.java
public void handleRequestInternal(HttpServletRequest request,
HttpServletResponse response){
return new ModelAndView("myView");
}
}
나. Abstract Command Controller
Command Controller 의 개념은 비즈니스 로직이 사용자가 제출한 값에 의존할때 중요해진다.
Request 패러미터 값과 세션 오브젝트 값들을 얻기위해 서블릿 API 에 의존하는 대신에 그러한 정보를 얻기 위해 Abstract Command Controller 에 의존할 수 있다. 예를들어 사용자의 존재 유무에 따라서 성공과 실패를 보여주는 아래 코드가 있다고 하자.
MySimpleController.java
MySimpleController.java
public class MySimpleController extends AbstractCommandController{ public MySimpleController(){ setCommandClass(UserInfo.class); } public void handle(HttpServletRequest request, HttpServletResponse response, Object command){ UserInfo userInfo = (UserInfo)command; if ( exists(userInfo.getUserName){ return new ModelAndView("success"); }else{ return new ModelAndView("failure"); } } private boolean exits(String username){ // Some logic here. } }
클라이언트에 의해 받게되는 username 필드에 대한 값은 UserInfo에서 username이라 불리는 프로퍼티와 직접
맵핑하게 된다.위 프로그램 소스의 컨스트럭쳐를 보면 setCommandClass() 메소드를 호출해서 클라이언트 요청
패러미터를 가지게 될 Command 클래스의 이름을 명시한것을 볼수 있다.Command Controller의 경우에는 DispatcherServlet 에 의해 불리게 될 메소드는 handle() 메소드이다.
이 메소드는 Request와 Response 오브젝트와 별개로 Command 오브젝트를 넘겨 받는다.
UserInfo.java
UserInfo.java
}
public class UserInfo{ private String username; // Getters and Setters here.
다. Simple Form Controller
이 컨트롤러는 다양한 정보를 포함하는 폼을 채우거나 서브미트하기 위한 목적으로 사용된다.
간단한 예를 들자면 클라이언트에게 empName,empAge
,empSalary 값을 보여주기 위한 요청 페이지로
empInfo 라 불리는 jsp 요청 페이지가 있다고 가정하고
만약 성공하면 클라이언트에게 empSuccess.jsp
페이지를 보여준다고 하자. 이러한 종류의 기능을 얻기 위해 Simple Form Controller 를 어떻게 이용하는지
살펴보자.
먼저 클라이언트 입력값들을 모으기 위해 getter와 setter가 포함된 commamd 오브젝트를 작성한다.
아래는 작성된 EmpInfo라 불리는 클래스의 스켈리톤 클래스이다.
EmpInfo.java
public class EmpInfo{ private String empName; private int empAge; private double empSalary; // Getters and setters for the above properties. }
다음으로 SimpleFormController를 상속한 클래스를 작성한다. 그러나 이번에는 doSubmitAction() 메소드
를 오버라이드한다.이것은 클라이언트가 폼을 서브미트할때 불리어질 메소드이다.
EmpFormController.java
public class EmpFormController extends SimpleFormController{ public EmpFormController(){ setCommandClass(EmpInfo.class); } public void doSubmitAction(Object command){ EmpInfo info = (EmpInfo)command; process(info); } private void process(EmpInfo info){ //Do some processing with this object. } }
클라이언트로부터 정보를 수집하는 폼은 empInfo.jsp이고 성공하면 empSuccess.jsp가 보여진다. 이 정보는
컨트롤러 클래스로부터 구체화 되고 아래 처럼 환경파일에서 유지된다.
<bean id = "empForm" class="EmpFormController"> <property name="formView"> <value>empInfo</value> </property> <property name="successView"> <value>empSuccess</value> </property> </bean>
위에서 보면 formView와 successView 라는 이름을 가진 2개 프로퍼티 명에 주목할 필요가 있다.
이러한 프로퍼티는 클라이언트에게 보여주게될 초기 뷰와 성공후 보여주게될 마지막 뷰를 나타낸다.
2.Model And View
Model And View(org.springframework.web.servlet.ModelAndView class 에서 제공) 는 컨트롤러
오브젝트에 의해 Dispatcher Servlet에게 리턴된다. 이 클래스는 모델과 뷰 정보를 가지고있는 클래스이다.
모델 오브젝트는 정보를 보여주는 View 에 의해 사용될 정보들을 제공한다. 이러한 오브젝트들은
Spring Framework에서 고도의 추상화로 제공 된다.
어떤 종류의 View 기술도 프레임워크에 쉽게 플러그인 될수 있다. 예를들자면 Excel, pdf, xslt,
Free maker, html, velocity 등 웹프레임워크를 지원한다.
모델 오프젝트(org.springframework.ui.ModelMap에서 제공)는 정보를 저장하기 위해 내부적으로 Map
으로 유지된다.
다음은 Model 과 View 오브젝트를 만들기 위한 방법이다.
View pdfView = ? Map modelData = new HashMap(); ModelAndView mv1 = new ModelAndView(pdfView, modelData);위 소스에서는 모델오브젝트와 실제 View 오브젝트를 변수로 받아서 ModelAndView 오브젝트가
생성된다.
ModelAndView mv1 = new ModelAndView("myView", someData);
위 예에서 "myView" 라는 스트링이 View 에게 넘겨진다. 이것은 논리적 뷰라 불리는 뷰를 명시하는
방법이다. 이것은 myView 가 myView.jsp, myView.pdf, myView.xml 중 어떤 것을 가리킬 수 있다는
것을 의미한다. 논리적 뷰와 일치되는 물리적 뷰의 위치는 환경 파일에서 설정된다.
3. View Resolver
위에서 논리적 뷰와 논리적 뷰에 대한 물리적 뷰 위치에 대해서만 얘기를 했다.
논리적 이름과 물리적 뷰 위치 사이의 맵핑은 View Resolver 오브젝트에 의해 다루어진다.
우리는 org.springframework.web.servlet.ViewResolver 인터페이스를 구현해서
커스텀 뷰 리졸버도 작성 가능하다.
다음은 스프링에서 제공하는 활용 가능한 리졸버이다.
BeanNameViewResolver FreeMarkerViewResolver InternalResourceViewResolver JasperReportsViewResolver ResourceBundleViewResolver UrlBasedViewResolver VelocityLayoutViewResolver VelocityViewResolver XmlViewResolver XsltViewResolver
우리는 가장 많이 사용되는 Internal Resource View Resolver 와 Bean Name View Resolver
에 대해서만 자세히 살펴볼것이다.
가. Internal Resource View Resolver
Internal Resource View Resolver 는 ModelAndView 오브젝트 형태로 컨트롤러 오브젝트에 의해
리턴될때 리소스의 논리적 이름과 물리적 위치를 맵핑한다. 다음은 서로다른 ModelAndView
오브젝트를 리턴하는 예제 소스이다.
MyController.java
public void handle(){
if(condition1()){
return new ModelAndView("myView1");
}else if (condition2()){
return new ModelAndView("myView2");
}
return new ModelAndView("myView3");
}
}
만약 클라이언트 요구가 조건 1을 만족했다고 가정하면 클라이언트 요청에 대해 myView1이 보여지게 될것이고
조건2나 나머지는 각각 myView2와 myView3를 보여줄것이다.
이것을 만족 시키기 위해서는 환경파일에 아래와 같이 설정되어져야 한다.
<bean id="viewResolver" class="org.springframework.web.servlet.view.
InternalResourceViewResolver">
<property name="prefix"><value>/WEB-INF/</value></property>
<property name="suffix"><value>.jsp</value></property>
</bean>
지금까지 Internal Resource View Resolver가 논리적 뷰 이름을 물리적 위치에 맵핑하는 방법을 얘기했다.
논리적 뷰 이름이 myView1일때 리졸버는 prefix+논리적뷰이름+suffix이름의 합으로 뷰 이름을 만들것이다.
즉 /WEB-INF/myView1.jsp가 될것이다. myView2와 myView3도 같은 방식으로 뷰 이름이 생성된다.
나. Bean Name View Resolver
Internal Resource View Resolver의 단점 중의 하나는 View 파일의 이름(jsp던 pdf던)이 웹 어플리케이션
컨텍스트에서 제공되어져야 한다는 것이다.다이내믹하게 만들어진 뷰 파일은 가능하지 않을 수 있다. 그런 경우에는
우리는 pdf나 엑셀 포맷으로 다이내믹하게 View 페이지를 만들기 위해 Bean Name View Resolver 를
사용해야 한다.
만약 ModelAndView 오브젝트가 아래 소스에서 보여지는 "pdf"이름의 뷰를 생성한다면 아래와 같다.
그리고 만약 우리가 pdf 파일의 뷰를 만들기를 원하면 환경 파일에 아래처럼 설정해야한다.
class="org.springframework.web.servlet.view.BeanNameViewResolver"/>
위 코드는 BeanNameViewResolver 를 사용하기 위해 환경파일을 설정한것이다. 논리적 이름 'pdf'가 빈 이름을
결정해야 하기 때문에 환경 파일에 아래처럼 정의 해야 한다.
아래 소스 코드의 MyPdfGenerator 는 pdf 파일을 생성하기 위한
org.springframework.web.servlet.view.document.AbstractPdfView 의 서브 클래스이다.
출처 - http://run4dream.tistory.com/entry/3Spring-MVC-%EA%B0%9C%EB%B0%9C%ED%95%98%EA%B8%B0
'Framework & Platform > Spring' 카테고리의 다른 글
Spring - @ModelAttribute (0) | 2012.05.21 |
---|---|
Spring - @RequestParam (0) | 2012.05.21 |
Spring - contextConfigLocation (0) | 2012.05.16 |
Spring - 기초 설정 - xml별 역할 (0) | 2012.05.16 |
Spring mvc에서 Quartz 적용하기 (1) | 2012.05.16 |