반응형
Spring MVC Annotation
From JCFWiKi
Copyright © 2008 Daewoo Information Systems Co., Ltd. |
목차[숨기기] |
[편집 ] Spring MVC Annotation
- Spring Web MVC Framework는 Java 5+ 부터 annotation을 제공한다. annotation의 사용으로 설정파일을 간결화하고, View 페이지와 객체 또는 메소드의 맵핑을 명확하게 할 수 있다.
[편집 ] @Controller
- Controller annotation으로 Controller interface 및 class의 기능을 간단하게 사용할 수 있다.
- Annotation을 사용하지 않고, Controller를 직접 상속받아 쓰는 경우 필요한 xml 설정을 생략할 수 있다.
- SimpleFormController, MultiActionController 등 Controller의 종류를 명시하지 않고 @Controller 설정만으로 사용할 수 있다.
- xxx-servlet.xml 파일에서 component-scan 으로 web controller가 있는 패키지를 명시해 줌으로써, 별도의 bean 설정을 하지 않아도 @Controller로 등록된 클래스 파일에 대한 bean을 자동으로 생성해준다.
- Controller로 사용하고자 하는 클래스에 @Controller 지정해주면 component-scan으로 자동 등록된다.
<!-- blog-servlet.xml --> <context:component-scan base-package="blog.web" />
/* BlogController.java */ package blog.web; /* 기타 package import .. */ import org.springframework.stereotype.Controller; @Controller public class BlogController { }
[편집 ] @RequestMapping
- RequestMapping annotation은 url을 클래스 또는 메소드와 맵핑시켜주는 역할을 한다.
- Annotation을 쓰지 않을때 지정했던 Controller 등록을 위한 url bean 설정을 생략할 수 있다.
- class에 하나의 url 맵핑을 할 경우, 클래스 위에 @RequestMapping("/url")을 지정하며, GET 또는 POST 방식 등의 옵션을 줄 수 있다.
- 해당되는 메소드가 실행된 후, return 페이지가 따로 정의되어 있지 않으면 @RequestMapping("/url")에서 설정된 url로 다시 돌아간다.
/* 중간생략 */ @Controller @RequestMapping("/helloWorld") public class helloController { /* 중간생략 */ @RequestMapping(method=RequestMethod.GET) public returntype getController() { /* .... */ } @RequestMapping(method=RequestMethod.POST) public returntype postController() { /* .... */ } /* 중간생략 */ }
- 메소드별로 url 맵핑을 할 경우는 메소드 위에 @RequestMapping("/url")로 지정한다.
- return 페이지가 지정되지 않은 경우 원래의 맵핑되었던 url로 돌아간다.
- return type을 String으로 하여 redirect:url또는 forward:url을 사용하여 다른 페이지로 넘길 수 있다.
/* BlogController.java */ package blog.web; /* 중간생략 */ @Controller public class BlogController { /* 중간생략 */ @RequestMapping("/createBlog") public ModelMap createBlogHandler() { blog = new Blog(); return new ModelMap(blog); } /* 중간생략 */ }
[편집 ] @RequestParam
- RequestParam annotation은 key=value 형태로 화면에서 넘어오는 파라미터를 맵핑된 메소드의 파라미터로 지정해준다.
- 주로 get 방식으로 들어오는 request에서 사용한다.
- 아래 예제코드에서 xxx/editBlog.do?blogId=3 과 같이 접근할 때, editBlogHandler 메소드의 파라미터인 blogId에는 3이 셋팅된다.
- 필수 요건이 아닐 경우, @RequestParam(value="id", required="false")와 같이 옵션을 주고 사용할 수 있다.
/* BlogController.java */ package blog.web; /* 중간생략 */ @Controller public class BlogController { /* 중간생략 */ @RequestMapping("/editBlog") public ModelMap editBlogHandler(@RequestParam("blogId") int blogId) { blog = blogService.findBlog(blogId); return new ModelMap(blog); } /* 중간생략 */ }
[편집 ] @ModelAttribute
- ModelAttribute annotation은 화면의 form 속성으로 넘어온 model을 맵핑된 메소드의 파라미터로 지정해주는 역할을 한다.
- 주로 POST 타입으로 넘어오는 form 속성의 model 값을 받아올 때 사용된다.
/* BlogController.java */ package blog.web; /* 중간생략 */ @Controller public class BlogController { /* 중간생략 */ @RequestMapping("/updateBlog") public String updateBlogHandler(@ModelAttribute("blog") Blog blog) { blogService.updateBlog(blog); return "redirect:findBlogs.do"; } /* 중간생략 */ }
[편집 ] @SessionAttributes
- SessionAttributes annotation은 세션상에서 model의 정보를 유지하고 싶을 경우 사용할 수 있다.
/* BlogController.java */ package blog.web; /* 중간생략 */ @Controller @SessionAttributes("blog") public class BlogController { /* 중간생략 */ @RequestMapping("/createBlog") public ModelMap createBlogHandler() { blog = new Blog(); blog.setRegDate(new Date()); return new ModelMap(blog); } /* 중간생략 */ }
[편집 ] @InitBinder
@InitBinder annotation은 WebDataBinder를 초기화하는 메소드를 지정할 수 있는 설정을 제공한다. 일반적으로 WebDataBinder는 annotated handler 메소드의 command와 form 객체 인자를 조작하는데 사용된다. Initbinder 메소드는 command/form 객체와 validation result 객체와 대응하는 것을 제외하고 RequestMapping을 지원하는 모든 인자를 지원한다. Initbinder 메소드가 필수적으로 반환값을 가질 필요는 없으며, 일반적으로 이런 경우에 void를 선언한다. 특별한 인자는 WebDataBinder와 WebRequest 또는 Locale의 조합으로 이루어지며, 이러한 조건이 만족되면 context-specific editors를 등록하는 것이 허용된다.
- WebDataBinder : WebDataBinder는 web request parameter를 JavaBean 객체에 바인딩하는 특정한 DataBinder이다. WebDataBinder는 웹 환경이 필요하지만, Servlet API에 의존적이지 않다. Servlet API에 의존적인 ServletRequestDataBinder와 같이 특정한 DataBinder를 위한 더 많은 base classs를 제공한다.
- RequestMapping : RequestMapping annotation은 web request를 특정한 handler class와/나 handler method에 매핑하는 역할을 수행한다. 대응하는 HandlerMapping (for type level annotations)과/이나 HandlerAdapter (for method level annotations)가 dispatcher에 존재한다면, @RequestMapping이 처리될 것이다.
- WebRequest : WebRequest는 웹 요청에 대한 Generic interface이다. 주로 일반 request metadata에 generic web request interceptors의 접근을 허용하여 metadata에 대한 처리를 하기 위한 것이지 request 자체를 처리하기 위한 것은 아니다.
- @InitBinder 예제
다음의 InitBinder는 Request에 포함된 JSON 데이터를 binding하여 처리하는 역할을 수행한다.
...... @InitBinder protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception { if (logger.isDebugEnabled()) { logger.debug("entering 'initBinder' method..."); } JsonWriterConfiguratorTemplateRegistry registry = JsonWriterConfiguratorTemplateRegistry.load(request); registry.registerConfiguratorTemplate(new JsonlibJsonWriterConfiguratorTemplate() { @Override public JsonConfig getJsonConfig() { JsonConfig config = new JsonConfig(); // Exclude all date properties config.setJsonPropertyFilter(new PropertyFilter() { public boolean apply(Object source, String name, Object value) { if (value != null && Date.class.isAssignableFrom(value.getClass())) { return true; } return false; } }); return config; } }); } ......
[편집 ] Spring MVC Annotation의 장점과 단점
[편집 ] 장점
- XML 설정파일에 대한 설정을 최소화할 수 있다.
- 설정방법이 단순하다.
- 관리해야 하는 XML 설정파일의 개수가 감소한다.
- 대상 클래스에서 Auto Completion을 통한 구현이 가능하다.
- 개발자가 설정되는 대상 클래스와 메소드에 대한 정확한 이해(매핑, 파라미터, 모델, 폼 등) 후 적용하므로 유지보수 및 관리가 용이해 진다.
- 개발자적 입장에서 보았을 때, 보기 명확하며 편안하다.
[편집 ] 단점
- Java1.5 이상의 환경에서 지원된다.
- XML 설정파일에서 제공되는 다양한 property 설정이 불가능하다.
- Annotation의 적절한 사용을 위한 진입장벽이 발생한다. (Learning Curve: 일정 기간의 학습이 필요함)
- Annotation의 내부 구조 이해가 어렵다.
- 현재까지 Annotation 사용을 위한 Reference가 부족하다.
[편집 ] Spring MVC Blog 예제 다운로드
- SpringMVC + springframework + Hibernate3으로 이루어진 예제이다.
- Spring MVC Blog 예제 다운로드
- 데이터베이스는 hsql을 사용하였다. 예제를 실행시키기 전에 data 폴더안의 server.bat 파일을 먼저 실행시켜 데이터베이스를 띄워야한다.
|
[편집 ] 참고자료
출처 : http://wiki.dev.daewoobrenic.co.kr/mediawiki/index.php/Spring_MVC_Annotation