SlideShare a Scribd company logo
1 of 30
Download to read offline
XE 코어 구조론
김동현 / 銀童 / dh1024@gmail.com
써드파티 개발자를 위한 XE 의 각 구성요소와 역할	

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

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

• 그외 기타 개발에 유용한 정보들을 얻는다.
XE 코어란?
• 코어란?	

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

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

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

• 코어란? XE 기반 모듈, 애드온, 위젯등이 돌아갈수 있도록 만들어둔 기본 골격
XE 의 구조의 기본
• XE의 모든 요청은 index.php 에서 처리한다.	

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

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

• 스킨, 템플릿	

• 위젯	

• 레이아웃	

• 애드온
모듈
• 모듈이란?	

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

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

• 한번에 한개의 모듈을 실행한다. 단 트리거등으로 다른 모듈이 끼
어들어서 특정 함수를 실행시킬수 있다.
MVC 패턴에 대한 간략한 소개
• Model : 데이터를 처리하고 기타 필요한 공용 로직	

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

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

• MVC 를 반드시 엄격하게 준수할 필요는 없다. 

필요하다면 자신들의 클래스를 추가해서 사용해도 된다	

• 예 ) document 모듈은 문서 각각을 하나의 객체로 처리하며, 

해당부분을 document.item.class.php 에서 DocumentItem이라는 항목으로 사용. 	

• 하지만 View 와 Controller 는 확실히 구별해두어야 한다.
트리거
• 모듈에서 특정 시점에 끼어들어서 함수를 실행시켜주기 위한 장치	

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

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

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

• 넘길 변수를 가지고서 체크해서 별도의 루틴을 사용하거나, 참조된 변수를 이용해서 데이터를 변조
하는등의 역할을 수행할수 있다.
스킨, 템플릿
• 모듈의 view 의 데이터 출력을 특정 HTML출력으로 바꿔주는 부분	

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

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

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

• 예를들면, {$board_title}은 php로 변환되면 <?=Context::get(‘board_title’)?>이 된다.
위젯
• 위젯은 분리해서 사용할수 있는 작은View 의 역할이다. 	

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

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

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

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

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

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

• 사이트의 전체적인 틀.	

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

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

• 최종적으로 완성된 레이아웃은 /common/tpl/common_layout.html 의 파일 안쪽
에 들어가게 된다.
COMMON LAYOUT
• 기본 HTML 헤더와, JS, CSS 를 로딩한다.	

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

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

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

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

• 모바일과 PC 화면은 별도의 common layout 을 사용하게 된다. 애드온등의 개발을 할떄 요주의.
애드온
• 특정 시점에서 호출되서 실행되는 코드	

• 예 ) before_module_init : 모듈 실행전

before_display_content : 결과물 호출전	

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

• 코어를 수정하지 않고, 입력값을 수정하거나 특정 시점에서 끼어들기 위한것.
트리거VS 애드온
• 둘의 기능은 유사하나 차이점도 있다. 	

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

• 트리거는 DB 에서 트리거 목록을 가지고 특정 시점에서 해당 트리
거만 처리하는 반면에 애드온은 모든 애드온을 체크하므로, 애드온
이 많아지게되면 성능 저하가 있을수 있다. (애드온이 1000개라면?)
XE 의 실행과정
Request
index.php 로 GET / POST 방식으로 요청
Context Initialize
Context 클래스를 초기화 / 언어 / 로그인 정보등 확인
Module Initialize
어떤 모듈을 불러오는지 결정한후 실행 준비
Module
모듈을 실행하고 화면 출력할 내용을 준비
Display content
정해진 규격에 따라서 내용을 출력
CONTEXT 클래스 초기화
• INDEX.PHP 로 초기 리퀘스트가 들어오면 실행	

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

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

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

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

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

• 해당 세션을 확인해서 로그인 여부를 확인하고 로그인 정보를 저장해둠.
• 기본적으로 최종적인 모든 모듈 수행이 종료된뒤 출력되는
데이터는 입력되는 데이터와 같은 종류로 출력되게 된다.	

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

• HTML(GET/POST), JSON, XML이든 어느 방식으로 접근
해도 Context::getRequestVars()를 통해서 얻어낼수 있다.
모듈 준비 단계
• 요청값에서 모듈을 찾아내기 위한 값들을 추출

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

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

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

• 실행할 모듈을 찾음
모듈 실행 단계	

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

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

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

• 모듈의 action 은 xml파일에서 설정을 가져와서 실행되게 됨
• 요청된 act 가 없을경우 xml 상에 정의된 index act 를 사용.	

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

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

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

• 모듈 설정값 load
화면 출력 단계	

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

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

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

• 트리거 실행
• 출력 방법이 HTML 인 경우	

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

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

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

• ex) board 모듈의 board.api.php (XML, JSON등일경우 별도로 실행되는 API클래
스) 의 문서 목록을 가져오는 함수의 경우, $oModule-
>add(‘document_list’,$document_list); 와 같이 모듈 정보에 document_list 자체를
넣어둔다.
코어의 구성 클래스
• Cache, Context, DB, Display, Extravar, File, FrontendFile,
HttpRequest, Mail, Module 등등의 기본 클래스 존재	

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

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

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

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

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

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

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

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

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

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

• /classes/file/FileHandler.class.php
• FileHandler::removeFilesInDir - 디렉토리 내부에 있는 파일 삭
제	

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

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

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

• 그외 사용에 편리한 다양한 함수들이 있으니, 직접 확인해보시기
바랍니다.
MAIL 클래스
• PHPMailer 를 이용해서 메일 발송	

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

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

• 메일에 파일을 첨부하는등의 처리를 자동으로 처리해준다.
XE 개발 디버깅 방법
• debugPrint()를 통한 디버깅 방법	

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

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

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

More Related Content

What's hot

XE 모듈 개발 - 걸음마부터 날기까지 - 걸음마
XE 모듈 개발 - 걸음마부터 날기까지 - 걸음마XE 모듈 개발 - 걸음마부터 날기까지 - 걸음마
XE 모듈 개발 - 걸음마부터 날기까지 - 걸음마승엽 신
 
막하는 스터디 첫 번째 만남 Node.js
막하는 스터디 첫 번째 만남 Node.js막하는 스터디 첫 번째 만남 Node.js
막하는 스터디 첫 번째 만남 Node.js연웅 조
 
[오픈소스컨설팅]MyBatis Basic
[오픈소스컨설팅]MyBatis Basic[오픈소스컨설팅]MyBatis Basic
[오픈소스컨설팅]MyBatis BasicJi-Woong Choi
 
#32.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#32.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...#32.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#32.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
막하는스터디 두번째만남 Express(20151025)
막하는스터디 두번째만남 Express(20151025)막하는스터디 두번째만남 Express(20151025)
막하는스터디 두번째만남 Express(20151025)연웅 조
 
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...
[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...
[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
(스프링 초보자를 위한)스프링 DI관련 어노테이션,자동스캐닝 컴포넌트(Spring Framework Auto-Scanning Component)
(스프링 초보자를 위한)스프링 DI관련 어노테이션,자동스캐닝 컴포넌트(Spring Framework Auto-Scanning Component)(스프링 초보자를 위한)스프링 DI관련 어노테이션,자동스캐닝 컴포넌트(Spring Framework Auto-Scanning Component)
(스프링 초보자를 위한)스프링 DI관련 어노테이션,자동스캐닝 컴포넌트(Spring Framework Auto-Scanning Component)탑크리에듀(구로디지털단지역3번출구 2분거리)
 
(SQL튜닝,오라클힌트강좌)구체화뷰(Materialized View)를 통한 그룹함수(SUM,MAX,MIN,AVG)의 튜닝_오라클 옵티마이...
(SQL튜닝,오라클힌트강좌)구체화뷰(Materialized View)를 통한 그룹함수(SUM,MAX,MIN,AVG)의 튜닝_오라클 옵티마이...(SQL튜닝,오라클힌트강좌)구체화뷰(Materialized View)를 통한 그룹함수(SUM,MAX,MIN,AVG)의 튜닝_오라클 옵티마이...
(SQL튜닝,오라클힌트강좌)구체화뷰(Materialized View)를 통한 그룹함수(SUM,MAX,MIN,AVG)의 튜닝_오라클 옵티마이...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
(#8.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis))스프링/자바교육/IT교육/스프링프레임워크교육/국비지...
(#8.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis))스프링/자바교육/IT교육/스프링프레임워크교육/국비지...(#8.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis))스프링/자바교육/IT교육/스프링프레임워크교육/국비지...
(#8.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis))스프링/자바교육/IT교육/스프링프레임워크교육/국비지...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
[#9.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)]_재직자환급교육/실업자환급교육/구로IT학원/스프링교...
[#9.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)]_재직자환급교육/실업자환급교육/구로IT학원/스프링교...[#9.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)]_재직자환급교육/실업자환급교육/구로IT학원/스프링교...
[#9.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)]_재직자환급교육/실업자환급교육/구로IT학원/스프링교...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs기동 이
 
[오픈소스컨설팅]Ansible overview
[오픈소스컨설팅]Ansible overview[오픈소스컨설팅]Ansible overview
[오픈소스컨설팅]Ansible overviewOpen Source Consulting
 

What's hot (20)

XE 모듈 개발 - 걸음마부터 날기까지 - 걸음마
XE 모듈 개발 - 걸음마부터 날기까지 - 걸음마XE 모듈 개발 - 걸음마부터 날기까지 - 걸음마
XE 모듈 개발 - 걸음마부터 날기까지 - 걸음마
 
Express 프레임워크
Express 프레임워크Express 프레임워크
Express 프레임워크
 
막하는 스터디 첫 번째 만남 Node.js
막하는 스터디 첫 번째 만남 Node.js막하는 스터디 첫 번째 만남 Node.js
막하는 스터디 첫 번째 만남 Node.js
 
[오픈소스컨설팅]MyBatis Basic
[오픈소스컨설팅]MyBatis Basic[오픈소스컨설팅]MyBatis Basic
[오픈소스컨설팅]MyBatis Basic
 
(오라클힌트,SQL튜닝강좌#25)오라클WITH구문,서브쿼리 팩토링
(오라클힌트,SQL튜닝강좌#25)오라클WITH구문,서브쿼리 팩토링(오라클힌트,SQL튜닝강좌#25)오라클WITH구문,서브쿼리 팩토링
(오라클힌트,SQL튜닝강좌#25)오라클WITH구문,서브쿼리 팩토링
 
#32.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#32.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...#32.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#32.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
 
플라스크 템플릿
플라스크 템플릿플라스크 템플릿
플라스크 템플릿
 
막하는스터디 두번째만남 Express(20151025)
막하는스터디 두번째만남 Express(20151025)막하는스터디 두번째만남 Express(20151025)
막하는스터디 두번째만남 Express(20151025)
 
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
 
(Spring Data JPA)식별자(@Id, Primary Key) 자동 생성, @GeneratedValue의 strategy 속성,Ge...
(Spring Data JPA)식별자(@Id, Primary Key) 자동 생성, @GeneratedValue의 strategy 속성,Ge...(Spring Data JPA)식별자(@Id, Primary Key) 자동 생성, @GeneratedValue의 strategy 속성,Ge...
(Spring Data JPA)식별자(@Id, Primary Key) 자동 생성, @GeneratedValue의 strategy 속성,Ge...
 
[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...
[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...
[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...
 
(Spring Data JPA)게시판 리스트보기_오라클, 스프링부트,페이지나누기
(Spring Data JPA)게시판 리스트보기_오라클, 스프링부트,페이지나누기(Spring Data JPA)게시판 리스트보기_오라클, 스프링부트,페이지나누기
(Spring Data JPA)게시판 리스트보기_오라클, 스프링부트,페이지나누기
 
(스프링 초보자를 위한)스프링 DI관련 어노테이션,자동스캐닝 컴포넌트(Spring Framework Auto-Scanning Component)
(스프링 초보자를 위한)스프링 DI관련 어노테이션,자동스캐닝 컴포넌트(Spring Framework Auto-Scanning Component)(스프링 초보자를 위한)스프링 DI관련 어노테이션,자동스캐닝 컴포넌트(Spring Framework Auto-Scanning Component)
(스프링 초보자를 위한)스프링 DI관련 어노테이션,자동스캐닝 컴포넌트(Spring Framework Auto-Scanning Component)
 
Node.js intro
Node.js introNode.js intro
Node.js intro
 
(SQL튜닝,오라클힌트강좌)구체화뷰(Materialized View)를 통한 그룹함수(SUM,MAX,MIN,AVG)의 튜닝_오라클 옵티마이...
(SQL튜닝,오라클힌트강좌)구체화뷰(Materialized View)를 통한 그룹함수(SUM,MAX,MIN,AVG)의 튜닝_오라클 옵티마이...(SQL튜닝,오라클힌트강좌)구체화뷰(Materialized View)를 통한 그룹함수(SUM,MAX,MIN,AVG)의 튜닝_오라클 옵티마이...
(SQL튜닝,오라클힌트강좌)구체화뷰(Materialized View)를 통한 그룹함수(SUM,MAX,MIN,AVG)의 튜닝_오라클 옵티마이...
 
(#8.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis))스프링/자바교육/IT교육/스프링프레임워크교육/국비지...
(#8.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis))스프링/자바교육/IT교육/스프링프레임워크교육/국비지...(#8.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis))스프링/자바교육/IT교육/스프링프레임워크교육/국비지...
(#8.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis))스프링/자바교육/IT교육/스프링프레임워크교육/국비지...
 
[#9.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)]_재직자환급교육/실업자환급교육/구로IT학원/스프링교...
[#9.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)]_재직자환급교육/실업자환급교육/구로IT학원/스프링교...[#9.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)]_재직자환급교육/실업자환급교육/구로IT학원/스프링교...
[#9.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)]_재직자환급교육/실업자환급교육/구로IT학원/스프링교...
 
(오라클SQL기초강좌)상관 서브쿼리(Correlated Sub Query)
(오라클SQL기초강좌)상관 서브쿼리(Correlated Sub Query)(오라클SQL기초강좌)상관 서브쿼리(Correlated Sub Query)
(오라클SQL기초강좌)상관 서브쿼리(Correlated Sub Query)
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs
 
[오픈소스컨설팅]Ansible overview
[오픈소스컨설팅]Ansible overview[오픈소스컨설팅]Ansible overview
[오픈소스컨설팅]Ansible overview
 

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

토비의 스프링 - DI
토비의 스프링 - DI토비의 스프링 - DI
토비의 스프링 - DIJU Chae
 
이펙티브 C++ (7~9)
이펙티브 C++ (7~9)이펙티브 C++ (7~9)
이펙티브 C++ (7~9)익성 조
 
2014년 03월 XE세미나 XE 애드온 개발 강좌(1/2)
2014년 03월 XE세미나 XE 애드온 개발 강좌(1/2)2014년 03월 XE세미나 XE 애드온 개발 강좌(1/2)
2014년 03월 XE세미나 XE 애드온 개발 강좌(1/2)Sol Kim
 
Sql 중심 코드 탈피 발표자료
Sql 중심 코드 탈피 발표자료Sql 중심 코드 탈피 발표자료
Sql 중심 코드 탈피 발표자료ssuser776e2d
 
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃Kwangyoun Jung
 
Sql 중심 코드 탈피
Sql 중심 코드 탈피Sql 중심 코드 탈피
Sql 중심 코드 탈피ssuser776e2d
 
Secrets of the JavaScript Ninja - Chapter 12. DOM modification
Secrets of the JavaScript Ninja - Chapter 12. DOM modificationSecrets of the JavaScript Ninja - Chapter 12. DOM modification
Secrets of the JavaScript Ninja - Chapter 12. DOM modificationHyuncheol Jeon
 
Ksug2015 - JPA2, JPA 기초와매핑
Ksug2015 - JPA2, JPA 기초와매핑Ksug2015 - JPA2, JPA 기초와매핑
Ksug2015 - JPA2, JPA 기초와매핑Younghan Kim
 
ORM을 활용할 경우의 설계, 개발 과정
ORM을 활용할 경우의 설계, 개발 과정ORM을 활용할 경우의 설계, 개발 과정
ORM을 활용할 경우의 설계, 개발 과정Javajigi Jaesung
 
Chapter7~9 ppt
Chapter7~9 pptChapter7~9 ppt
Chapter7~9 pptInjae Lee
 
[DevOn 2013] Backbone.js로 능동적 M-V 디자인 구현하기
[DevOn 2013] Backbone.js로 능동적  M-V 디자인 구현하기[DevOn 2013] Backbone.js로 능동적  M-V 디자인 구현하기
[DevOn 2013] Backbone.js로 능동적 M-V 디자인 구현하기Gyutae Jo
 
클린 코드 part2
클린 코드 part2클린 코드 part2
클린 코드 part2Minseok Jang
 
RequireJS를 이용한 모듈관리.
RequireJS를 이용한 모듈관리.RequireJS를 이용한 모듈관리.
RequireJS를 이용한 모듈관리.Hyung Eun Jin
 
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거Javajigi Jaesung
 
Objective-C Runtime Programming Guide
Objective-C Runtime Programming GuideObjective-C Runtime Programming Guide
Objective-C Runtime Programming GuideSung-Kwan Kim
 

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

토비의 스프링 - DI
토비의 스프링 - DI토비의 스프링 - DI
토비의 스프링 - DI
 
Xe hack
Xe hackXe hack
Xe hack
 
이펙티브 C++ (7~9)
이펙티브 C++ (7~9)이펙티브 C++ (7~9)
이펙티브 C++ (7~9)
 
2014년 03월 XE세미나 XE 애드온 개발 강좌(1/2)
2014년 03월 XE세미나 XE 애드온 개발 강좌(1/2)2014년 03월 XE세미나 XE 애드온 개발 강좌(1/2)
2014년 03월 XE세미나 XE 애드온 개발 강좌(1/2)
 
Java script
Java scriptJava script
Java script
 
Sql 중심 코드 탈피 발표자료
Sql 중심 코드 탈피 발표자료Sql 중심 코드 탈피 발표자료
Sql 중심 코드 탈피 발표자료
 
EC 789
EC 789EC 789
EC 789
 
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
 
Atom package part1
Atom package part1Atom package part1
Atom package part1
 
Sql 중심 코드 탈피
Sql 중심 코드 탈피Sql 중심 코드 탈피
Sql 중심 코드 탈피
 
Secrets of the JavaScript Ninja - Chapter 12. DOM modification
Secrets of the JavaScript Ninja - Chapter 12. DOM modificationSecrets of the JavaScript Ninja - Chapter 12. DOM modification
Secrets of the JavaScript Ninja - Chapter 12. DOM modification
 
Ksug2015 - JPA2, JPA 기초와매핑
Ksug2015 - JPA2, JPA 기초와매핑Ksug2015 - JPA2, JPA 기초와매핑
Ksug2015 - JPA2, JPA 기초와매핑
 
ORM을 활용할 경우의 설계, 개발 과정
ORM을 활용할 경우의 설계, 개발 과정ORM을 활용할 경우의 설계, 개발 과정
ORM을 활용할 경우의 설계, 개발 과정
 
Chapter7~9 ppt
Chapter7~9 pptChapter7~9 ppt
Chapter7~9 ppt
 
Design patterns
Design patternsDesign patterns
Design patterns
 
[DevOn 2013] Backbone.js로 능동적 M-V 디자인 구현하기
[DevOn 2013] Backbone.js로 능동적  M-V 디자인 구현하기[DevOn 2013] Backbone.js로 능동적  M-V 디자인 구현하기
[DevOn 2013] Backbone.js로 능동적 M-V 디자인 구현하기
 
클린 코드 part2
클린 코드 part2클린 코드 part2
클린 코드 part2
 
RequireJS를 이용한 모듈관리.
RequireJS를 이용한 모듈관리.RequireJS를 이용한 모듈관리.
RequireJS를 이용한 모듈관리.
 
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
 
Objective-C Runtime Programming Guide
Objective-C Runtime Programming GuideObjective-C Runtime Programming Guide
Objective-C Runtime Programming Guide
 

More from XpressEngine

Docker 기반 개발환경 구축 - XE Open seminar #2
Docker 기반 개발환경 구축 - XE Open seminar #2Docker 기반 개발환경 구축 - XE Open seminar #2
Docker 기반 개발환경 구축 - XE Open seminar #2XpressEngine
 
Github 100% 활용하기 - XE Open seminar #3
Github 100% 활용하기 - XE Open seminar #3Github 100% 활용하기 - XE Open seminar #3
Github 100% 활용하기 - XE Open seminar #3XpressEngine
 
XE3 SEO를 다루기 - XE Open seminar #2
XE3 SEO를 다루기 - XE Open seminar #2XE3 SEO를 다루기 - XE Open seminar #2
XE3 SEO를 다루기 - XE Open seminar #2XpressEngine
 
XE Open seminar #2 - keynote
XE Open seminar #2 - keynoteXE Open seminar #2 - keynote
XE Open seminar #2 - keynoteXpressEngine
 
[XECon2016] B-1 안정수 라라벨 Scout을 활용한 검색 기능 둘러보기
[XECon2016] B-1 안정수 라라벨 Scout을 활용한 검색 기능 둘러보기[XECon2016] B-1 안정수 라라벨 Scout을 활용한 검색 기능 둘러보기
[XECon2016] B-1 안정수 라라벨 Scout을 활용한 검색 기능 둘러보기XpressEngine
 
[XECon2016] A-1 정규창 [React] Immutable한 양방향 데이터 바인딩
[XECon2016] A-1 정규창 [React] Immutable한 양방향 데이터 바인딩[XECon2016] A-1 정규창 [React] Immutable한 양방향 데이터 바인딩
[XECon2016] A-1 정규창 [React] Immutable한 양방향 데이터 바인딩XpressEngine
 
[XECon2016] C-4 한성민 AngularJS 1, 2 그리고 실무환경 적용 이야기
[XECon2016] C-4 한성민 AngularJS 1, 2 그리고 실무환경 적용 이야기[XECon2016] C-4 한성민 AngularJS 1, 2 그리고 실무환경 적용 이야기
[XECon2016] C-4 한성민 AngularJS 1, 2 그리고 실무환경 적용 이야기XpressEngine
 
[XECon2016] C-3 이현석 팀장들이 꼽은 신입 PHP 개발자가 가급적 빨리 알았으면 하는 것들
[XECon2016] C-3 이현석 팀장들이 꼽은 신입 PHP 개발자가 가급적 빨리 알았으면 하는 것들[XECon2016] C-3 이현석 팀장들이 꼽은 신입 PHP 개발자가 가급적 빨리 알았으면 하는 것들
[XECon2016] C-3 이현석 팀장들이 꼽은 신입 PHP 개발자가 가급적 빨리 알았으면 하는 것들XpressEngine
 
[XECon2016] C-2 홍성범 XE3 Theme 제작 - 자유롭게, 그리고 편하게
[XECon2016] C-2 홍성범 XE3 Theme 제작 - 자유롭게, 그리고 편하게[XECon2016] C-2 홍성범 XE3 Theme 제작 - 자유롭게, 그리고 편하게
[XECon2016] C-2 홍성범 XE3 Theme 제작 - 자유롭게, 그리고 편하게XpressEngine
 
[XECon2016] C-1 오승훈 XE3로 웹사이트 만들기
[XECon2016] C-1 오승훈 XE3로 웹사이트 만들기[XECon2016] C-1 오승훈 XE3로 웹사이트 만들기
[XECon2016] C-1 오승훈 XE3로 웹사이트 만들기XpressEngine
 
[XECon2016] B-4 변종원 CodeIgniter와 PHP7
[XECon2016] B-4 변종원 CodeIgniter와 PHP7[XECon2016] B-4 변종원 CodeIgniter와 PHP7
[XECon2016] B-4 변종원 CodeIgniter와 PHP7XpressEngine
 
[XECon2016] B-3 성기진 XE1 가지치기와 오픈소스 생태계의 미래
[XECon2016] B-3 성기진 XE1 가지치기와 오픈소스 생태계의 미래[XECon2016] B-3 성기진 XE1 가지치기와 오픈소스 생태계의 미래
[XECon2016] B-3 성기진 XE1 가지치기와 오픈소스 생태계의 미래XpressEngine
 
[XECon2016] B-2 정광섭 Laravel로 스타트업 기술 스택 구성하기
[XECon2016] B-2 정광섭 Laravel로 스타트업 기술 스택 구성하기[XECon2016] B-2 정광섭 Laravel로 스타트업 기술 스택 구성하기
[XECon2016] B-2 정광섭 Laravel로 스타트업 기술 스택 구성하기XpressEngine
 
[XECon2016] A-3 박형식 Frontend stack의 변화 : jQuery, BackboneJS, ReactJS 중심으로
[XECon2016] A-3 박형식 Frontend stack의 변화 : jQuery, BackboneJS, ReactJS 중심으로[XECon2016] A-3 박형식 Frontend stack의 변화 : jQuery, BackboneJS, ReactJS 중심으로
[XECon2016] A-3 박형식 Frontend stack의 변화 : jQuery, BackboneJS, ReactJS 중심으로XpressEngine
 
[XECon2016] A-2 임형주 Webpack 실무 적용전략
[XECon2016] A-2 임형주 Webpack 실무 적용전략[XECon2016] A-2 임형주 Webpack 실무 적용전략
[XECon2016] A-2 임형주 Webpack 실무 적용전략XpressEngine
 
[XECon2016] A-4 조정현 GitHub + Jenkins + Docker로 자동배포 시스템 구축하기
[XECon2016] A-4 조정현 GitHub + Jenkins + Docker로 자동배포 시스템 구축하기[XECon2016] A-4 조정현 GitHub + Jenkins + Docker로 자동배포 시스템 구축하기
[XECon2016] A-4 조정현 GitHub + Jenkins + Docker로 자동배포 시스템 구축하기XpressEngine
 
XECon2015 :: [1-3] 김덕홍 - Git Workflow with GitHub
XECon2015 :: [1-3] 김덕홍 - Git Workflow with GitHubXECon2015 :: [1-3] 김덕홍 - Git Workflow with GitHub
XECon2015 :: [1-3] 김덕홍 - Git Workflow with GitHubXpressEngine
 
XECon2015 :: [2-2] 박상현 - React로 개발하는 SPA 실무 이야기
XECon2015 :: [2-2] 박상현 - React로 개발하는 SPA 실무 이야기XECon2015 :: [2-2] 박상현 - React로 개발하는 SPA 실무 이야기
XECon2015 :: [2-2] 박상현 - React로 개발하는 SPA 실무 이야기XpressEngine
 
XECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravel
XECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravelXECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravel
XECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravelXpressEngine
 
XECon2015 :: [1-2] 이현석 - Learning Laravel
XECon2015 :: [1-2] 이현석 - Learning LaravelXECon2015 :: [1-2] 이현석 - Learning Laravel
XECon2015 :: [1-2] 이현석 - Learning LaravelXpressEngine
 

More from XpressEngine (20)

Docker 기반 개발환경 구축 - XE Open seminar #2
Docker 기반 개발환경 구축 - XE Open seminar #2Docker 기반 개발환경 구축 - XE Open seminar #2
Docker 기반 개발환경 구축 - XE Open seminar #2
 
Github 100% 활용하기 - XE Open seminar #3
Github 100% 활용하기 - XE Open seminar #3Github 100% 활용하기 - XE Open seminar #3
Github 100% 활용하기 - XE Open seminar #3
 
XE3 SEO를 다루기 - XE Open seminar #2
XE3 SEO를 다루기 - XE Open seminar #2XE3 SEO를 다루기 - XE Open seminar #2
XE3 SEO를 다루기 - XE Open seminar #2
 
XE Open seminar #2 - keynote
XE Open seminar #2 - keynoteXE Open seminar #2 - keynote
XE Open seminar #2 - keynote
 
[XECon2016] B-1 안정수 라라벨 Scout을 활용한 검색 기능 둘러보기
[XECon2016] B-1 안정수 라라벨 Scout을 활용한 검색 기능 둘러보기[XECon2016] B-1 안정수 라라벨 Scout을 활용한 검색 기능 둘러보기
[XECon2016] B-1 안정수 라라벨 Scout을 활용한 검색 기능 둘러보기
 
[XECon2016] A-1 정규창 [React] Immutable한 양방향 데이터 바인딩
[XECon2016] A-1 정규창 [React] Immutable한 양방향 데이터 바인딩[XECon2016] A-1 정규창 [React] Immutable한 양방향 데이터 바인딩
[XECon2016] A-1 정규창 [React] Immutable한 양방향 데이터 바인딩
 
[XECon2016] C-4 한성민 AngularJS 1, 2 그리고 실무환경 적용 이야기
[XECon2016] C-4 한성민 AngularJS 1, 2 그리고 실무환경 적용 이야기[XECon2016] C-4 한성민 AngularJS 1, 2 그리고 실무환경 적용 이야기
[XECon2016] C-4 한성민 AngularJS 1, 2 그리고 실무환경 적용 이야기
 
[XECon2016] C-3 이현석 팀장들이 꼽은 신입 PHP 개발자가 가급적 빨리 알았으면 하는 것들
[XECon2016] C-3 이현석 팀장들이 꼽은 신입 PHP 개발자가 가급적 빨리 알았으면 하는 것들[XECon2016] C-3 이현석 팀장들이 꼽은 신입 PHP 개발자가 가급적 빨리 알았으면 하는 것들
[XECon2016] C-3 이현석 팀장들이 꼽은 신입 PHP 개발자가 가급적 빨리 알았으면 하는 것들
 
[XECon2016] C-2 홍성범 XE3 Theme 제작 - 자유롭게, 그리고 편하게
[XECon2016] C-2 홍성범 XE3 Theme 제작 - 자유롭게, 그리고 편하게[XECon2016] C-2 홍성범 XE3 Theme 제작 - 자유롭게, 그리고 편하게
[XECon2016] C-2 홍성범 XE3 Theme 제작 - 자유롭게, 그리고 편하게
 
[XECon2016] C-1 오승훈 XE3로 웹사이트 만들기
[XECon2016] C-1 오승훈 XE3로 웹사이트 만들기[XECon2016] C-1 오승훈 XE3로 웹사이트 만들기
[XECon2016] C-1 오승훈 XE3로 웹사이트 만들기
 
[XECon2016] B-4 변종원 CodeIgniter와 PHP7
[XECon2016] B-4 변종원 CodeIgniter와 PHP7[XECon2016] B-4 변종원 CodeIgniter와 PHP7
[XECon2016] B-4 변종원 CodeIgniter와 PHP7
 
[XECon2016] B-3 성기진 XE1 가지치기와 오픈소스 생태계의 미래
[XECon2016] B-3 성기진 XE1 가지치기와 오픈소스 생태계의 미래[XECon2016] B-3 성기진 XE1 가지치기와 오픈소스 생태계의 미래
[XECon2016] B-3 성기진 XE1 가지치기와 오픈소스 생태계의 미래
 
[XECon2016] B-2 정광섭 Laravel로 스타트업 기술 스택 구성하기
[XECon2016] B-2 정광섭 Laravel로 스타트업 기술 스택 구성하기[XECon2016] B-2 정광섭 Laravel로 스타트업 기술 스택 구성하기
[XECon2016] B-2 정광섭 Laravel로 스타트업 기술 스택 구성하기
 
[XECon2016] A-3 박형식 Frontend stack의 변화 : jQuery, BackboneJS, ReactJS 중심으로
[XECon2016] A-3 박형식 Frontend stack의 변화 : jQuery, BackboneJS, ReactJS 중심으로[XECon2016] A-3 박형식 Frontend stack의 변화 : jQuery, BackboneJS, ReactJS 중심으로
[XECon2016] A-3 박형식 Frontend stack의 변화 : jQuery, BackboneJS, ReactJS 중심으로
 
[XECon2016] A-2 임형주 Webpack 실무 적용전략
[XECon2016] A-2 임형주 Webpack 실무 적용전략[XECon2016] A-2 임형주 Webpack 실무 적용전략
[XECon2016] A-2 임형주 Webpack 실무 적용전략
 
[XECon2016] A-4 조정현 GitHub + Jenkins + Docker로 자동배포 시스템 구축하기
[XECon2016] A-4 조정현 GitHub + Jenkins + Docker로 자동배포 시스템 구축하기[XECon2016] A-4 조정현 GitHub + Jenkins + Docker로 자동배포 시스템 구축하기
[XECon2016] A-4 조정현 GitHub + Jenkins + Docker로 자동배포 시스템 구축하기
 
XECon2015 :: [1-3] 김덕홍 - Git Workflow with GitHub
XECon2015 :: [1-3] 김덕홍 - Git Workflow with GitHubXECon2015 :: [1-3] 김덕홍 - Git Workflow with GitHub
XECon2015 :: [1-3] 김덕홍 - Git Workflow with GitHub
 
XECon2015 :: [2-2] 박상현 - React로 개발하는 SPA 실무 이야기
XECon2015 :: [2-2] 박상현 - React로 개발하는 SPA 실무 이야기XECon2015 :: [2-2] 박상현 - React로 개발하는 SPA 실무 이야기
XECon2015 :: [2-2] 박상현 - React로 개발하는 SPA 실무 이야기
 
XECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravel
XECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravelXECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravel
XECon2015 :: [2-1] 정광섭 - 처음 시작하는 laravel
 
XECon2015 :: [1-2] 이현석 - Learning Laravel
XECon2015 :: [1-2] 이현석 - Learning LaravelXECon2015 :: [1-2] 이현석 - Learning Laravel
XECon2015 :: [1-2] 이현석 - Learning Laravel
 

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

  • 1. XE 코어 구조론 김동현 / 銀童 / dh1024@gmail.com 써드파티 개발자를 위한 XE 의 각 구성요소와 역할 & 개발에 필요한 코어 이해
  • 2. 이번 강의의 목표 • XE 를 이루는 구조가 어떤 것들이 있는지, 그것이 어떤것 인지 개념을 파악한다. • XE 가 어떤 과정으로 실행되는지, 그 과정중에는 어떠한 작업들이 이루어지는지 파악한다. • 그외 기타 개발에 유용한 정보들을 얻는다.
  • 3. XE 코어란? • 코어란? • 흔히 쓰이는 정의 : Xpressengine 사이트에서 배포되는 XE 배포본 • 우리가 오늘 다루고자 하는 정의 : 기본적으로 포함된 모듈을 제외한 실제 코어 • 예 ) XE 1.7.4를 보면 document 모듈을 사용하는 board 모듈이 포함되어있지만, 이경 우 board 모듈과, document 모듈은 기본 배포되는 모듈로 코어라고 정의하지 않음. • 코어란? XE 기반 모듈, 애드온, 위젯등이 돌아갈수 있도록 만들어둔 기본 골격
  • 4. XE 의 구조의 기본 • XE의 모든 요청은 index.php 에서 처리한다. • 모든 HTML 페이지는 모듈의View 를 통해서 만들어진다. • XE 코어의 기본 기능도 기본적으로 제공되는 모듈의 View 등을 통해서 페이지를 출력시킴
  • 5. XE 의 구성 요소 • 모듈 • 스킨, 템플릿 • 위젯 • 레이아웃 • 애드온
  • 6. 모듈 • 모듈이란? • XE 기반에서 돌아가는 프로그램. • XE 의 모든 요청은 모듈을 기반으로 되어있다. • 한번에 한개의 모듈을 실행한다. 단 트리거등으로 다른 모듈이 끼 어들어서 특정 함수를 실행시킬수 있다.
  • 7. MVC 패턴에 대한 간략한 소개 • Model : 데이터를 처리하고 기타 필요한 공용 로직 • View : 출력을 담당하는 부분 • Controller : 특정 행동을 취하는 부분 • MVC 를 반드시 엄격하게 준수할 필요는 없다. 
 필요하다면 자신들의 클래스를 추가해서 사용해도 된다 • 예 ) document 모듈은 문서 각각을 하나의 객체로 처리하며, 
 해당부분을 document.item.class.php 에서 DocumentItem이라는 항목으로 사용. • 하지만 View 와 Controller 는 확실히 구별해두어야 한다.
  • 8. 트리거 • 모듈에서 특정 시점에 끼어들어서 함수를 실행시켜주기 위한 장치 • 예 ) 포인트 모듈에서 글을 작성하면 포인트를 주는경우, 포인트 모듈은 글이 작성되는 시점에 끼어 들어서 포인트를 주는 과정을 수행한다. • 트리거가 끼어들수 있는 시점은 트리거용으로 선언한 부분에 끼어들수 있다. • $trigger_output = ModuleHandler::triggerCall(‘모듈.트리거이름',‘시점(before, after)’, $넘길 변수); • 넘길 변수를 가지고서 체크해서 별도의 루틴을 사용하거나, 참조된 변수를 이용해서 데이터를 변조 하는등의 역할을 수행할수 있다.
  • 9. 스킨, 템플릿 • 모듈의 view 의 데이터 출력을 특정 HTML출력으로 바꿔주는 부분 • 모듈 아래에 있는 skins 와 tpl 부분은 차이가 없다. • 단 모듈의 관리 부분에서 스킨을 설정이 가능해서 치환이 가능한것이 skins, 그렇지 않은것 이 tpl 로 편의로 나누어져있을뿐. • XE문법을 PHP코드로 변환한뒤에 수행하기때문에 {@ }로 넣은 소스와 <?php ?> 로 넣은 소스는 동일하게 작동하지 않는다. • 예를들면, {$board_title}은 php로 변환되면 <?=Context::get(‘board_title’)?>이 된다.
  • 10. 위젯 • 위젯은 분리해서 사용할수 있는 작은View 의 역할이다. • 모델에서 view 의 역할 : 데이터를 처리해서 출력해줌 • 위젯 : 데이터를 처리해서 출력해줌 • XE 에서는 모듈의 view 가 한번의 리퀘스트에 한개만 지정되기때문에 다양한 view를 동시에 보여줄수 없으므로, 위젯을 사용한다. • 위젯도 스킨을 사용하나 이것도 마찬가지로, 결국 모듈의 view의 스킨, 템플릿과 동일하다. • 위젯은 특정 HTML 코드로 로드해서 사용하며, 해당 코드는 템플릿 컴파일 과정에서 특정 함수로 바뀌게 된다. • 템플릿 컴파일을 통하지 않고 위젯 내용을 불러올수도 있다. (widget 모듈의 controller 의 excute 함수)
  • 11. 레이아웃 • 레이아웃이란? • 사이트의 전체적인 틀. • $content 변수를 통해서 모듈의View 를 출력. • 혹은 위젯을 출력가능 (위젯코드 사용) • 최종적으로 완성된 레이아웃은 /common/tpl/common_layout.html 의 파일 안쪽 에 들어가게 된다.
  • 12. COMMON LAYOUT • 기본 HTML 헤더와, JS, CSS 를 로딩한다. • 관리자일경우 Admin Bar 를 최 상단에 생성한다. • javascript 에서 쓰일 기본적인 언어셋을 정의한다. • favicon 등 설정된 내역을 출력한다. • 이러한 처리를 해주는 기본 레이아웃이 있기떄문에 XE 의 레이아웃에서는 HTML 구조를 생성하 지 않고 <body>태그 안쪽에 들어갈 내용만 작성하게 된다. • 모바일과 PC 화면은 별도의 common layout 을 사용하게 된다. 애드온등의 개발을 할떄 요주의.
  • 13. 애드온 • 특정 시점에서 호출되서 실행되는 코드 • 예 ) before_module_init : 모듈 실행전
 before_display_content : 결과물 호출전 • 실제로 특정 시점에서 특정 애드온을 호출하는게 아니라 ‘모든 애드온’을 호 출하기때문에 애드온 상단에 호출 시점을 체크하는것이 필요. • 코어를 수정하지 않고, 입력값을 수정하거나 특정 시점에서 끼어들기 위한것.
  • 14. 트리거VS 애드온 • 둘의 기능은 유사하나 차이점도 있다. • 트리거는 변수를 전달받아서 처리 가능한 반면에 애드온은 특정 변 수를 넘겨받을수는 없다. 전역변수의 수정만 가능하다. • 트리거는 DB 에서 트리거 목록을 가지고 특정 시점에서 해당 트리 거만 처리하는 반면에 애드온은 모든 애드온을 체크하므로, 애드온 이 많아지게되면 성능 저하가 있을수 있다. (애드온이 1000개라면?)
  • 15. XE 의 실행과정 Request index.php 로 GET / POST 방식으로 요청 Context Initialize Context 클래스를 초기화 / 언어 / 로그인 정보등 확인 Module Initialize 어떤 모듈을 불러오는지 결정한후 실행 준비 Module 모듈을 실행하고 화면 출력할 내용을 준비 Display content 정해진 규격에 따라서 내용을 출력
  • 16. CONTEXT 클래스 초기화 • INDEX.PHP 로 초기 리퀘스트가 들어오면 실행 • 요청된 방식을 확인(HTML, XML,JSON) • GET 이나 POST로 들어온 요청값들을 정리 • /files/config/db.config.php 의 db 정보를 불러옴 • 사이트의 기본 모듈정보와 같은 사이트 기본 세팅정보를 불러옴 • 사용할 언어를 확정하고 해당 언어를 불러옴 • 해당 세션을 확인해서 로그인 여부를 확인하고 로그인 정보를 저장해둠.
  • 17. • 기본적으로 최종적인 모든 모듈 수행이 종료된뒤 출력되는 데이터는 입력되는 데이터와 같은 종류로 출력되게 된다. • 이러한 출력데이터는 Context::setRespondMethod 함수를 통해서 설정하던가, HTTP 리퀘스트의 헤더를 조작해서 자 신이 얻고자 하는 데이터를 얻을수 있다. • HTML(GET/POST), JSON, XML이든 어느 방식으로 접근 해도 Context::getRequestVars()를 통해서 얻어낼수 있다.
  • 18. 모듈 준비 단계 • 요청값에서 모듈을 찾아내기 위한 값들을 추출
 (module, act, mid, document_srl, module_srl ..) • XSS 방어, SSL 적용여부 체크 • 트리거 호출 (moduleHandler.init (before & after)) • 실행할 모듈을 찾음
  • 19. 모듈 실행 단계 ! • 모듈 실행전 실행할 모듈의 action 을 지정하고, 필요한 자원을 불러오는 과정. • 모듈 실행을 수행하고, 접근 권한을 체크, 해당 모듈의 act 함수 실행 : $this- >{$this->act}(); • 모듈 처리 시점에서 트리거 작동 • 모듈의 action 은 xml파일에서 설정을 가져와서 실행되게 됨
  • 20. • 요청된 act 가 없을경우 xml 상에 정의된 index act 를 사용. • xml데이터를 비교하여, ruleset 적용, standalone 체크 • admin 이 들어간 act 인경우 관리자가 아니면 실행되지 않 도록 권한 체크 • 모듈의 init() - 초기화 함수 실행 • 모듈 설정값 load
  • 21. 화면 출력 단계 • 모듈 실행의 결과를 출력하는 단계, HTML이냐, JSON이나 XML이냐 에 따라서 출력 방법이 달라짐. • 레이아웃, common_html등과 합쳐진 템플릿을 컴파일 후에 출력 • json이나 xml 일 경우 주어진 데이터를 스킨 컴파일 과정을 통하지 않 고 해당 데이터를 바로 출력. • 트리거 실행
  • 22. • 출력 방법이 HTML 인 경우 • 템플릿으로 지정된 부분을 컴파일한뒤 HTML을 만들어서 최종 반환한다. 이후 레이 아웃, 기본 레이아웃등과 합쳐지는 HTML 출력 과정을 거친다. • 출력 방법이 XML/JSON 인 경우 • 해당 모듈 Instance 에 추가된 변수들을 직렬화 시켜서, XML, JSON 형태로 출력시 킨다. 이경우 레이아웃을 거치지 않는다. • ex) board 모듈의 board.api.php (XML, JSON등일경우 별도로 실행되는 API클래 스) 의 문서 목록을 가져오는 함수의 경우, $oModule- >add(‘document_list’,$document_list); 와 같이 모듈 정보에 document_list 자체를 넣어둔다.
  • 23. 코어의 구성 클래스 • Cache, Context, DB, Display, Extravar, File, FrontendFile, HttpRequest, Mail, Module 등등의 기본 클래스 존재 • 오늘 알아볼것은, 서드파티 개발에서 참조해서 사용할수 있는 몇가지 클래스들의 유용한 사용법. 역할에 대해서 알아봄
  • 24. DB 클래스 • 데이터베이스에 접근하는 클래스 • DB::getInstance() 를 통해서 DB 인스턴스의 생성 가능. • 해당 인스턴스 생성후 _query() 함수를 통해서 XML 쿼리문이 아닌 SQL 자체의 사용도 가능 • 단 해당 방식의 경우 DB 호환성이 문제가 될수있고, table_prefix 등이 문제가 될수있기 때문에 그점을 고려해서 XML쿼리가 지원되지 않는 형식의 쿼리를 쓸때에 한정해서 table_prefix 값을 가져와서 사용 하도록 하는것이 필요하다. • _fetch 된 값은 1개일경우, Object 로, 여러개일경우 Object 의 배열로 리턴된다, 그것을 모두 배열로 처리시키기 위해서는 _fetch($query, 0) 식으로 하나의 변수를 더 넘겨주면 된다.
  • 25. CACHE 클래스 • XE 의 캐시를 처리할수 있는 클래스 • Cachehandler::getInstance()로 캐시 클래스를 가져와서. get, put, delete, 등으로 캐시 클래스의 처리 가능 • GroupKey 개념 사용. GroupKey 는 특정 부분의 그룹의 캐시들이 업데이트가 필요할경우 캐시 를 제거하기 위한 방법 • 예 ) document list 에 관련된 캐시들의 경우 새로운 document 가 추가되면 모두 새롭게 캐시 를 생성해야한다. 이경우 documentList 의 그룹키를 갱신해서 모든 캐시가 새롭게 가져오도록 설정.
  • 26. FILE 클래스 • FILE 을 처리하는 클래스 • 디렉토리를 복사하거나, 파일을 쓸때 경로가 구축되어있지 않을경우 디렉토리도 생성해주는등 편리한 함수가 많다. • /classes/file/FileHandler.class.php
  • 27. • FileHandler::removeFilesInDir - 디렉토리 내부에 있는 파일 삭 제 • FileHandler::filesize - 파일사이즈 반환(KB, MB등으로 표시) • FileHander::getRemoteResource - 원격 파일 읽어오기 • FileHandler::getRemoteFile - 원격 파일을 지정된 곳에 다운받기 • 그외 사용에 편리한 다양한 함수들이 있으니, 직접 확인해보시기 바랍니다.
  • 28. MAIL 클래스 • PHPMailer 를 이용해서 메일 발송 • Google SMTP 를 이용해서도 메일의 발송이 가능하다. • useGmailAccount($account_name, $account_passwd) 함수 사 용 • 메일에 파일을 첨부하는등의 처리를 자동으로 처리해준다.
  • 29. XE 개발 디버깅 방법 • debugPrint()를 통한 디버깅 방법 • debugPrint() 함수를 통해서 전달되고있는 변수, 해당 시점이 실행되는지 등의 여부를 테스트 할수 있다. • debugPrint() 로 인해서 출력된 내용은 firephp, HTML 하단, 별도의 디버깅용 파일에 쓰여짐 중의 한 방식으로 출력할수 있다. • 보통 print_r 이나 var_dump 같은걸로 디버깅을 하는 경우가 많지만, controller 등의 경우 그것을 사용하기 어렵기때문에, debugPrint()를 사용하는것을 강하게 추천한다.
  • 30. Q & A • 수고하셨습니다.