https://web.archive.org/web/20161130071308/http://www.xeschool.com/xe/xenote_module_book_contentlist

BOOK Module dispBookContentList

BOOK 모듈의 관리자 화면(back-end)에서 새로운 모듈(mid)을 생성하였다면, "Book 모듈 미리보기"와 같이 메뉴를 만들고 모듈(mid)을 연결하였을 것이다. 사용자는 모듈의 프론트 엔드에서 미리 설정된 기본 인덱스(index) 액션 이름을 모른다. 다만 메뉴에 연결된 링크를 클릭할 뿐이다.

XE코어는 사용자의 요청에 따라 링크로 연결될 모듈(mid)을 찾아본다. BOOK 모듈이다. 따라서 BOOK 모듈의 액션 명세서(module.xml)에서 프론트 엔드(front-end)의 기본 인덱스(index)로 설정된 dispBookcontentList 액션을 찾아 실행한다. 관리자 목록에서 "브라우저 제목"을 클릭해도 동일한 결과를 얻는다. 브라우저 제목은 {getUrl('','mid',$val->mid)} 와 같은 형태로 생성된 모듈(mid)의 모듈 아이디($mid) 값을 찾아 링크를 출발하기 때문이다.

https://web.archive.org/web/20161130071308im_/http:/www.xeschool.com/xenote_page/images/book_mvc_dispBookContentList.png

★ XE코어의 모듈 중에는 모듈(module)이라는 이름의 모듈이 있고 혼동하기 않기 위해 앞으로 module 이라고 표기한다.

module 모델(Model) 객체를 생성한다는 것은 모듈을 관리하고 있는 module의 도움이 필요하다는 뜻이고, module 모델(Model)에서 사용하고 있는 맴버 변수와 맴버 메소드(하는 일)를 상속 받는다는 의미이다. 즉 URL로 요청 받은 모듈(mid)의 모듈 아이디($mid) 값을 module 모델의 메소드로 확인해 보겠다는 뜻이다. module 모델은 다음과 같은 결과값을 되돌려 준다. 되돌려 주는 방식은 $module_info에 모두 담아 보내준다. $module_info 변수의 내용을 확인해 보자.

$module_infobook[mid] => book_example

module 모델에게 $mid를 힌트로 보여주었지만 module은 그것을 가지고 위와 같은 결과값을 얻는다. 모듈(mid)의 부모(module)는 누구이고, 그 자손 모듈(현재의 mid)의 고유 식별 번호($module_srl)는 무엇이라는 것을 알려주는 것이다.

결과적으로 모듈의 아이디(mid) 값을 알면 모듈의 고유 식별 번호($module_srl)를 알 수 있고 이 변수는 books 테이블에도 함께 저장해 두고 있다. 따라서 BOOK 모듈이 생성한 모듈(mid)이 입력해 둔 책들(books)의 목록을 찾는다는 것은 $module_srl의 값을 조건으로 books 테이블에 저장된 데이터를 확인해 보겠다는 것이고 dispBookContentList 함수는 그 결과값을 얻기 위해 MVC를 돌고 있는 것이다.

앞으로 이 모듈(웹 관련 도서)은 항상 같은 $module_srl를 가지고 다닌다. 책의 정보를 입력하면 books 테이블의 컬럼에도 매번 같은 $module_srl의 식별 번호를 저장할 것이다. 만약 새로운 모듈(mid)로 "교양도서"라고 생성하였다면 새로운 $module_srl이 생성되고 books 테이블의 컬럼에도 "교양도서"로 분류할 수 있는 같은 $module_srl의 데이터 row가 저장될 것이다.

1. 프론트 엔드 뷰(View)

프론트 엔드(front-end) 뷰(View)를 위한 설정 파일이다. 다음과 같이 작성하고 업로드 한다. 하는 일은 사용자 요청에 대한 결과를 출력할 스킨(skin) 파일을 찾아 두는 것이고, 모듈의 아이디(mid)를 이용해 $module_srl을 확인한다. 구해온 $module_srl은 항상 가지고 다닐 수 있도록 $module_info 변수에 세팅해 둔다. $module_info 변수는 모듈(mid)의 레이아웃이 무엇이지 메뉴는 어떤 것과 연결해서 사용하고 있는지 등의 모듈(mid)과 관련된 모든 정보를 확인하는 일이다.

book.view.php

모듈 명세서(module.xml)에서 <grants> 권한 설정으로 "목록"에 대해 "list"라는 name 속성을 설정했었다. "목록"은 템플릿에서 사용하는 언어일 뿐 중요한 키워드는 "list"라는 속성값이다. 관리자 권한 설정에서 list에 대해 "로그인 사용자" 등으로 권한을 제한하면 "guest"는 dispBookContentList() 메소드를 실행하지 못하고 중단 된다. 권한에 대한 안내 메시지는 같은 클래스 안의 맴버 메소드인 dispBookMessage() 메소드를 호출하면서 공통으로 설정되어 있는 권한 메시지 코드(msg_not_permitted)를 출력한다. 이후 입력과 삭제에서 추가되는 메소드에도 이와 같은 권한 설정을 확인하는 실행문이 포함된다. 이때 권한 설정을 확인하는 name 속성은 각각 모듈 명세서에 설정된 속성값에 따라 확인한다.

권한이 통과 되면 $module_srl을 확인하고 books 테이블에 접근하기 위해 자신(book)의 모델(Model)을 확장한다. 모델의 메소드(getBookContentList)를 호출하면서 요청인자 값으로 $module_srl을 함께 보내는 것이다. 즉 books 테이블에 가면 여러 줄(row)의 데이터가 있을 것인데 이때 조건으로 나의(mid) 모듈 식별 번호를 사용하라는 의미이다. 이렇게 받아온 결과값은 $output 변수에 대입해 둔다. 만약 결과값이 없다면 $output 변수가 배열이 아닐 수도 있을 것 같다. 따라서 일단 메소드 처리를 위해 빈 배열 형식이라도 변경해 둔다.

$output 값은 다차원 배열이다.(배열 확인은 보기(View)에서 한다...^^) 따라서 그 중에 실제로 책의 정보를 담고 있는 $output->data 값을 $book_list 라는 새로운 변수를 만들고 대입하여 URL에 세팅해서 보낸다. 목록 구성을 위해 필요한 $page_navigation 변수도 함께 세팅한다. 반환값을 처리하기 위한 사용자 스킨 파일은 "list"로 설정한다. 따라서 템플릿 파일의 경로를 찾아가 list.html 파일을 열고 $book_list 값을 넘겨 줄 것이다.

2. 모델(Model)

프론트 엔드 뷰(View) 파일에서 요청된 getBookContentList() 메소드를 실행한다. 모델은 데이터에 접근하기 위한 방법을 포함하는 MVC 패턴의 일부분이다. 메소드의 요청 인자($args)로 넘겨 받은 $module_srl을 가지고 XML 쿼리 문법으로 작성된 book 모듈.getBookContentList.xml 파일을 실행한다. 결과값은 $output 변수로 대입하여 반환한다.