Annotation을 이용한 방법
계속해서 다른 방식으로 만들고 있는 게시판 만들기를 Annotation을 이용한 각 함수 호출 방식으로 만들어봤다.
1 2 3 4 5 | @Retention(RetentionPolicy.RUNTIME) public @interface RequestMapping { public String value(); } | cs |
1 2 3 4 | @Retention(RetentionPolicy.RUNTIME) public @interface Control { } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | @Control public class CtrlBang { @RequestMapping("/list.do2") public ModelAndView list( HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("list"); return null; } @RequestMapping("/add2.do2") public ModelAndView add2( HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("add2"); return null; } @RequestMapping("/down.do2") public ModelAndView down( HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("down"); return null; } } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | public class Test525 extends HttpServlet{ @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println( this ); String uri = request.getRequestURI(); String ctxPath = request.getContextPath(); String uri2 = uri.substring( ctxPath.length() ); System.out.println( uri2 ); Map<String,Method> methodMap = new Hashtable<String,Method>(); Object obj = new CtrlBang(); try { Class<?> cls = Class.forName("orange.CtrlBang"); Control annot = cls.getAnnotation( Control.class ); System.out.println( annot ); if( annot != null ) { Method[] mtds = cls.getMethods(); for( Method mtd : mtds ) { RequestMapping annot2 = mtd.getAnnotation( RequestMapping.class ); if( annot2 != null ) { System.out.println( mtd ); System.out.println( annot2.value() ); methodMap.put( annot2.value(), mtd ); } } } } catch( Exception e ) {} Method mtd2 = methodMap.get( uri2 ); if( mtd2 != null ) { try { ModelAndView mnv = (ModelAndView) mtd2.invoke( obj, request, response ); } catch (Exception e) { e.printStackTrace(); } } } } | cs |
이렇게해서 Annotation과 연결된 함수를 호출하기 위한 Test525.java 파일을 구성했다. 어노테이션을 활용해서 이런 프로그래밍을 하면, 해당 어노테이션에 대한 전체적인 관리가 쉬워진다. 이용하는 class들을 목적에 따라 구분해서 한 class에 모아둘 수 있고, 일괄적인 조작이 가능해진다.
어제 만든 방식에 비해서 달라진 점은 우선 파일의 수가 확 줄어들게 된다. CtrlBang에 모든 class들이 모여졌고, web.xml 파일에 대한 업데이트가 필요없어지고, 다른 기능을 추가할 때 직접 web.xml/java파일의 호출부분을 손 댈 필요가 없어진다.