Top Banner
XE 코어 구조론 써드파티 개발자를 위한 XE 구성요소와 역할 & 개발에 필요한 코어 이해
29

Xe 구조에 대한 이해

Jun 10, 2015

Download

Internet

Dong Hyun Kim
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Xe 구조에 대한 이해

XE 코어 구조론써드파티 개발자를 위한 XE 의 각 구성요소와 역할

& 개발에 필요한 코어 이해

Page 2: Xe 구조에 대한 이해

XE 코어란?

• 코어란?

• 흔히 쓰이는 정의 : Xpressengine 사이트에서 배포되는 XE 배포본

• 우리가 오늘 다루고자 하는 정의 : 기본적으로 포함된 모듈을 제외한 실제 코어

• 예 ) XE 1.7.4를 보면 document 모듈을 사용하는 board 모듈이 포함되어있지만, 이경우 board 모듈과, document 모듈은 기본 배포되는 모듈로 코어라고 정의하지 않음.

• 코어란? XE 기반 모듈, 애드온, 위젯등이 돌아갈수 있도록 만들어둔 기본 골격

Page 3: Xe 구조에 대한 이해

XE 의 구조의 기본

• XE의 모든 요청은 index.php 에서 처리한다.

• 모든 HTML 페이지는 모듈의 View 를 통해서 만들어진다.

• XE 코어의 기본 기능도 기본적으로 제공되는 모듈의 View 등을 통해서 페이지를 출력시킴

Page 4: Xe 구조에 대한 이해

XE 의 구성 요소• 모듈

• 스킨, 템플릿

• 위젯

• 레이아웃

• 애드온

Page 5: Xe 구조에 대한 이해

모듈• 모듈이란?

• XE 기반에서 돌아가는 프로그램.

• XE 의 모든 요청은 모듈을 기반으로 되어있다.

• 한번에 한개의 모듈을 실행한다. 단 트리거등으로 다른 모듈이 끼어들어서 특정 함수를 실행시킬수 있다.

Page 6: Xe 구조에 대한 이해

MVC 패턴에 대한 간략한 소개• MVC 패턴이란?

• Model : 데이터를 처리하고 기타 필요한 공용 로직

• View : 출력을 담당하는 부분

• Controller : 특정 행동을 취하는 부분

• MVC 를 반드시 준수할 필요는 없다. 필요하다면 자신들의 클래스를 추가해서 사용해도 된다

• 예 ) document 모듈은 문서 각각을 하나의 객체로 처리하며, 해당부분을 document.item.class.php 에서 DocumentItem이라는 항목으로 사용.

• 하지만 View 와 controller 는 확실히 구별해두어야 한다.

Page 7: Xe 구조에 대한 이해

트리거• 모듈에서 특정 시점에 끼어들어서 함수를 실행시켜주기 위한 장치

• 예 ) 포인트 모듈에서 글을 작성하면 포인트를 주는경우, 포인트 모듈은 글이 작성되는 시점에 끼어들어서 포인트를 주는 과정을 수행한다.

• 트리거가 끼어들수 있는 시점은 트리거용으로 선언한 부분에 끼어들수 있다.

• $trigger_output = ModuleHandler ::triggerCall(‘모듈.트리거이름', ‘시점(before, after)’, $넘길 변수);

• 넘길 변수를 가지고서 체크해서 별도의 루틴을 사용하거나, 참조된 변수를 이용해서 데이터를 변조하는등의 역할을 수행할수 있다.

Page 8: Xe 구조에 대한 이해

스킨, 템플릿• 모듈의 view 의 데이터 출력을 특정 HTML출력으로 바꿔주는 부분

• 모듈 아래에 있는 skins 와 tpl 부분은 차이가 없다.

• 단 모듈의 관리 부분에서 스킨을 설정이 가능해서 치환이 가능한것이 skins, 그렇지 않은것이 tpl 로 편의로 나누어져있을뿐.

• XE문법을 PHP코드로 변환한뒤에 수행하기때문에 {@ }로 넣은 소스와 <?php ?> 로 넣은 소스는 동일하게 작동하지 않는다.

• 예를들면, {$board_title}은 php로 변환되면 <?=Context::get(‘board_title’)?>이 된다.

Page 9: Xe 구조에 대한 이해

위젯• 위젯은 분리해서 사용할수 있는 작은 View 의 역할이다.

• 모델에서 view 의 역할 : 데이터를 처리해서 출력해줌

• 위젯 : 데이터를 처리해서 출력해줌

• XE 에서는 모듈의 view 가 한번의 리퀘스트에 한개만 지정되기때문에 다양한 view를 동시에 보여줄수 없으므로, 위젯을 사용한다.

• 위젯도 스킨을 사용하나 이것도 마찬가지로, 결국 모듈의 view의 스킨, 템플릿과 동일하다.

• 위젯은 특정 HTML 코드로 로드해서 사용하며, 해당 코드는 템플릿 컴파일 과정에서 특정 함수로 바뀌게 된다.

• 템플릿 컴파일을 통하지 않고 위젯 내용을 불러올수도 있다. (widget 모듈의 controller 의 excute 함수)

Page 10: Xe 구조에 대한 이해

레이아웃• 레이아웃이란?

• 사이트의 전체적인 틀.

• $content 변수를 통해서 모듈의 View 를 출력.

• 혹은 위젯을 출력가능 (위젯코드 사용)

• 최종적으로 완성된 레이아웃은 /common/tpl/common_layout.html 의 파일 안쪽에 들어가게 된다.

Page 11: Xe 구조에 대한 이해

COMMON LAYOUT• 기본 HTML 헤더와, JS, CSS 를 로딩한다.

• 관리자일경우 Admin Bar 를 최 상단에 생성한다.

• javascript 에서 쓰일 기본적인 언어셋을 정의한다.

• favicon 등 설정된 내역을 출력한다.

• 이러한 처리를 해주는 기본 레이아웃이 있기떄문에 XE 의 레이아웃에서는 HTML 구조를 생성하지 않고 <body>태그 안쪽에 들어갈 내용만 작성하게 된다

Page 12: Xe 구조에 대한 이해

애드온• 특정 시점에서 호출되서 실행되는 코드

• 예 ) before_module_init : 모듈 실행전 before_display_content : 결과물 호출전

• 실제로 특정 시점에서 특정 애드온을 호출하는게 아니라 ‘모든 애드온’을 호출하기때문에 애드온 상단에 호출 시점을 체크하는것이 필요.

• 코어를 수정하지 않고, 입력값을 수정하거나 특정 시점에서 끼어들기 위한것.

Page 13: Xe 구조에 대한 이해

트리거 VS 애드온• 둘의 기능은 유사하나 차이점도 있다.

• 트리거는 변수를 전달받아서 처리 가능한 반면에 애드온은 특정 변수를 넘겨받을수는 없다. 전역변수의 수정만 가능하다.

• 트리거는 DB 에서 트리거 목록을 가지고 특정 시점에서 해당 트리거만 처리하는 반면에 애드온은 모든 애드온을 체크하므로, 애드온이 많아지게되면 성능 저하가 있을수 있다.|

Page 14: Xe 구조에 대한 이해

XE 의 실행과정Request

index.php 로 GET / POST 방식으로 요청

Context Initialize Context 클래스를 초기화 / 언어 / 로그인 정보등 확인

Module Initialize 어떤 모듈을 불러오는지 결정한후 실행 준비

Module 모듈을 실행하고 화면 출력할 내용을 준비

Display content 정해진 규격에 따라서 내용을 출력

Page 15: Xe 구조에 대한 이해

CONTEXT 클래스 초기화• INDEX.PHP 로 초기 리퀘스트가 들어오면 실행

• 요청된 방식을 확인(HTML, XML,JSON)

• GET 이나 POST로 들어온 요청값들을 정리

• /files/config/db.config.php 의 db 정보를 불러옴

• 사이트의 기본 모듈정보와 같은 사이트 기본 세팅정보를 불러옴

• 사용할 언어를 확정하고 해당 언어를 불러옴

• 해당 세션을 확인해서 로그인 여부를 확인하고 로그인 정보를 저장해둠.

Page 16: Xe 구조에 대한 이해

• 기본적으로 최종적인 모든 모듈 수행이 종료된뒤 출력되는 데이터는 입력되는 데이터와 같은 종류로 출력되게 된다.

• 이러한 출력데이터는 Context::setRespondMethod 함수를 통해서 설정하던가, HTTP 리퀘스트의 헤더를 조작해서 자신이 얻고자 하는 데이터를 얻을수 있다.

• HTML(GET/POST), JSON, XML이든 어느 방식으로 접근해도 Context::getRequestVars()를 통해서 얻어낼수 있다.

Page 17: Xe 구조에 대한 이해

모듈 준비 단계• 요청값에서 모듈을 찾아내기 위한 값들을 추출

(module, act, mid, document_srl, module_srl ..)

• XSS 방어, SSL 적용여부 체크

• 트리거 호출 (moduleHandler.init (before & after))

• 실행할 모듈을 찾음

Page 18: Xe 구조에 대한 이해

모듈 실행 단계 !

• 모듈 실행전 실행할 모듈의 action 을 지정하고, 필요한 자원을 불러오는 과정.

• 모듈 실행을 수행하고, 접근 권한을 체크, 해당 모듈의 act 함수 실행 : $this->{$this->act}();

• 모듈 처리 시점에서 트리거 작동

• 모듈의 action 은 xml파일에서 설정을 가져와서 실행되게 됨

Page 19: Xe 구조에 대한 이해

• 요청된 act 가 없을경우 xml 상에 정의된 index act 를 사용.

• xml데이터를 비교하여, ruleset 적용, standalone 체크

• admin 이 들어간 act 인경우 관리자가 아니면 실행되지 않도록 권한 체크

• 모듈의 init() - 초기화 함수 실행

• 모듈 설정값 load

Page 20: Xe 구조에 대한 이해

화면 출력 단계 • 모듈 실행의 결과를 출력하는 단계, HTML이냐, JSON이나 XML이냐에 따라서 출력 방법이 달라짐.

• 레이아웃, common_html등과 합쳐진 템플릿을 컴파일 후에 출력

• json이나 xml 일 경우 주어진 데이터를 스킨 컴파일 과정을 통하지 않고 해당 데이터를 바로 출력.

• 트리거 실행

Page 21: Xe 구조에 대한 이해

• 출력 방법이 HTML 인 경우

• 템플릿으로 지정된 부분을 컴파일한뒤 HTML을 만들어서 최종 반환한다. 이후 레이아웃, 기본 레이아웃등과 합쳐지는 HTML 출력 과정을 거친다.

• 출력 방법이 XML/JSON 인 경우

• 해당 모듈 Instance 에 추가된 변수들을 직렬화 시켜서, XML, JSON 형태로 출력시킨다. 이경우 레이아웃을 거치지 않는다.

• ex) board 모듈의 board.api.php (XML, JSON등일경우 별도로 실행되는 API클래스) 의 문서 목록을 가져오는 함수의 경우, $oModule->add(‘document_list’,$document_list); 와 같이 모듈 정보에 document_list 자체를 넣어둔다.

Page 22: Xe 구조에 대한 이해

코어의 구성 클래스

• Cache, Context, DB, Display, Extravar, File, FrontendFile, HttpRequest, Mail, Module 등등의 기본 클래스 존재

• 오늘 알아볼것은, 서드파티 개발에서 참조해서 사용할수 있는 몇가지 클래스들의 유용한 사용법. 역할에 대해서 알아봄

Page 23: Xe 구조에 대한 이해

DB 클래스• 데이터베이스에 접근하는 클래스

• DB::getInstance() 를 통해서 DB 인스턴스의 생성 가능.

• 해당 인스턴스 생성후 _query() 함수를 통해서 XML 쿼리문이 아닌 SQL 자체의 사용도 가능

• 단 해당 방식의 경우 DB 호환성이 문제가 될수있고, table_prefix 등이 문제가 될수있기 때문에 그점을 고려해서 XML쿼리가 지원되지 않는 형식의 쿼리를 쓸때에 한정해서 table_prefix 값을 가져와서 사용하도록 하는것이 필요하다.

• _fetch 된 값은 1개일경우, Object 로, 여러개일경우 Object 의 배열로 리턴된다, 그것을 모두 배열로 처리시키기 위해서는 _fetch($query, 0) 식으로 하나의 변수를 더 넘겨주면 된다.

Page 24: Xe 구조에 대한 이해

CACHE 클래스 • XE 의 캐시를 처리할수 있는 클래스

• Cachehandler ::getInstance()로 캐시 클래스를 가져와서. get, put, delete, 등으로 캐시 클래스의 처리 가능

• GroupKey 개념 사용. GroupKey 는 특정 부분의 그룹의 캐시들이 업데이트가 필요할경우 캐시를 제거하기 위한 방법

• 예 ) document list 에 관련된 캐시들의 경우 새로운 document 가 추가되면 모두 새롭게 캐시를 생성해야한다. 이경우 documentList 의 그룹키를 갱신해서 모든 캐시가 새롭게 가져오도록 설정.

Page 25: Xe 구조에 대한 이해

FILE 클래스

• FILE 을 처리하는 클래스

• 디렉토리를 복사하거나, 파일을 쓸때 경로가 구축되어있지 않을경우 디렉토리도 생성해주는등 편리한 함수가 많다.

• /classes/file/FileHandler.class.php

Page 26: Xe 구조에 대한 이해

• FileHandler ::removeFilesInDir - 디렉토리 내부에 있는 파일 삭제

• FileHandler ::filesize - 파일사이즈 반환(KB, MB등으로 표시)

• FileHander::getRemoteResource - 원격 파일 읽어오기

• FileHandler ::getRemoteFile - 원격 파일을 지정된 곳에 다운받기

• 그외 사용에 편리한 다양한 함수들이 있으니, 직접 확인해보시기 바랍니다.

Page 27: Xe 구조에 대한 이해

MAIL 클래스• PHPMailer 를 이용해서 메일 발송

• Google SMTP 를 이용해서도 메일의 발송이 가능하다.

• useGmailAccount($account_name, $account_passwd) 함수 사용

• 메일에 파일을 첨부하는등의 처리를 자동으로 처리해준다.

Page 28: Xe 구조에 대한 이해

XE 개발 디버깅 방법• debugPrint()를 통한 디버깅 방법

• debugPrint() 함수를 통해서 전달되고있는 변수, 해당 시점이 실행되는지 등의 여부를 테스트 할수 있다.

• debugPrint() 로 인해서 출력된 내용은 firephp, HTML 하단, 별도의 디버깅용 파일에 쓰여짐 중의 한 방식으로 출력할수 있다.

• 보통 print_r 이나 var_dump 같은걸로 디버깅을 하는 경우가 많지만, controller 등의 경우 그것을 사용하기 어렵기때문에, debugPrint()를 사용하는것을 강하게 추천한다.

Page 29: Xe 구조에 대한 이해

Q & A

• 수고하셨습니다.

• 강의 내용이 아니더라도, 궁금하셨던 점이 있다면 질문해주세요