SlideShare a Scribd company logo
1 of 60
Download to read offline
1
오승훈
@akasima
• XE 커뮤니티 개발 그룹
• XE3 개발
• Database, Document, DynamicField,
Presenter..
• XE3 게시판 플러그인 개발

2
목차
33
플러그인 제작
플러그인 생성 관리자 사이트맵에서 메뉴 생성 라우트 등록
인터셉션
데이터 베이스
Manual 플러그인
4
Manual 플러그인 요구사항
5
카테고리 도큐먼트
관리자 > 사이트맵에서 메뉴 생성
6
플러그인 생성
7
플러그인 규칙
디렉토리이름은 소문자, 숫자와 언더스코어(언더바)로 작성
plugin.php, composer.json 필수
8
plugin.php - 필수 요소1
9
<?php

namespace Akasima;



use …;



class Plugin extends AbstractPlugin

{

/**

* 이 메소드는 활성화(activate) 된 플러그인이 부트될 때 항상 실행됩니다.

*

* @return void

*/

public function boot()

{

}
AbstractPlugin
10
http://api.xpressengine.io
11
플러그인 코어 패키지
플러그인
플러그인 코어 패키지는 플러그인에게
묻고 싶은게 많습니다.
12
<?php



abstract class AbstractPlugin

{

public static function getId()


public static function getIdWith($postfix =
'', $delimiter = '::')

public function activate($installedVersion =
null)



public function deactivate($installedVersion
= null)



public function install()



public function
checkInstall($installedVersion = null)



public function update($installedVersion =
null)



public function checkUpdate($currentVersion =
null)



public function uninstall()



abstract public function boot();



public function getSettingsURI()



public static function getPath($path = '')



public static function asset($path, $secure =
composer.json - 필수 요소2
13
{

"name": "xpressengine-plugin/
my_plugin",

"description": "플러그인소개",

"keywords": [

"xpressengine",

"plugin"

],

"license": "LGPL-2.0",

"version": "1.0.0",

"type": "xpressengine-plugin",

"support": {

"email": "email@email.com"

},

"authors": [

{

"name": "input your name",

"email": "input@your.email",

"homepage": "http://
mysite.com",

"role": "Developer"

}

],

"extra": {

"xpressengine": {

"title": "my_plugin_title",

"icon": "myicon.png",

"component": []

}

},

"repositories": [

{

"type": "composer",

"url": "http://
packagist.xpressengine.io/"

}

],

"require": {



},

"autoload": {

"psr-4": {

"Akasima": "src/"

}

}

}

app/Console/Commands/stubs/composer.json.stub 복사
플러그인 생성 완료
14
composer.json
pluing.php
플러그인 생성 확인
15
플러그인 켜기
16
플러그인 동작 확인
17
public function boot()

{

$this->route();

}



protected function route()

{

// implement code



Route::fixed($this->getId(), function () {

Route::get('/', [

'as' => 'my_plugin::index',

'uses' => function (Request $request) {

echo "Hello World";

}

]);

});

}
어렵다!!
간단한 command 제공
19
php artisan make:plugin my_plugin Akasima my_plugin_title
20
vendor
view
생성된 디렉토리
assets
src
composer.json
pluing.php
js, css, image
PHP source
템플릿
21
메뉴 추가
22
컴포넌트?
my_plugin
테마 스킨 매뉴얼
위젯 게시판 스킨
플러그인은 설치/실행 등 기능 꾸러미 관리의 목적
플러그인은 여러개의
기능 요소로 이루어짐
(컴포넌트가 있을 수 있음)
23
컴포넌트
Interface XE3
ModuleAbstractModule 모듈
SkinAbstractSkin 스킨
ThemeAbstractTheme 테마
WidgetAbstractWidget 위젯
UIObjectAbstractUIObject UI Object
DynamicFieldAbstractType FieldType
DynamicFieldAbstractSkin FieldSkin
24
ComponentInterface
25
ComponentInterface
26
컴포넌트 ID
플러그인 코어 패키지
my_plu
테마 스킨 매뉴
위젯 게시판
저 등록좀 해주세요~
그리고 저 한테 컴포넌트도 있으니까
이 애들도 등록할께요
27
컴포넌트 ID
플러그인 코어 패키지
my_plu
테마 스킨 매뉴
위젯 게시판
저 등록좀 해주세요~
그리고 저 한테 컴포넌트도 있으니까
이 애들도 등록할께요
플러그인 코어 패키지
컴포넌트
28
컴포넌트 ID
플러그인 코어 패키지
my_plu
테마 스킨 매뉴
위젯 게시판
Register 코어 패키지
에 컴포넌트 등록
29
컴포넌트 ID
등록된 컴포넌트 리스트
컴포넌트 ID란?
module/board@board
module/my_plugin@manual
컴포넌트종류/플러그인@컴포넌트이름
컴포넌트 ID
module/board@board
module/my_plugin@manual
// my_plugin 에서 등록한 게시판 모듈용 redSkin
module/board@board/skin/my_plugin@redSkin
// my_plugin 에서 등록한 매뉴얼 모듈용 redSkin
module/my_plugin@manual@skin/my_plugin@blueSkin
컴포넌트종류/플러그인@컴포넌트이름/컴포넌트종류/플러그인@컴포넌트이름
대상아이디/컴포넌트종류/플러그인@컴포넌트이름
32
src/Manual.php
<?php

namespace Akasima;



use XpressengineModuleAbstractModule;



class Manual extends AbstractModule

{

public static function getInstanceSettingURI($instanceId)

{

}



public function createMenuForm()

{

}



public function storeMenu($instanceId, $menuTypeParams,
$itemParams)

{

}



public function editMenuForm($instanceId)

{

33
MenuTypeInterface
34
Composer.json - 컴포넌트 등록
"extra": {

"xpressengine": {

"title": "my_plugin_title",

"icon": "myicon.png",

"component": {

“module/my_plugin@manual": {

"class": "AkasimaManual",

"name": "Manual",

"description": "akasima 매뉴얼 모듈",

"screenshot" : [

“/plugins/my_plugin/assets/img/screenshots/
akasimaManual.jpg"

]

}

}

}

},
35
메뉴 컴포넌트 추가
36
메뉴를 추가할 수 있습니다.
37
Routing
라우팅 설정이 없음
38
Routing 등록
공식사이트, Laravel 문서 참고
39
Routing 등록
http://xpressengine.io/docs/3.0/Routing
40


class Manual extends AbstractModule

{

public static function boot()

{

Route::instance(self::getId(), function () {

Route::get('', ['as' => 'index', 'uses' =>
'UserController@index']);

Route::get('/edit', ['as' => 'edit', 'uses' =>
'UserController@edit']);

Route::post('/update', ['as' => 'update', 'uses' =>
'UserController@update']);

}, ['namespace' => 'Akasima']);

}
Routing 등록
41
namespace Akasima;



use AppHttpControllersController;



class UserController extends Controller

{

public function index()

{

return Presenter::make('my_plugin::views.manual.index');

}



public function edit()

{

return 'edit';

}



public function update()

{

return 'update';

}

}
Routing 등록
UserController.php
42
<strong>메인페이지 입니다</strong>



<a href="{{instanceRoute('edit')}}">수정페이지</a>

view blade
views/manual/index.blade.php
43
44
하고 싶은 이야기는 많지만..
12월 12일 오픈 세미나가 있습니다.
더 자세한 얘기는 XEHub 에서
45
Interception
46
Interception
Hook Event Trigger
47
AOP
interception(가로채는) 을 구현하기 위해 AOP 를 도입
AOP
관점지향 프로그래밍
Aspect Oriented Programming
[Documentation]
49
Proxy 생성
Service provider 에 정의되어있습니다.
50
Interception 사용
인터셉션 등록은 plugin boot() 메소드에 정의
intercept(

'Comment@add',

'notification.comment.add',

function ($addFunc, CommentEntity $comment,
MemberEntityInterface $user = null) {


/**

* @var $commentNotificator CommentNotificator

*/

$commentNotificator =
app('xe.notification.notificator.comment');

$commentNotificator->notify($comment);



$commentEntity = $addFunc($comment, $user);



return $commentEntity;

}

);
51
Interception 사용
댓글 작성시 알림 발송(알림센터)
intercept(

'Comment@add',

'notification.comment.add',

function ($addFunc, CommentEntity $comment,
MemberEntityInterface $user = null) {


/**

* @var $commentNotificator CommentNotificator

*/

$commentNotificator =
app('xe.notification.notificator.comment');

$commentNotificator->notify($comment);



$commentEntity = $addFunc($comment, $user);



return $commentEntity;

}

);
동작 시점
코드
실제 동작 대상 실행
52
Interception 사용
댓글 작성시 알림 발송 - 댓글
intercept(

'Comment@add',

'notification.comment.add',

function ($addFunc, CommentEntity $comment,
MemberEntityInterface $user = null) {


$commentEntity = $addFunc($comment, $user);



/**

* @var $commentNotificator CommentNotificator

*/

$commentNotificator =
app('xe.notification.notificator.comment');

$commentNotificator->notify($comment);



return $commentEntity;

}

);
데이타 베이스 사용하기
53
데이타 베이스
54
트랜잭션
55
intercept(

'Comment@add',

'notification.comment.add',

function ($addFunc, CommentEntity $comment,
MemberEntityInterface $user = null) {


XeDB::beginTransaction();



$commentNotificator =
app('xe.notification.notificator.comment');

$commentNotificator->notify($comment);



$commentEntity = $addFunc($comment, $user);



XeDB::commit();


return $commentEntity;

}

);
트랜잭션
56
intercept(

'Comment@add',

'notification.comment.add',

function ($addFunc, CommentEntity $comment,
MemberEntityInterface $user = null) {


XeDB::beginTransaction();



$commentNotificator =
app('xe.notification.notificator.comment');

$commentNotificator->notify($comment);



$commentEntity = $addFunc($comment, $user);



XeDB::commit();


return $commentEntity;

}

);
데이터 베이스 테이블
57
if (Schema::hasTable(‘table_name') === false) {

Schema::create('table_name', function (Blueprint $table) {

$table->increments('id');

$table->string('instanceId', 255);

$table->string('title', 255);



$table->index(array('title'));

});

}
디버깅
58
/storage/log/laravel.log 참고
APP_DEBUG=true
/.env
캐시 삭제
59
php artisan xeCache:clear
감사합니다
60

More Related Content

What's hot

Laravel 로 배우는 서버사이드 #1
Laravel 로 배우는 서버사이드 #1Laravel 로 배우는 서버사이드 #1
Laravel 로 배우는 서버사이드 #1성일 한
 
Eclipse 4 RCP - 2nd Week
Eclipse 4 RCP - 2nd WeekEclipse 4 RCP - 2nd Week
Eclipse 4 RCP - 2nd WeekTaewoo Kim
 
XECon2015 :: [1-1] 안정수 - XE3 구조 및 기본기
XECon2015 :: [1-1] 안정수 - XE3 구조 및 기본기XECon2015 :: [1-1] 안정수 - XE3 구조 및 기본기
XECon2015 :: [1-1] 안정수 - XE3 구조 및 기본기XpressEngine
 
[오픈소스컨설팅]Spring 3.1 Core
[오픈소스컨설팅]Spring 3.1 Core [오픈소스컨설팅]Spring 3.1 Core
[오픈소스컨설팅]Spring 3.1 Core Ji-Woong Choi
 
Python packaging
Python packagingPython packaging
Python packagingJi Hun Kim
 
처음 시작하는 라라벨
처음 시작하는 라라벨처음 시작하는 라라벨
처음 시작하는 라라벨KwangSeob Jeong
 
안드로이드 와 디바이스 드라이버 적용 기법
안드로이드 와 디바이스 드라이버 적용 기법안드로이드 와 디바이스 드라이버 적용 기법
안드로이드 와 디바이스 드라이버 적용 기법chon2010
 
실무에서 라라벨 테스트를 작성하다 알게 된 것
실무에서 라라벨 테스트를 작성하다 알게 된 것실무에서 라라벨 테스트를 작성하다 알게 된 것
실무에서 라라벨 테스트를 작성하다 알게 된 것Hyun-Seok Lee
 
Eclipse rcp - first week
Eclipse rcp - first weekEclipse rcp - first week
Eclipse rcp - first weekTaewoo Kim
 
올챙이로 살펴보는 Eclipse개발
올챙이로 살펴보는 Eclipse개발올챙이로 살펴보는 Eclipse개발
올챙이로 살펴보는 Eclipse개발cho hyun jong
 
xecon-phpfest2014composer
xecon-phpfest2014composerxecon-phpfest2014composer
xecon-phpfest2014composerjhyeon1010
 
[H3 2012] Bridge over troubled water : make plug-in for Appspresso
[H3 2012] Bridge over troubled water : make plug-in for Appspresso[H3 2012] Bridge over troubled water : make plug-in for Appspresso
[H3 2012] Bridge over troubled water : make plug-in for AppspressoKTH, 케이티하이텔
 
Selenium and XpressEngine
Selenium and XpressEngineSelenium and XpressEngine
Selenium and XpressEngineSol Kim
 
Selenium for-ui-test
Selenium for-ui-testSelenium for-ui-test
Selenium for-ui-test승훈 오
 
Flask! - python web framework flask 튜토리얼
Flask! - python web framework flask 튜토리얼Flask! - python web framework flask 튜토리얼
Flask! - python web framework flask 튜토리얼mangonamu
 

What's hot (20)

Eclipse RCP 1/2
Eclipse RCP 1/2Eclipse RCP 1/2
Eclipse RCP 1/2
 
Laravel 로 배우는 서버사이드 #1
Laravel 로 배우는 서버사이드 #1Laravel 로 배우는 서버사이드 #1
Laravel 로 배우는 서버사이드 #1
 
Eclipse 4 RCP - 2nd Week
Eclipse 4 RCP - 2nd WeekEclipse 4 RCP - 2nd Week
Eclipse 4 RCP - 2nd Week
 
XECon2015 :: [1-1] 안정수 - XE3 구조 및 기본기
XECon2015 :: [1-1] 안정수 - XE3 구조 및 기본기XECon2015 :: [1-1] 안정수 - XE3 구조 및 기본기
XECon2015 :: [1-1] 안정수 - XE3 구조 및 기본기
 
Angular2 NgModule
Angular2   NgModuleAngular2   NgModule
Angular2 NgModule
 
[오픈소스컨설팅]Spring 3.1 Core
[오픈소스컨설팅]Spring 3.1 Core [오픈소스컨설팅]Spring 3.1 Core
[오픈소스컨설팅]Spring 3.1 Core
 
Python packaging
Python packagingPython packaging
Python packaging
 
처음 시작하는 라라벨
처음 시작하는 라라벨처음 시작하는 라라벨
처음 시작하는 라라벨
 
안드로이드 와 디바이스 드라이버 적용 기법
안드로이드 와 디바이스 드라이버 적용 기법안드로이드 와 디바이스 드라이버 적용 기법
안드로이드 와 디바이스 드라이버 적용 기법
 
Python andselenium
Python andseleniumPython andselenium
Python andselenium
 
실무에서 라라벨 테스트를 작성하다 알게 된 것
실무에서 라라벨 테스트를 작성하다 알게 된 것실무에서 라라벨 테스트를 작성하다 알게 된 것
실무에서 라라벨 테스트를 작성하다 알게 된 것
 
Eclipse rcp - first week
Eclipse rcp - first weekEclipse rcp - first week
Eclipse rcp - first week
 
올챙이로 살펴보는 Eclipse개발
올챙이로 살펴보는 Eclipse개발올챙이로 살펴보는 Eclipse개발
올챙이로 살펴보는 Eclipse개발
 
xecon-phpfest2014composer
xecon-phpfest2014composerxecon-phpfest2014composer
xecon-phpfest2014composer
 
[H3 2012] Bridge over troubled water : make plug-in for Appspresso
[H3 2012] Bridge over troubled water : make plug-in for Appspresso[H3 2012] Bridge over troubled water : make plug-in for Appspresso
[H3 2012] Bridge over troubled water : make plug-in for Appspresso
 
Swt bot
Swt botSwt bot
Swt bot
 
Maven
MavenMaven
Maven
 
Selenium and XpressEngine
Selenium and XpressEngineSelenium and XpressEngine
Selenium and XpressEngine
 
Selenium for-ui-test
Selenium for-ui-testSelenium for-ui-test
Selenium for-ui-test
 
Flask! - python web framework flask 튜토리얼
Flask! - python web framework flask 튜토리얼Flask! - python web framework flask 튜토리얼
Flask! - python web framework flask 튜토리얼
 

Similar to XECon2015 :: [3-2] 오승훈 - XE3 플러그인 제작 소개

우아한테크세미나-우아한멀티모듈
우아한테크세미나-우아한멀티모듈우아한테크세미나-우아한멀티모듈
우아한테크세미나-우아한멀티모듈용근 권
 
Python study 1강 (오픈소스컨설팅 내부 강의)
Python study 1강 (오픈소스컨설팅 내부 강의)Python study 1강 (오픈소스컨설팅 내부 강의)
Python study 1강 (오픈소스컨설팅 내부 강의)정명훈 Jerry Jeong
 
[KGIT_EWD]class03 0322
[KGIT_EWD]class03 0322[KGIT_EWD]class03 0322
[KGIT_EWD]class03 0322jylee6977
 
공간정보아카데미 - Day1 오픈소스개발 일반
공간정보아카데미 - Day1 오픈소스개발 일반공간정보아카데미 - Day1 오픈소스개발 일반
공간정보아카데미 - Day1 오픈소스개발 일반BJ Jang
 
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법복연 이
 
[0618구경원]초보 게임프로그래머를 위한 c++
[0618구경원]초보 게임프로그래머를 위한 c++[0618구경원]초보 게임프로그래머를 위한 c++
[0618구경원]초보 게임프로그래머를 위한 c++KyeongWon Koo
 
빠르고 지속적으로 전달하기: Continuous Delivery for Android
빠르고 지속적으로 전달하기: Continuous Delivery for Android빠르고 지속적으로 전달하기: Continuous Delivery for Android
빠르고 지속적으로 전달하기: Continuous Delivery for AndroidSangkyoon Nam
 
Linux 강의자료 ed10
Linux 강의자료 ed10Linux 강의자료 ed10
Linux 강의자료 ed10hungrok
 
Unity Auto Build iOS
Unity Auto Build iOSUnity Auto Build iOS
Unity Auto Build iOSGiseok Lee
 
Yeoman(모던웹 개발을 위한 관리도구)설치사용가이드
Yeoman(모던웹 개발을 위한 관리도구)설치사용가이드Yeoman(모던웹 개발을 위한 관리도구)설치사용가이드
Yeoman(모던웹 개발을 위한 관리도구)설치사용가이드수정 김
 
Xe3 a부터 z까지(2) 포인트 적립 플러그인 제작
Xe3 a부터 z까지(2) 포인트 적립 플러그인 제작Xe3 a부터 z까지(2) 포인트 적립 플러그인 제작
Xe3 a부터 z까지(2) 포인트 적립 플러그인 제작승훈 오
 
Laravel 로 배우는 서버사이드 #2
Laravel 로 배우는 서버사이드 #2Laravel 로 배우는 서버사이드 #2
Laravel 로 배우는 서버사이드 #2성일 한
 
PyQGIS와 PyQt를 이용한 QGIS 기능 확장
PyQGIS와 PyQt를 이용한 QGIS 기능 확장PyQGIS와 PyQt를 이용한 QGIS 기능 확장
PyQGIS와 PyQt를 이용한 QGIS 기능 확장MinPa Lee
 
[2015:1] phpdocumentor 설치와 사용법
[2015:1] phpdocumentor 설치와 사용법[2015:1] phpdocumentor 설치와 사용법
[2015:1] phpdocumentor 설치와 사용법Amy Kim
 
Eclipse RAP - Single Source
Eclipse RAP - Single SourceEclipse RAP - Single Source
Eclipse RAP - Single Sourcecho hyun jong
 

Similar to XECon2015 :: [3-2] 오승훈 - XE3 플러그인 제작 소개 (20)

우아한테크세미나-우아한멀티모듈
우아한테크세미나-우아한멀티모듈우아한테크세미나-우아한멀티모듈
우아한테크세미나-우아한멀티모듈
 
Python study 1강 (오픈소스컨설팅 내부 강의)
Python study 1강 (오픈소스컨설팅 내부 강의)Python study 1강 (오픈소스컨설팅 내부 강의)
Python study 1강 (오픈소스컨설팅 내부 강의)
 
Spring boot DI
Spring boot DISpring boot DI
Spring boot DI
 
Electron forge
Electron forgeElectron forge
Electron forge
 
[KGIT_EWD]class03 0322
[KGIT_EWD]class03 0322[KGIT_EWD]class03 0322
[KGIT_EWD]class03 0322
 
공간정보아카데미 - Day1 오픈소스개발 일반
공간정보아카데미 - Day1 오픈소스개발 일반공간정보아카데미 - Day1 오픈소스개발 일반
공간정보아카데미 - Day1 오픈소스개발 일반
 
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
 
[0618구경원]초보 게임프로그래머를 위한 c++
[0618구경원]초보 게임프로그래머를 위한 c++[0618구경원]초보 게임프로그래머를 위한 c++
[0618구경원]초보 게임프로그래머를 위한 c++
 
빠르고 지속적으로 전달하기: Continuous Delivery for Android
빠르고 지속적으로 전달하기: Continuous Delivery for Android빠르고 지속적으로 전달하기: Continuous Delivery for Android
빠르고 지속적으로 전달하기: Continuous Delivery for Android
 
Linux 강의자료 ed10
Linux 강의자료 ed10Linux 강의자료 ed10
Linux 강의자료 ed10
 
JetsonTX2 Python
 JetsonTX2 Python  JetsonTX2 Python
JetsonTX2 Python
 
Introducing Fragments
Introducing FragmentsIntroducing Fragments
Introducing Fragments
 
Unity Auto Build iOS
Unity Auto Build iOSUnity Auto Build iOS
Unity Auto Build iOS
 
Yeoman(모던웹 개발을 위한 관리도구)설치사용가이드
Yeoman(모던웹 개발을 위한 관리도구)설치사용가이드Yeoman(모던웹 개발을 위한 관리도구)설치사용가이드
Yeoman(모던웹 개발을 위한 관리도구)설치사용가이드
 
Xe3 a부터 z까지(2) 포인트 적립 플러그인 제작
Xe3 a부터 z까지(2) 포인트 적립 플러그인 제작Xe3 a부터 z까지(2) 포인트 적립 플러그인 제작
Xe3 a부터 z까지(2) 포인트 적립 플러그인 제작
 
5.Spring IoC&DI(DI와 관련된 어노테이션)
5.Spring IoC&DI(DI와 관련된 어노테이션)5.Spring IoC&DI(DI와 관련된 어노테이션)
5.Spring IoC&DI(DI와 관련된 어노테이션)
 
Laravel 로 배우는 서버사이드 #2
Laravel 로 배우는 서버사이드 #2Laravel 로 배우는 서버사이드 #2
Laravel 로 배우는 서버사이드 #2
 
PyQGIS와 PyQt를 이용한 QGIS 기능 확장
PyQGIS와 PyQt를 이용한 QGIS 기능 확장PyQGIS와 PyQt를 이용한 QGIS 기능 확장
PyQGIS와 PyQt를 이용한 QGIS 기능 확장
 
[2015:1] phpdocumentor 설치와 사용법
[2015:1] phpdocumentor 설치와 사용법[2015:1] phpdocumentor 설치와 사용법
[2015:1] phpdocumentor 설치와 사용법
 
Eclipse RAP - Single Source
Eclipse RAP - Single SourceEclipse RAP - Single Source
Eclipse RAP - Single Source
 

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
 

XECon2015 :: [3-2] 오승훈 - XE3 플러그인 제작 소개