XpressEngine

[기초] XE구조의 비밀 그 세번째 - XE 실행 과정을 살펴보다...

이번에는 XE가 어떤과정을 거쳐 실행되는 지 알아보겠습니다.

XE는 다음과 같은 단계들을 거쳐 실행되게 됩니다.


Step 1. 요청단계 (Request)

프로그램이나 사용자는 http://도메인/index.php에 접속해 데이터를 요청합니다.

이 요청에 응답하기위해 XE는 다음단계들을 차례로 실행합니다.

→ 처리파일 : index.php


Step 2. 초기화단계 (Context Init)

XE실행을 하기위한 초기화 단계입니다. 이 단계에서 정의된 값으로 XE가 동작합니다.

다음과 같은 사항들로 초기화가 진행됩니다.

  • 요청 메소드 설정 (요청된 방식을 지정합니다. GET|POST|XMLRPC|JSON)
  • 요청 메소드에 따라 모든 요청값들(GET|POST|XMLRPC|JSON)을 정리하여 저장
  • DB 정보 불려오고 설정 (files/config/db.config.php의 DB정보 Load함)
  • 사이트 기본모듈설정
  • XE에서 사용할 언어를 설정하고, 해당 언어를 불려옴
  • 해당 세션에 로그인된 회원정보를 불려오고, 값을 저장 (is_logged : 로그인됬으면 true , logged_info : 로그인정보)
  • 자바스크립트에서 사용을 위한 URL값 저장 (current_url : 현재 URL , request_uri : 요청한 URL)

→ 처리파일 : classes/context/Context.class.php


Step 3. 모듈초기화단계 (ModuleHandler)

모듈실행을 위한 초기화 단계입니다.

다음과 같은 사항들로 초기화가 진행됩니다.

  • 요청값에서 모듈검색에 도움이 될 값들을 추출 (module,act,mid,document_srl,module_srl,entry)
  • XSS 공격방어를 위한 module,act,mid 값 체크 (체크시 이상이 있으면 XE실행 중단)
  • SSL 사용시 SSL 적용 act에서 적용이 되있지않으면 https:// 로 처리

→ 처리파일 : classes/module/ModuleHandler.class.php


* 트리거 호출 - moduleHandler.init (before)

* 애드온 호출 - called_position : before_module_init


Step 4. 모듈검색단계 (ModuleHandler Init)

실행할 모듈을 결정하는 단계입니다.

모듈초기화 단계에서 추출한 모듈 검색값 (module,document_srl,mid)들을 가지고, 실행모듈을 결정합니다.

다음과 같은 과정을 거쳐 실행모듈을 검색합니다.

  • 1차 시도 : 문서번호 (document_srl)로 모듈찾기를 시도합니다. (예시 : https://conory.com/14247)
  • 2차 시도 : 모듈ID (mid)로 모듈찾기를 시도합니다. (예시 : https://conory.com/blog)
  • 3차 시도 : 모듈이름 (module)이 있다면 해당 모듈로 결정합니다. (예시 : https://conory.com/index.php?module=admin)

실행할 모듈을 찾지못하면 사이트 기본모듈(메인페이지)로 결정됩니다. 

결정된 모듈에 설정된 브라우저 제목,레이아웃이 설정됩니다.


→ 처리파일 : classes/module/ModuleHandler.class.php


* 트리거 호출 - moduleHandler.init (after)


Step 5. 모듈실행 준비단계 (procModule)

모듈실행전 실행할 모듈의 action 찾고, 필요한 자원들을 불려오는 단계입니다.

다음과 같은 과정을 거치며, 모듈실행을 준비합니다.

  • 요청된 act가 없을 경우 index act로 설정합니다.
  • 모듈의 conf/module.xml에서 요청된 act를 찾아 type, kind을 구별합니다. 
  • type이 controller일 경우 act method를 체크하여 요청이 allowed method가 아닐 경우 에러
  • kind이 admin일 경우 관리자인지 체크하여 아닐 경우 에러
  • 해당 act에 해당되는 type, kind로 모듈 인스턴스를 생성합니다. (모듈 자원 Load)
  • 실행모듈에서 요청된 act를 찾을 수 없다면... (요청된 act가 다른모듈의 act일 경우)
    • 1차 시도 : act이름에서 모듈이름을 추출합니다. [act 이름은 Type + 모듈이름 + 고유이름] action의 standalone속성이 false이면 에러
    • 2차 시도 : action forward에서 act를 검색을 시도합니다. (XE의 action forward기능)
    • 3차 시도 : 요청 act를 무시하고, 실행모듈의 index act로 실행합니다.
    • 4차 : 그래도 act의 모듈을 찾을 수 없다면 에러!!
  • 위 시도로 찾은 모듈이 있다면 그 모듈로 실행모듈을 변경합니다.
  • action에 ruleset속성이 있다면 해당 ruleset을 체크합니다.
  • 모듈권한 체크 (권한이 없으면 에러)
  • 모듈의 init()함수를 실행합니다. (초기화 함수실행)
  • 모바일접속시 pc모드일경우 모바일 접속안내메시지 하단에 추가합니다.
  • 환경설정에서 설정한 푸터내용과 사이트 제목을 적용합니다.

action의 standalone속성은 다른모듈에서 이 act 실행을 허용하는 속성입니다. 그런데 false이면 다른모듈에서 이 act실행을 거부하겠다는 뜻입니다.


→ 처리파일 : classes/module/ModuleHandler.class.php


* 트리거 호출 - moduleObject.proc (before)

* 애드온 호출 - called_position : before_module_proc


Step 6. 모듈실행단계 (moduleObject proc)

모듈실행을 수행하는 단계입니다.

먼저 접근권한 체크와 사이트 기본스킨이 있다면 템플릿을 지정합니다.

그 다음 모듈의 해당 함수를 실행합니다. ( $this->{$this->act}(); )


→ 처리파일 : classes/module/ModuleObject.class.php


* 트리거 호출 - moduleObject.proc (after)

* 애드온 호출 - called_position : after_module_proc



* 트리거 호출 - moduleHandler.proc (after)


Step 7. 화면출력 준비단계 (displayContent)

화면에 모듈실행 결과물 출력을 준비하는 단계입니다.

이때 요청 메소드가 HTML이 아니면 바로 화면출력 단계로 넘어 갑니다.

다음과 같은 과정을 거치며, 화면출력을 준비합니다.

  • 윗단계에서 에러발생시 에러메시지를 출력하도록 설정합니다.
  • 모듈검색단계에서 저장된 모듈의 레이아웃 정보 가져와 준비합니다.


→ 처리파일 : classes/module/ModuleHandler.class.php


* 트리거 호출 - display (before)

* 애드온 호출 - called_position : before_display_content


Step 8. 화면출력단계 (printContent)

화면에 모듈실행 결과물을 출력하는 단계로써 XE실행의 마지막 단계입니다.

요청메소드에 따라 (xml,XMLRPC,JSON,JS_CALLBACK,HTML) 최종결과물을 얻습니다.


HTML일경우 모듈 템플릿 파일을 컴파일하고 레이아웃이 있으면 레이아웃 템플릿파일을 컴파일후 합치게 됩니다.

또,  ./common/tpl/common_layout.html 파일과 합쳐서 최종결과물이 완성됩니다.


그리고 결과물을 압축(gzip)인코딩합니다. (ob_gzhandler 사용시)

마지막으로 결과물을 출력합니다. (print $output;)


→ 처리파일 : classes/display/DisplayHandler.class.php


* 트리거 호출 - display (after)



이로써 XE실행은 완료됩니다. 좀 길죠?


  • ?
    날아라 2014.02.22 04:50:56
    와우 강의 너무 좋아요!! 이게 기초라니 너무 어려운데.. 앞으로는 더욱더 어렵겠군요! 흑
  • profile
    CONORY 2014.02.22 11:18:51
    감사합니다!!
    그리고 기초단계이니, 어려우면 너무 자세히 볼 필요없습니다.
    그냥 XE실행단계는 요청단계,초기화단계,모듈초기화단계... 가 있다와 각단계가 무슨역할하는지 정도만 아셔도 될 것 같아요..
  • ?
    날아라 2014.02.23 21:03:07
    한번에 머리에 다 입력시키기는 힘들지만
    꾸준히 보니 점점 이해가 되는것 같습니다
    정말 감사합니다!. 복많이 받으실거예요 ㅠ
  • ?
    다이오니 2015.01.30 09:53:49
    강의들을 정주행하고 있는데 몰랐던 것을 많이 알 수 있네요~ 감사합니다.
?

서버에 요청 중입니다. 잠시만 기다려 주십시오...