앞서 /cop/bbs/selectBoardList.do로 데이터를 요청하는 것을 확인햇다.


마찬가지고 request mapping을 처리하는 자바 함수를 호출한다.

여기서는 파랑색으로 요점만 언급하도록 하겠다.




@Resource(name = "EgovBBSManageService")

private EgovBBSManageService bbsMngService;


@RequestMapping("/cop/bbs/selectBoardList.do")   

 public String selectBoardArticles(@ModelAttribute("searchVO") BoardVO boardVO, ModelMap model, HttpServletRequest request) throws Exception { p

    // 메인화면에서 넘어온 경우 메뉴 갱신을 위해 추가

request.getSession().setAttribute("menuNo","3000000");


    LoginVO user;

    if(EgovUserDetailsHelper.isAuthenticated()){

    user = (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser();

    }else{

    user = new LoginVO();

    user.setUniqId("anonymous");

    }


boardVO.setBbsId(boardVO.getBbsId());

boardVO.setBbsNm(boardVO.getBbsNm());


BoardMasterVO vo = new BoardMasterVO();


vo.setBbsId(boardVO.getBbsId());

vo.setUniqId(user.getUniqId());


BoardMasterVO master = bbsAttrbService.selectBBSMasterInf(vo);


//-------------------------------

// 방명록이면 방명록 URL로 forward

//-------------------------------

if (master.getBbsTyCode().equals("BBST04")) {

   return "forward:/cop/bbs/selectGuestList.do";

}

////-----------------------------


boardVO.setPageUnit(propertyService.getInt("pageUnit"));

boardVO.setPageSize(propertyService.getInt("pageSize"));


PaginationInfo paginationInfo = new PaginationInfo();


paginationInfo.setCurrentPageNo(boardVO.getPageIndex());

paginationInfo.setRecordCountPerPage(boardVO.getPageUnit());

paginationInfo.setPageSize(boardVO.getPageSize());


boardVO.setFirstIndex(paginationInfo.getFirstRecordIndex());

boardVO.setLastIndex(paginationInfo.getLastRecordIndex());

boardVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());


Map<String, Object> map = bbsMngService.selectBoardArticles(boardVO, vo.getBbsAttrbCode());

int totCnt = Integer.parseInt((String)map.get("resultCnt"));


paginationInfo.setTotalRecordCount(totCnt);


//-------------------------------

// 기본 BBS template 지정

//-------------------------------

if (master.getTmplatCours() == null || master.getTmplatCours().equals("")) {

   master.setTmplatCours("/css/egovframework/cop/bbs/egovBaseTemplate.css");

}

////-----------------------------


model.addAttribute("resultList", map.get("resultList"));

model.addAttribute("resultCnt", map.get("resultCnt"));

model.addAttribute("boardVO", boardVO);

model.addAttribute("brdMstrVO", master);

model.addAttribute("paginationInfo", paginationInfo);


return "cop/bbs/EgovNoticeList";

    }




Resource로 같은 이름의 bean을 인젝션을 받는다.

인젝션이란 Dependency Injection(DI)을 의미하는데 스프링의 주요 개념중 하나 이다. 


인젝션 받은 bbsMngService를 이용하여 bbsAttrbService.selectBBSMasterInf(vo) 를 이용하여 DB에서 데이터를 검색해서 master라는 개체에 데이터를 저장한다.


마찬가지로 Map<String, Object> map = bbsMngService.selectBoardArticles(boardVO, vo.getBbsAttrbCode()); 이부분도 DB를 콜하는 부분이다.


받은 데이터를 모델에 model.addAttribute("resultList", map.get("resultList")); 와 같이 추가 시켜줄수 있다.

 addAttribute는 어트리 뷰트에 해당이름으로 객체, 문자 등 object를 담을 수 있다.


모든 데이터를 담은 후 cop/bbs/EgovNoticeList 를 리턴한다.



cop/bbs/EgovNoticeList *.do 가 아니라 request mapping대상이 아니여서 view resolve를 통해 리턴하기로 되어 있다.


리턴시에 해당 리턴값앞에 prefix와 suffix를 붙혀 리턴하기로 되어 있다.


[그림 jsp  설정]


즉 위에 cop/bbs/EgovNoticeList는 


/WEB-INF/jsp/cop/bbs/EgovNoticeList.jsp 파일을 요청한다.



[그림 jsp 파일 폴더 구조]



이렇게 jsp파일이 요청 되고 해당 jsp를 통해 클라이언트로 페이지를 전달한다.


앞에 글에서는

menuNo = 3000000,

link = forward:/​cop/​bbs/​selectBoardList.do?bbsId=BBSMSTR_AAAAAAAAAAAA

위의 정보로 

/EgovPageLink.do의 URL를 요청까지 진행을 하였다.


EgovPageLink.do URL를 요청하면 spring에서 request mapping을 이용하여 요청  URL에 해당하는 요청을 처리한다.


서블릿 매핑에 의해 *.do 요청이 오면 spring에서 요청을 처리한다.


[그림 url 패턴 설정]



그럼 자바 파일의 Annotation으로 미리 설정한 URL 매핑을 받아줄 함수를 찾아 호출한다.

@RequestMapping에 value안의 값으로 요청 URL이 오면 함수를 호출한다.

함수는 movotoPage이며 파라미터로는 앞에 설정한 link(변수 linkPage), menuNo(변수 menuNo)로 값이 들어오게 된다.


[그림 JAVA Request Mapping된 파일]



위에 moveToPage함수를 실행하고 link의 값을 리턴한다. 아무런 문제가 없다면 들어온 link의 값을 그대로 반환한다.


[그림 - link의 디버깅모드로 inspect한 변수의 값]


위 그림에서는 link의 값이 forward:/cop/bbs/selectBoardList.do?bbsId=BBSMSTR_AAAAAAAAAAAA 인것을 확인 할 수 있다.


*.do인 것을 보니 다시 request mapping 된 자바 파일을 찾을 것이라고 예측 해볼 수 있다.


포탈 사이트에 페이지가 어떻게 구성되어 있는지 확인 해보기로 했다.


포탈 사이트의 메인 화면이다.

알림마당의 공지사항에 화면이 어떻게 구성되는지. 어떠한 순서로 불리게 되는지 알아보자.



[그림 - 포탈 메인화면]


사이트 소개, 민원광장 등 각 메뉴에 마우스를 위치시키면 같은 URL에 요청하는것을 볼수 있다.


개발자 도구를 이용하여 링크가 어떻게 걸려있는지 확인 해 보았다.


[그림 - 메뉴 A 링크 개발자 도구]


각각의 메뉴는 클릭시 goMenuPage라는 자바스크립트로 연결된다. 숫자는 메뉴의 번호를 의미한다.(DB 테이블 참고)



goMenuPage 자바스크립트의 소스는 아래와 같다.


function goMenuPage(menuNo){

        document.getElementById("menuNo").value=menuNo;

        document.getElementById("link").value="forward:"+getLastLink(menuNo);

        document.menuListForm.action = "/EgovPageLink.do";

        document.menuListForm.submit();

  } 



function getLastLink(menuNo){

        var tNode = new Array;

        for (var i = 0; i < document.menuListForm.tmp_menuNm.length; i++) {

            tNode[i] = document.menuListForm.tmp_menuNm[i].value;

            var nValue = tNode[i].split("|");

            //선택된 메뉴(menuNo)의 하위 메뉴중 첫번재 메뉴의 링크정보를 리턴한다.

            if (nValue[1]==menuNo) {

                if(nValue[5]!="dir" && nValue[5]!="" && nValue[5]!="/"){

                    //링크정보가 있으면 링크정보를 리턴한다.

                    return nValue[5];

                }else{

                    //링크정보가 없으면 하위 메뉴중 첫번째 메뉴의 링크정보를 리턴한다.

                    return getLastLink(nValue[0]);

                }

            }

        }

    }




코드 설명 

 : menuNo는 전달받은 숫자('100000') 의미

 : forward라는 문자열 뒤에 getLastLink에 menuNo를 만들어 이동할 URL를 만들어온다.


참고로 Hidden으로 아래와 같이 메뉴리스트가 숫겨져 있다.



[

<input type=​"hidden" name=​"tmp_menuNm" value=​"1010000|1000000|사이트 소개|/​|/​|/​EgovPageLink.do?link=main/​sample_menu/​EgovAboutSite|">​

<input type=​"hidden" name=​"tmp_menuNm" value=​"3010000|3000000|공지사항|/​|/​|/​cop/​bbs/​selectBoardList.do?bbsId=BBSMSTR_AAAAAAAAAAAA|">​

<input type=​"hidden" name=​"tmp_menuNm" value=​"1000000|0|사이트소개|/​|/​||">​

<input type=​"hidden" name=​"tmp_menuNm" value=​"0|0|root|/​|/​||">​

<input type=​"hidden" name=​"tmp_menuNm" value=​"2010000|2000000|민원신청|/​|/​|/​EgovPageLink.do?link=main/​sample_menu/​EgovServiceManage|">​

<input type=​"hidden" name=​"tmp_menuNm" value=​"4010000|4000000|FAQ|/​|/​|/​uss/​olh/​faq/​FaqListInqire.do|">​

<input type=​"hidden" name=​"tmp_menuNm" value=​"1020000|1000000|연혁|/​|/​|/​EgovPageLink.do?link=main/​sample_menu/​EgovAboutSite|">​

<input type=​"hidden" name=​"tmp_menuNm" value=​"3040000|3000000|자유게시판|/​|/​|/​cop/​bbs/​selectBoardList.do?bbsId=BBSMSTR_BBBBBBBBBBBB|">​

<input type=​"hidden" name=​"tmp_menuNm" value=​"2020000|2000000|민원결과확인|/​|/​|/​EgovPageLink.do?link=main/​sample_menu/​EgovServiceResult|">​

<input type=​"hidden" name=​"tmp_menuNm" value=​"2000000|0|민원광장|/​|/​||">​

<input type=​"hidden" name=​"tmp_menuNm" value=​"4020000|4000000|QnA|/​|/​|/​uss/​olh/​qna/​QnaListInqire.do|">​

<input type=​"hidden" name=​"tmp_menuNm" value=​"3000000|0|알림마당|/​|/​||">​

<input type=​"hidden" name=​"tmp_menuNm" value=​"4030000|4000000|설문조사|/​|/​|/​uss/​olp/​qnn/​EgovQustnrRespondInfoManageList.do|">​

<input type=​"hidden" name=​"tmp_menuNm" value=​"1030000|1000000|조직소개|/​|/​|/​EgovPageLink.do?link=main/​sample_menu/​EgovAboutSite|">​

<input type=​"hidden" name=​"tmp_menuNm" value=​"1040000|1000000|찾아오시는 길|/​|/​|/​EgovPageLink.do?link=main/​sample_menu/​EgovAboutSite|">​

<input type=​"hidden" name=​"tmp_menuNm" value=​"4000000|0|정보마당|/​|/​||">​

] 



이후 숨겨져있는 input tag menuNo와, link에 값을 변경 설정하고 form.action에 요청할 URL까지 설정하고 submit을 통해 해당 URL를 요청한다.


예를 들어 알림마당을 클릭하면

알림마당의 menuNo : 3000000으로 goMenuPage('goMenuPage') 자바스크립트가 호출되고

3000000 의 첫번째 하위 링크인 3010000(공지사항)의 값이 설정된다.


menuNo = 3000000,

link = forward:/​cop/​bbs/​selectBoardList.do?bbsId=BBSMSTR_AAAAAAAAAAAA

위의 정보로 


/EgovPageLink.do의 URL를 요청한다.

+ Recent posts