본문 바로가기

개발&컴퓨터/개발강좌

스프링 프레임워크 기본 강좌 (13) - 스프링MVC (AOP with XML)

반응형
스프링 프레임워크 기본 강좌 (13) - 스프링MVC (AOP with XML)

 

* AOP 를 적용하여 코딩한 예제입니다.

 

 

 

// NoticeController.java // 공지사항 리스트

package controllers.customer;

 

public class NoticeController implements Controller { // 스프링이 제공 (Controller)

 

    private NoticeDao noticeDao;

 

    public void setNoticeDao(NoticeDao noticeDao) { // setter

        this.noticeDao = noticeDao;

    }

 

    @Override

    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)

        throws Exception {

        String _page = request.getParameter("pg");

        String _field = request.getParameter("f");

        String _query = request.getParameter("q");

 

        int page = 1;

        String field = "TITLE";

        String query = "%%"

 

        if(_page == null && _page.equals(""))            page = Integer.parseInt(_page);

        if(_field == null && _field.equals(""))               field = _field;

        if(_query == null && _query.equals(""))          query = _query;

 

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

        ModelAndView mv = new ModelAndView("notice.jsp");

        mv.addObject("listData", list);

 

        return mv;

    }

}

 

 

실행 호출 : notice.tst?pg={param.pg}&f={param.f}&q={param.q}

실행 결과 : 공지사항 리스트 정보 (listData)

 

- 코드 설명 -

 * NoticeDao 클래스 인스턴스를 별도로 생성. (기존 예제에서는 handleRequest 함수 이내에서 처리함)
 * Setter 함수도 생성.

 * 이전의 고전적인 JSP 방식에서는 DB처리를 위한 noticeDao 클래스를 만들어 그 인스턴스 객체를 사용하여 작업하였지만, 여전히, 객체를 생성, 호출하는 부분이 분리되지 않음. 매번 만들어야 함. 또한 함수 내에 있는 NoticeDao는 빈(Bean) 객체로 생성할 수도 없고, XML에서 접근 불가. XML을 활용하면 noticeDao의 생성과 초기화, 디펜던시 등을 분리하여 관리할 수 있음. DB등의 정보가 변경되어도 XML파일만 수정.

 

// NoticeDetailController.java // 공지사항 상세 내용

package controllers.customer;

 

public class NoticeDetailController implements Controller { // 스프링이 제공 (Controller)

 

    private NoticeDao noticeDao;

 

    public void setNoticeDao(NoticeDao noticeDao) { // setter

        this.noticeDao = noticeDao;

    }

 

    @Override

    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)

        throws Exception {

 

        String seq = request.getParameter("seq");

        Notice notice = noticeDao.getNotice(seq);

 

        ModelAndView mv = new ModelAndView("noticeDetail.jsp");

        mv.addObject("noticeData", notice);

 

        return mv;

    }

}

 

 

실행 호출 : noticeDetail.tst?pg={param.pg}&f={param.f}&q={param.q}

실행 결과 : noticeData 객체를 페이지에 전달하여 적절한 내용을 출력함.

 

 

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

<bean name="noticeDao" class="dao.NoticeDao">

 

// 빈 객체 생성하고 값(레퍼런스)를 주입.

// setNoticeDao() 호출을 통한 값(레퍼런스) 배정 (value or ref )

<bean name="customer/notice.tst" class="controllers.customer.NoticeController">

    <property name="noticeDao" ref="noticeDao"></property>

</bean>

 

<bean name="customer/noticeDetail.tst" class="controllers.customer.NoticeDetailController">

    <property name="noticeDao" ref="noticeDao"></property>

</bean>

 

 * XML에서 noticeDao 객체를 각 빈(Bean) noticeController와 NoticeDetailController에 생성하고, 주입.

 

 

// noticeDetail.jsp // 공지사항 상세 정보 표시 페이지

<div id=notice-article-detail">

    <dl class="article-detail-row">

        <dt class="article-detail-title">제목</dt>

        <dd class="article-detail-data">

            ${notice.title}

        </dd>

    </dl>  

 <dl class="article-detail-row">

        <dt class="article-detail-title">작성일</dt>

        <dd class="article-detail-data">

            ${notice.regDate}

        </dd>

    </dl>  

   

</div>

 

 

 

 

이러한 AOP 구현에 있어서 XML 방식의 문제점.
 * XML에 URL 수만큼 Bean객체를 생성하여 객체 값을 설정 해야하는 어려움이 있음.

 * 문제가 되는 이유는 Controller 클래스에는 URL에 매핑되는 오버라이드(Override)된 handleRequest 함수가 하나씩만 배정되어 있음.
 * URL에 반응하는 Controller가 함수 하나 하나마다 매번 캡슐(java 페이지) 생성해야 하므로, 코드 작성의 어려움이 있음. 즉 소스 페이지(JSP, XML, JAVA 등)가 여러 곳에 산재하게 됨. -> 웹 서비스 규모에 따른 너무 많은 개체 수 관리.

 

 

해결 방법은?
 * 만약 URL을 처리할 수 있는 함수가 하나의 캡슐(Controller)에 여러 개의 매핑 메서드(Method)로 담을 수 있다면?

 

 * 즉 클래스(컨트롤러) 하나에 여러개의 URL-메서드 매핑(Mapping)이 가능하다면??

 

-> 애노테이션! (Annotation)
어노테이션이라고도 발음하시는 분들도 있습니다.

굳이 미국식 발음으로 하자면.. 애너테이션 이라고 하는게 좀 더 정확하겠네요. 갑자기 발음은 왜.. ㅎㅎㅎ)

 

애노테이션은 다음 강좌에서~

 

 

 

 

 

반응형