이러쿵저러쿵


14) AOP with Annotation(애노테이션)

 

* 애노테이션(Annotation) & 오토와이어링(Autowiring)

 

 - 하나의 컨트롤러(Controller)와 하나의 페이지를 매핑하는 것은 작업도 번거롭고, 관리도 힘듬.

   그렇다면 하나의 함수에 하나의 URL을 어떻게 매핑할것인가?

  -> 애노테이션(Annotation)을 사용하자!

 

 - 그럼 애노테이션은 무엇인가??

  -> 주석(Comments) 단순한 주석?

  -> 컴파일러를 거친 후에도 코드에 남아있는 특수한 주석!!

 

 애노테이션은 특수한 주석으로 자체적으로 어떠한 기능을 수행하는 것은 아니지만, 애노테이션이 가리키는 지시어(정보)를 기반으로 컴파일러는 애노테이션이 적용된 클래스 또는 매서드, 프로퍼트 등에 적절한 기능을 부여한다.

 

  -> 애노테이션은 @(골뱅이) 로 주석을 시작하며, 클래스, 매서드, 변수 등에 적용됨.

 

// dispatcher-servlet.xml (객체를 생성해주고, Injection해줌)

<context:component-scan base-package=“controller”></context:component-scan>

<bean name=“noticeDao” class=“dao.NoticeDao”> // Autowired 어노테이션을 통해서 자동 매핑됨.

 

// CustomerController.java

package controllers;

 

@Controller

@RequestMapper(“/customer/*”)

public class CustomerController {

 

    private NoticeDao noticeDao;

 

    @Autowired

    public void setNoticeDao(NoticeDao noticeDao) {

        this.noticeDao = noticeDao;

    }

 

    @RequestMapping(“notice.oz”)

    public String notices(String pg, String f, String q, Model model) throws ClassNotFoundException {

        int page = 1;

        String field = “TITLE”;

        String query = “%%”

 

        if(pg == null && pg.equals(“”))            page = Integer.parseInt(pg);

        if(f == null && f.equals(“”))                 field = _field;

        if(q == null && q.equals(“”))               query = _query;

 

        List<Notice> list = noticeDao.getNotices(page, field, query); // 페이지번호, 검색항목, 검색어

        mv.addObject(“listData”, list);

 

        return “notice.jsp“; // VIEW로 사용되는 페이지 문자열(String)

    }

 

    @RequestMapping(“noticeDetail.oz”) // 게시물 상세 내용 보기

    public String noticeDetail(String seq, Model model) throws ClassNotFoundException {

        Notice notice = noticeDao.getNotice(seq);

        model.addAttribute(“notice”, notice);

        return “noticeDetail.jsp“;
    }

 

    @RequestMapping(“noticeReg.oz”) // 게시물 등록

    public String noticeReg(Notice n /* String title, String content */) throws ClassNotFoundException {

       

        /* Notice n = new Notice();

        n.setTitle(title);

        n.setContent(content); */

        noticeDao.insert(n);

        return “redirect:notice.oz“;
    }

 

    @RequestMapping(“noticeEdit.oz”) // 게시물 수정

    public String noticeEdit(Notice n /* String title, String content */) throws ClassNotFoundException {

       

        /* Notice n = new Notice();

        n.setTitle(title);

        n.setContent(content); */

        noticeDao.update(n);       

        return “redirect:noticeDetail.oz?seq=“ + n.getSeq();
    }

}

 

 - 코드 설명 -

 

 * Context:component-scan : Controller 패키지에서 URL-메쏘드 매핑된 정보를 자동으로 검색(Auto-Scan)함. 단 Controller 애노테이션된 클래스에서 해당 메서드를 찾음. 위에서 /customer/notice.oz 서브 URL이 호출되면 notices 메서드가 수행됨.

(기존 XML 방식에서는 특정 페이지의 URL과 컨트롤러를 하나씩 배정했지만, context:component-scan을 통해서는 사용자로부터 URL이 입력된 경우 @Controller 애노테이션을 가지고 있는 클래스 내부의 RequestMapping 정보를 자동으로 스캔하여 처리 함수를 찾아 연결하여 줌.)

 

 * @RequestMapping – 표시된 URL에 해당 메서드를 매핑 (지정된 URL요청이 들어오면 해당 메서드를 실행함)


 * 그런데! XML을 사용하지 않으므로 URL-Controller 맵핑 정보(빈(Bean) 객체) 자체가 XML 파일에서 사라지게 되는데 이렇게 되면 빈(Bean) 객체를 생성하고, 프로퍼티(AOP관련 포함) 값을 세팅해줄 수가 없음.

 -> 이 문제는 @Autowired 애노테이션을 통해 해결! 

 -> component-scan을 사용하는 경우 빈(Bean)객체를 세팅하고 값을 할당해 줄 수 없지만, @Autowired를 사용하여 자동으로 객체와 변수를 연결 및 설정해 줌.

 * 메서드에서 반환하는 모델이 있다면 메서드 내에 파라메터 Model model을 선언만 해주면 됨. 해당 Model 객체가 생성되어 참조가 자동으로 됨.

[ 동일한 페이지를 다르게 처리 ]
@RequestMapping(value={“/customer/noticeReg.oz”}, method=RequestMethod.GET)
@RequestMapping(value={“/customer/noticeReg.oz”}, method=RequestMethod.POST)

 

[ 매핑된 컨트롤러의 함수가 처리하는 JSP페이지와는 다른 페이지로 결과를 넘길때 ]
return “redirect:notice.oz” // redirect 처리

 

 * Request로부터 넘어오는 인자는 1:1로 함수 매개변수로 대입 가능. 더 나아가 Request를 통해서 넘어오는 개별 어트리뷰트(Attribute) 인자의 이름(변수명)이 처리 함수의 매개 변수 레퍼런스 클래스의 인스턴스(속성 값)의 이름(변수 명)과 동일하다면 이를 자동으로 맵핑(대입)하여 줌.

 

저작자 표시 비영리 변경 금지
신고

Comment +0

티스토리 툴바