728x90
반응형
초보도 쉽게배우는 전자정부프레임워크
 
 오랜만에 전자정부프레임워크 포스팅을 합니다. 몇일전 윈도우도 다시깔고, 다른 프로젝트로 옮기느라 시간을 많이 못 내었네요. 새로운 프로젝트에 와보니 주변에 공부하는 사람이 있는게 얼마나 큰 도움이 되는지 절실히 느낍니다. 혼자서 하는 공부는 정말 어렵고 힘든일이 아닌가 생각해보며 어서 빨리 공부하는 문화가 퍼졌으면 좋겠습니다.
 

- 5편 : Controller, Service, DAO

지난주에 이어

3편에 index.jsp에서 /sample/egovSampleList.do 요청을 하였습니다.

그리고 .do 요청은 web.xml에서 dispatcher-servlet이 처리하도록 설정하였습니다.

​그리고 스프링MVC 처리과정을 보았습니다.

 

HandlerMapping이 요청 URL에 해당하는 컨트롤러를 알려줍니다.

1. 웹브라우저에서 발생한  /sample/egovSampleList.do이 DispatcherSevlet에 전달됩니다.

2~3. HandlerMapping에게 /sample/egovSampleList.do 에 해당하는 컨트롤러를 요청하고 
  
DefaultAnnotationHandlerMapping은 @RequestMapping어노테이션을 이용하여 컨트롤러를 알려줍니다.

자세한 내용은 이전 포스팅을 참고하세요!
http://blog.naver.com/bboy12/10188480056

이제 컨트롤러가 ModelAndView를 리턴하는 과정을 살펴보겠습니다.  

 

EgovSampleController 살펴보기

위에 MVC 처리과정은 모두 전자정부프레임워크에 설정되어있습니다. 개발자가 실제로 코딩하는 부분은 바로 컨트롤러부터 입니다.

​sampleProject/src/main/java/egovframework/example/sample/web 폴더에 EgovSampleController.java를 오픈합니다.

코드를 살펴보겠습니다.​

     @RequestMapping(value="/sample/egovSampleList.do")
    public String selectSampleList(@ModelAttribute("searchVO") SampleDefaultVO searchVO,
      ModelMap model)
            throws Exception {
     
     /** EgovPropertyService.sample */
     searchVO.setPageUnit(propertiesService.getInt("pageUnit"));
     searchVO.setPageSize(propertiesService.getInt("pageSize"));
     
     /** pageing setting */
     PaginationInfo paginationInfo = new PaginationInfo();
     paginationInfo.setCurrentPageNo(searchVO.getPageIndex());
     paginationInfo.setRecordCountPerPage(searchVO.getPageUnit());
     paginationInfo.setPageSize(searchVO.getPageSize());
  
     searchVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
     searchVO.setLastIndex(paginationInfo.getLastRecordIndex());
     searchVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
  
     List sampleList = sampleService.selectSampleList(searchVO);
     model.addAttribute("resultList", sampleList);
        
     int totCnt = sampleService.selectSampleListTotCnt(searchVO);
     paginationInfo.setTotalRecordCount(totCnt);
     model.addAttribute("paginationInfo", paginationInfo);
        
     return "/sample/egovSampleList";
    }

 

​상단에 RequestMapping 어노테이션이 있습니다. 앞에서 살펴본 것처럼 @RequestMapping은 컨트롤러가 처리할 요청 URL을 명시하는데 사용됩니다.

 @RequestMapping(value="/sample/egovSampleList.do")

 

​메소드내의 코드를 보면 가장 먼저 페이징 처리를 위한 작업을 합니다. (이부분은 다음 포스팅에서 살펴보겠습니다.)

 ​/** EgovPropertyService.sample */
searchVO.setPageUnit(propertiesService.getInt("pageUnit"));
searchVO.setPageSize(propertiesService.getInt("pageSize"));

/** pageing setting */
PaginationInfo paginationInfo = new PaginationInfo();
paginationInfo.setCurrentPageNo(searchVO.getPageIndex());
paginationInfo.setRecordCountPerPage(searchVO.getPageUnit());
paginationInfo.setPageSize(searchVO.getPageSize());

searchVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
searchVO.setLastIndex(paginationInfo.getLastRecordIndex());
searchVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());

 

​sampleService.selectSampleList() 를 호출하여 처리를 요청합니다. 파라미터로는 searchVO를 넘겨줍니다.

VO에 대한 자세한 설명은 다음 포스팅에서 하도록 하겠습니다.​

 List sampleList = sampleService.selectSampleList(searchVO);

 

Controller - Service - Dao 구조는 많이 보셨을 겁니다.

Controller는 요청을 받고 처리된 결과를 ModelAndView로 넘겨주는 역할을 합니다.

프로젝트를 다니다보면 불필요한 업무로직까지 Controller에 작성되어 있는 경우가 많습니다.

업무로직은 반드시 Service에 정의해야 합니다.​

EgovSampleService 살펴보기

sampleProject/src/main/java/egovframework/example/sample/service 경로에 EgovSampleService.java를 열어봅시다.

service는 다음과 같이 인터페이스로 작성되어있습니다.

 public interface EgovSampleService {
 
 /**
  * 글을 등록한다.
  * @param vo - 등록할 정보가 담긴 SampleVO
  * @return 등록 결과
  * @exception Exception
  */
    String insertSample(SampleVO vo) throws Exception;

...

 

​service에 대한 구현은

sampleProject/src/main/java/egovframework/example/sample/service/impl 경로의 ​EgovSampleServiceImpl.java에 작성합니다.

 @Service("sampleService")
public class EgovSampleServiceImpl extends AbstractServiceImpl implements
        EgovSampleService {
 
    /** SampleDAO */
    @Resource(name="sampleDAO")
    private SampleDAO sampleDAO;
   
    /** ID Generation */
    @Resource(name="egovIdGnrService")   
    private EgovIdGnrService egovIdGnrService;

    /**
  * 글 목록을 조회한다.
  * @param searchVO - 조회할 정보가 담긴 VO
  * @return 글 목록
  * @exception Exception
  */
    public List selectSampleList(SampleDefaultVO searchVO) throws Exception {
        return sampleDAO.selectSampleList(searchVO);
    }

 

​ServiceImpl에서는 sampleDAO.selectSampleList()를 호출합니다. 단순 조회이기 때문에 별다른 업무로직이 없이 DAO를 호출합니다.

    public List selectSampleList(SampleDefaultVO searchVO) throws Exception {
        return sampleDAO.selectSampleList(searchVO);
    }

​sampleDAO를 살펴보도록 하죠.

sampleDAO를 클릭하여 커서를 위치하고 F3을 누릅니다.​

public List selectSampleList(SampleDefaultVO searchVO) throws Exception {
    return sampleDAO.selectSampleList(searchVO);
}

 

상단에 DAO선언부로 이동합니다. 마찬가지로 앞에 SampleDAO를 클릭하여 커서를 위치하고 F3을 누르면 SampleDAO.java파일이 자동으로 오픈됩니다.

 

     @Resource(name="sampleDAO")
    private SampleDAO sampleDAO;

 

 

SampleDAO 살펴보기

​DAO는 Data Access Object의 약자로 데이터베이스에 접근하기 위한 역할을 수행합니다.

​SampleDAO는 EgovAbstractDAO를 상속받았습니다. EgovAbstractDAO는 CRUD와 관련한 대표적인 method를 간단하게 호출할 수 있도록 제공합니다.

@Repository("sampleDAO")
public class SampleDAO extends EgovAbstractDAO {
    public List selectSampleList(SampleDefaultVO searchVO) throws Exception {
        return list("sampleDAO.selectSampleList_D", searchVO);
    }

}

 

​list메소드를 호출합니다. 파라미터로 SQL mapping을 위한 쿼리ID와 검색조건을 세팅할 파라미터 객체를 전달하여 쿼리ID에 해당하는 쿼리를 실행하여 처리된 결과를 리턴합니다.

EgovSample_Sample_SQL.xml 살펴보기

​sampleProject/src/main/resources/egovframework/sqlmap/example/sample 경로의 EgovSample_Sample_SQL.xml파일을 오픈합니다.

​ctrl+F(찾기)를 누른뒤 "sampleDAO.selectSampleList_D"를 검색합니다.

  <select id="sampleDAO.selectSampleList_D" parameterClass="searchVO" resultClass="egovMap">

    SELECT ID, NAME, DESCRIPTION, USE_YN, REG_USER
    FROM SAMPLE
    WHERE 1=1
    <isEqual prepend="AND" property="searchCondition" compareValue="0">
        ID = #searchKeyword#
    </isEqual>
    <isEqual prepend="AND" property="searchCondition" compareValue="1">
        NAME LIKE '%' || #searchKeyword# || '%'
    </isEqual>
 </select>

 

<isEqual>은 iBatis문법으로 searchCondition값이 0인 경우 아래 쿼리가 수행됩니다. 처음에는 파라미터로 넘어온 값이 없으므로 다음 쿼리만 실행이 되겠습니다.

SELECT ID, NAME, DESCRIPTION, USE_YN, REG_USER
FROM SAMPLE
WHERE 1=1

 

 

마무리

이번 포스팅에서는 컨트롤러에서 서비스, DAO를 거쳐 쿼리가 실행되는 과정을 보았습니다. 실행된 쿼리로부터 결과값을 넘겨받아 뷰로 전달되는 과정을 다음 포스팅에 살펴보도록 하겠습니다.

728x90
반응형
블로그 이미지

nineDeveloper

안녕하세요 현직 개발자 입니다 ~ 빠르게 변화하는 세상에 뒤쳐지지 않도록 우리모두 열심히 공부합시다 ~! 개발공부는 넘나 재미있는 것~!

,