xe 오픈 세미나(2014-04-26) - 김동현 "xe 코어 구조론"

30
XE 코어 구조론 김동현 / 銀童 / [email protected] 써드파티 개발자를 위한 XE 구성요소와 역할 & 개발에 필요한 코어 이해

Upload: xpressengine

Post on 29-Nov-2014

1.504 views

Category:

Software


4 download

DESCRIPTION

발표 일시 : 2014년 4월 26일 발표자 : 김동현 (銀童, 은동) XE Core의 전체 구조와 동작 방식에 대한 상세한 구조를 살펴 보기

TRANSCRIPT

Page 1: XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"

XE 코어 구조론

김동현 / 銀童 / [email protected]

써드파티 개발자를 위한 XE 의 각 구성요소와 역할 & 개발에 필요한 코어 이해

Page 2: XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"

이번 강의의 목표• XE 를 이루는 구조가 어떤 것들이 있는지, 그것이 어떤것인지 개념을 파악한다.

• XE 가 어떤 과정으로 실행되는지, 그 과정중에는 어떠한 작업들이 이루어지는지 파악한다.

• 그외 기타 개발에 유용한 정보들을 얻는다.

Page 3: XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"

XE 코어란?

• 코어란?

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

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

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

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

Page 4: XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"

XE 의 구조의 기본

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

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

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

Page 5: XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"

XE 의 구성 요소• 모듈

• 스킨, 템플릿

• 위젯

• 레이아웃

• 애드온

Page 6: XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"

모듈• 모듈이란?

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

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

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

Page 7: XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"

MVC 패턴에 대한 간략한 소개• Model : 데이터를 처리하고 기타 필요한 공용 로직

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

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

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

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

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

Page 8: XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"

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

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

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

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

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

Page 9: XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"

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

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

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

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

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

Page 10: XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"

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

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

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

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

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

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

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

Page 11: XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"

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

• 사이트의 전체적인 틀.

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

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

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

Page 12: XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"

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

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

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

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

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

• 모바일과 PC 화면은 별도의 common layout 을 사용하게 된다. 애드온등의 개발을 할떄 요주의.

Page 13: XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"

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

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

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

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

Page 14: XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"

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

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

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

Page 15: XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"

XE 의 실행과정Request

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

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

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

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

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

Page 16: XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"

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

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

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

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

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

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

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

Page 17: XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"

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

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

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

Page 18: XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"

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

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

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

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

• 실행할 모듈을 찾음

Page 19: XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"

모듈 실행 단계 !

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

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

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

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

Page 20: XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"

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

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

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

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

• 모듈 설정값 load

Page 21: XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"

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

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

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

• 트리거 실행

Page 22: XE 오픈 세미나(2014-04-26) - 김동현 "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 23: XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"

코어의 구성 클래스

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

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

Page 24: XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"

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

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

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

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

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

Page 25: XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"

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

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

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

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

Page 26: XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"

FILE 클래스

• FILE 을 처리하는 클래스

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

• /classes/file/FileHandler.class.php

Page 27: XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"

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

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

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

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

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

Page 28: XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"

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

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

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

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

Page 29: XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"

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

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

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

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

Page 30: XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"

Q & A

• 수고하셨습니다.