본문 바로가기
IT만들기/전자정부프레임워크

전자정부 프레임워크 구조 샘플 프로젝트 구조(Controller)(3)

by 커피향처럼 2017. 7. 10.

오랜만에 지난 번 샘플 HelloWorld 프로젝트 생성에 이어 포스팅을 씁니다. 
Controller, Vo, Service, Dao, sqlmap를 모두 설명할려면 포스팅이 너무 길어지기 때문에 컨트롤러부터 설명하고 연재로 포스팅할 계획입니다. 

샘플 프로젝트의 구조에 대해서 알아보도록 할께요.

지난 번에 생성한 샘플 프로젝트 서버를 가동하도록 합니다.

Servers에서 [시작]버튼을 누르거나 Ctrl+Alt+R 키를 눌려 시작합니다.

웹브라우저에서 "http://localhost:8080/HelloWorld"를 입력하여 화면을 띄워봅니다. 다음과 같이 기본 게시판 화면이 뜨는군요.
우리는 상세 ../HelloWorld만 입력했고 상세 URL(http://localhost:8080/HelloWorld/egovSampleList.do)을 입력하지 않았는데 화면이 출력됩니다.

프로젝트에서 "HelloWorld > src > main > webapp > WEB-INF > web.xml" 파일을 열어서 보면 "welcome-file-list"이라는 부분이 있습니다.
"/" 접근하게 되면 "index.jsp"을 열도록 설정된 부분입니다.

 <welcome-file-list>
     <welcome-file>index.jsp</welcome-file>
 </welcome-file-list>

"HelloWorld > src > main > webapp > index.jsp" 파일을 열어보면 "<jsp:forward page="/egovSampleList.do"/>" 이렇게 작성되어 있습니다.
"HelloWorld/egovSampleList.do"로 포워드 하도록 작성되어 있습니다.
"http://localhost:8080/HelloWorld/index.jsp"를 입력보면 "http://localhost:8080/HelloWorld"과 동일한 화면이 출력되는 것을 확인 할 수 있습니다.

WEB-INF 디렉토리는 클라이언트에서 접근이 불가능한 디렉토리입니다.
어떤 WAS를 사용하던지 정해진 규약이기 때문에 클라이언트에서 접근 할 수 없는 디렉토리입니다. 
"webapp" 디렉토리는 서비스하는 웹의 기본 루트 디렉토리입니다.
"webapp/css/index.jsp"와 같이 css 디렉토리에 index.jsp를 복사해 넣고 "http://localhost:8080/HelloWorld/css/index.jsp"로 접근해 보면 화면이 열리는 것을 확인 할 수 있습니다.
이번에는 webapp/WEB-INF/index.jsp로 index.jsp를 복사해 넣고 "http://localhost:8080/HelloWorld/WEB-INF/index.jsp"로 접근해보겠습니다.
에러 페이지가 설정되어 있다면 404오류 페이지가 아니라 다른 설정한 화면이 보이겠죠?

2017/07/10 - [IT만들기/Java] - jsp 에러페이지 만들기

본론으로 돌아와서 "egovSampleList.do"는 어디에 설정 되어 있는 것일까요?
이클립스에서 "Search > File" 메뉴를 클릭하고 "Containing text"에 "egovSampleLIst", "File name patterns"에 "*.java"를 입력하고 "Search" 버튼을 누릅니다.

 

그럼 다음과 같이 "Search" 창에 "EgovSampleController.java"에 @RequestMapping(value = "/egovSampleList.do") 부분이 검색됩니다. 이 부분을 더블 클릭하면 찾은 파일이 열립니다.

EgovSampleController.java 파일의 목록 관련된 부분을 보도록 할께요.
맨 위에 "@Controller" 어노테이션(Annotation)이 설정되어 있습니다. Spring가 기동되면 Controller 어노테이션이 설정된 class에서 "@RequestMapping"을 수집하여 메모리에 올려놓고 서비스 요청이 들어오면 해당 RequestMapping에 매핑된 메소드를 실행하게 됩니다. 소스에 간략한 설명을 달아 놓았으니 아래 소스 부분을 한번 보시기 바랍니다.
스프링이 자바에 RequestMapping 어노테이션만 있으면 모든 class에서 수집을 할까요?
그렇지 않습니다.
"HelloWorld/src/main/webapp/WEB-INF/config/egovframework/springmvc/dispatcher-servlet.xml 파일에 다음과 같이 설정되어 있습니다.
    <context:component-scan base-package="egovframework">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
    </context:component-scan>
"egovframework" 패키지에서 @Conponent 어노테이션은 수집하고 @Service, @Repository 어노테이션은 제외하라고 설정 되어 있습니다.
이렇게 되어 있기 때문에 컨트롤러 어노테이션의 리퀘스트 매핑 어노테이션을 수집하게 되는 것입니다.

@Controller
public class EgovSampleController { /** EgovSampleService */
 @Resource(name = "sampleService")
 private EgovSampleService sampleService;

 /** EgovPropertyService */
 @Resource(name = "propertiesService")
 protected EgovPropertyService propertiesService;

 /** Validator */
 @Resource(name = "beanValidator")
 protected DefaultBeanValidator beanValidator;

 /**
  * 글 목록을 조회한다. (pageing)
  * @param searchVO - 조회할 정보가 담긴 SampleDefaultVO
  * @param model
  * @return "egovSampleList"
  * @exception Exception
  */
 @RequestMapping(value = "/egovSampleList.do")
 public String selectSampleList(@ModelAttribute("searchVO") SampleDefaultVO searchVO, ModelMap model) throws Exception {

     /* *************************************** 
selectSmapleList 메소드에 @ModelAttribute("searchVO")이 있는데 요청받은 파라미터 값을 VO에 세팅하여 "searchVO"라는 오브젝트명으로 뷰(jsp 파일)로 다른 설정 없이도 전달하는 역활을 합니다.
jsp 파일에서는 JSTL 문법으로 ${searchVO.searchKeyword}로 받을수가 있습니다.(샘플 목록에서 검색 조건 input의 이름이 "searchKeyword"입니다)
또는 java 문법으로 다음과 같이 받으면 됩니다.
<%
SampleDefaultVO vo = (SampleDefaultVO)request.getAttribute("searchVO"); 
out.println( vo.getSearchKeyword() );
%>

이와 비슷하게 @RequestParam 이 있는데 이것은 파라미터를 1:1로 매핑해야 합니다.   
@RequestParam String name과 같이 말이죠. 만약 검색 조건을 받는 것이라면 검색 조건이 늘어날때마다 추가되어야 합니다. 다음과 같이 말이죠.
selectSampleList(@RequestParam String name, @RequestParam String address, ModelMap model) 
@RequestParam과 @ModelAttribute는 생략 하면 Object Type에 따라 RequestParam이나 ModelAttribute로 변환한다고 하지만 잘못 변환될 가능성을 배제하기 위해 붙여주는것이 좋다고 합니다.
     ***************************************** */  

      /** 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);
      /* ************************* 
        데이터를 조회하고 "resultList"라는 이름으로 jsp가 받을 수 있도록 세팅합니다.
      ************************** */

      int totCnt = sampleService.selectSampleListTotCnt(searchVO);
      paginationInfo.setTotalRecordCount(totCnt);
      model.addAttribute("paginationInfo", paginationInfo);

      return "sample/egovSampleList";
/* *******************
     스프링은 "sample/egovSampleLIst" 값을 받아서 egovSampleList.jsp 호출합니다.
     jsp는 was에서 java -> 서블릿 class로 변환하여 서비스 합니다. 
     뷰의 상세 설정은 "dispatcher-servlet.xml" 파일에 설정되어 있습니다.

     <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver" p:order="1"
     p:viewClass="org.springframework.web.servlet.view.JstlView"
     p:prefix="/WEB-INF/jsp/egovframework/example/" p:suffix=".jsp"/>

    최종적으로 "/WEB-INF/jsp/egovframework/example/"+"sample/egovSampleList"+".jsp"(suffix) 가 됩니다.

******************** */ 
 }

 

댓글