xecon2015 :: [2-4] 오승현 - chak 서비스 구축기 with xe3

75

Upload: xpressengine

Post on 11-Feb-2017

258 views

Category:

Software


5 download

TRANSCRIPT

Page 1: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3
Page 2: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

오승현

• �XE�1�서드파티�개발자�

• �XE�1�Contributor�

• �XECONTEST�2014�수상�

• �CHAK�개발�(15.06�~�)

Page 3: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

오승현

• XE�1�서드파티�개발자�

• �XE�1�Contributor�

• �XECONTEST�2014�수상�

• �CHAK�개발�(15.06�~�)

Page 4: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

What is CHAK?

4

Page 5: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

5

오픈소스�개발자와�사용자간의�커뮤니케이션을�제공

What is CHAK?

Page 6: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

What is CHAK?

6

어디에나�포럼,�코멘트�서비스�제공

Page 7: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

What is CHAK?

7

쉽고�간단한�설치

Page 8: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

What is CHAK?

8

Just�Copy�&�Paste

Page 9: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

What is CHAK?

9

소셜�로그인

Page 10: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

What is CHAK?

10

Syntax�Highlighting

Page 11: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

What is CHAK?

11

파일�업로드

Page 12: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

What is CHAK?

12

Web�Hook

Page 13: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

How to use?

13착!

Page 14: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

How to use?

14착!

Page 15: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

15

어때요�참�쉽죠?

Page 16: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

16

다른�공간,�같은�커뮤니케이션

Page 17: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

Service Preview(서비스�시연)

Page 18: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

SHOW CASE(착�적용�사례)

Page 19: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

SHOW CASE #1

19

D2�Hello�WorldNAVER�개발자들의�실전�노하우와�지식을�담은�기술�블로그

Page 20: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

SHOW CASE #2

20

D2�STARTUP�FACTORYD2�Startup�Factory는�NAVER가�Tech�Startup�생태계�저변�

확대를�위해�만든�Accelerator로,�차별화된�Tech�Startup을�

직접�발굴해�육성하고�있습니다.�

Page 21: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

SHOW CASE #3

21

Laravel�Korean�DocsNaverD2�지원으로�작성된��

라라벨�한국어�메뉴얼�깃허브�페이지

Page 22: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

SHOW CASE #4

22

XpressEngineXpressEngine은 누구나 쉽고 편하고 자유롭게 콘텐츠를 발행을

할 수 있도록 하기 위한 CMS(Content Management System)

Page 23: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

처음 4가지 요구사항(지금은�무한한�∞�요구사항)

Page 24: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

CHAK 서비스 기본 요구사항

24

어디에나�착!�붙어야함1

SPA�(Single�Page�Application)2

커뮤니케이션�(댓글,�포럼)3

소셜�로그인�(SNS�Login)4

Page 25: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

25

SPA�(Single�Page�Application)

Page 26: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

SPA (Single Page Application)

26

- Wikipedia

A single-page application (SPA) is a web application or web site that fits on a single web page with the goal of providing

a more fluid user experience akin to a desktop application

웹 어플리케이션

데스크탑 어플리케이션과 같은 사용자 경험을 제공

Page 27: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

SPA (Single Page Application)

27

Page 28: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

SPA (Single Page Application)

28

Lots of people use React as the V in MVC. Since React makes no

assumptions about the rest of your technology stack, it's easy to try it out

on a small feature in an existing project.

JUST UIReact abstracts away the DOM from you, giving a simpler programming

model and better performance. React can also render on the server using Node, and it can power native apps

using React Native.

Virtual DOMReact implements one-way reactive data flow which reduces boilerplate and is easier to reason about than

traditional data binding.

DATA FLOW

https://facebook.github.io/react/

Page 29: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

SPA (Single Page Application)

29

Page 30: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

SPA (Single Page Application)

30

Request

Response

SERVER

Page 31: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

31

Page 32: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

1,300개 이상의 XE 모듈, 스킨, 애드온 …

32

Page 33: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

서비스에 필요한 모듈만 따로 구현

33

+ CHAK SERVICE Module

Page 34: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

XpressEngine with React

34

+ CHAK SERVICE LOGIC

Application

Request

Response

Page 35: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

XE1 으로 서비스를 만들다보니

35

안되는게�있어?�XE�코어를�수정해!

Page 36: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

XE1 으로 서비스를 만들다보니

36

수정하고�나니�업데이트가�불안하다

Page 37: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

XE1 으로 서비스를 만들다보니

37

UI�테스트만�믿고�가야하나?

2014 XECON - Selenium for UI Test 오승훈 XE 커뮤니티 개발 그룹

Page 38: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

Xpress Engine3로 착 서비스 확장하기(실제�CHAK�서비스에서�활용중인�패키지�소개)

Page 39: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

XE3에서 강화된 특징

39

• Modern�PHP�(Autoloading,�Composer,�etc)�

• 라라벨(Laravel)�프레임워크�기반의�오픈소스�CMS�

• 유용한�XE3�Core�Packages�

• Cloud�File�System�

• Testable�(Unit�test)

Page 40: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

Autoloading, PSR-4

40

XE1

모듈에서 따로 구현한 클래스는 include 해야함

Page 41: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

Michael님의 유튜브(YouTube) 모듈

41

Page 42: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

Autoloading, PSR-4

42

XE3

현재 클래스의 네임 스페이스를 지정

필요한 클래스들을 로드

Page 43: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

Composer & Packagist

43

Composer is a brilliant dependency manager for PHP. List your project’s dependencies in a composer.json file and, with a few simple commands, Composer will automatically download your project’s dependencies and setup autoloading for you.

There are already a lot of PHP libraries that are compatible with Composer, ready to be used in your project. These “packages” are listed on Packagist, the official repository for Composer-compatible PHP libraries.

composer require phpunit/phpunit

Page 44: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

Laravel 프레임워크 기반의 오픈소스 CMS

44

Page 45: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

Authentication

Billing

Elixir

Authorization

Cache

Encryption

Events

Helpers

Package Development

Filesystem

Localization

Pagination

Redis Session

Artisan Console

Collections

Errors & Logging

Hashing

Mail

Queues

SSH Tasks

Task Scheduling Testing Validation

Page 46: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

유용한 XE3 코어 패키지

Xpressengine\Config

Xpressengine\Category

Xpressengine\Interception

Xpressengine\Comment

Xpressengine\Document

Xpressengine\Keygen

Xpressengine\Menu

Xpressengine\Register

Xpressengine\Site

Xpressengine\Permission

Xpressengine\Routing

Xpressengine\Skin

Xpressengine\Tag Xpressengine\Temporary

Xpressengine\Counter

Xpressengine\DynamicField

Xpressengine\Media

Xpressengine\Database

Xpressengine\Http

Xpressengine\Member

Xpressengine\Plugin

Xpressengine\Seo

Xpressengine\Storage

Xpressengine\Presenter

Xpressengine\Settings

Xpressengine\Support

Xpressengine\Theme Xpressengine\ToggleMenu

Xpressengine\Translation Xpressengine\Trash Xpressengine\UIObject Xpressengine\Widget

Page 47: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

CHAK with Laravel & XE3

47

Page 48: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

Event System with Queued Job

48

Laravel's events provides a simple observer implementation,

allowing you to subscribe and listen for events in your application

Events and Queues

Page 49: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

<?php class documentController extends document{ function insertDocument() { // Insert data into the DB $output = executeQuery('document.insertDocument', $obj); if(!$output->toBool()) { $oDB->rollback(); return $output; }

ModuleHandler::triggerCall('document.insertDocument', 'before', $obj); }

Event System (XE 1 Trigger)

49

Page 50: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

class DocumentHandler{ public function insertDocument($doc) { $this->insertDoc($doc); Event::fire(new DocumentInserted($doc)); return $doc; }

Event System (Laravel)

50

.

.

.

Page 51: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

class EventServiceProvider extends ServiceProvider{ /** * The event listener mappings for the application. * * @var array */ protected $listen = [ ArticleWasDeleted::class => [ DeleteArticleUser::class, RemoveFileFromStorage::class, WebhookQueueSender::class, DeleteArticleCodes::class, DeleteArticleFiles::class, DeleteArticleLinks::class, DeleteArticleTags::class, DeleteArticleVotes::class, DeleteArticleChildren::class ],

Event System (Laravel)

51

웹훅도 날려야하고.. 클라우드서버에서 파일도 삭제해야하고..

자식 댓글도 삭제해야하니.. Recursive하게 다시 파일을 삭제하고..

Page 52: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

Event System with Queued Job

52

출처 : 생활코딩

Page 53: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

class DeleteArticleFiles implements ShouldQueue{ use InteractsWithQueue; /** @var Log */ private $log; /** @var FileRepositoryInterface */ private $articleFiles;

Event System with Queued Job

53

ShouldQueue 인터페이스 상속만으로 비동기 작업 처리

.

.

.

Page 54: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

Event System with Queued Job

54

바로응답

ArtisanListen

출처 : 생활코딩

Page 55: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

Cloud File System

55

Filesystem / Cloud Storage

The Laravel Flysystem integration provides simple to use drivers for working with local

filesystems, Amazon S3, and Rackspace Cloud Storage.

Page 56: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

Cloud File System

56

Storage::disk('local')->put('file.txt', 'Contents');

Page 57: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

Cloud File System (Custom Disk)

57

League/Flysystem/AdapterInterface

Page 58: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

XE3 Config with CHAK

58

XE3의 Config 패키지는 XE3 에서 각종 설정 정보를 저장하고 관리하며

Hierarchy 구조로 상위 참조가 가능한 key - value 저장소

Xpressengine\Config

Page 59: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

XE3 Config with CHAK

59

사용자 (Naver)

코멘트1

CHAK SERVICE

사용자 (XE)

코멘트2 코멘트3 포럼1 포럼2 포럼3

포럼 혹은 코멘트 인스턴스

인스턴스를 관리할 수 있는 그룹

Page 60: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

사용자 (Naver)

코멘트1

CHAK SERVICE

사용자 (XE)

코멘트2 코멘트3 포럼1 포럼2 포럼3

XE3 Config with CHAK

60

착 포럼 인스턴스에 대한 설정(스킨) 정보를 요청

{"skin" : null

}

Page 61: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

사용자 (XE)

XE3 Config with CHAK

61

사용자 (Naver)

코멘트1

CHAK SERVICE

코멘트2 코멘트3 포럼1 포럼2 포럼3

{"skin" : null

}

부모(Parent)의 설정 정보를 요청

Page 62: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

사용자 (XE)사용자 (Naver)

코멘트1

CHAK SERVICE

코멘트2 코멘트3 포럼1 포럼2 포럼3

XE3 Config with CHAK

62

기본 Default 설정 정보를 요청

{"skin" : "default"

}

Page 63: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

XE3 Config with CHAK

63

Cfg::get(‘chak.upgle.1000-0000’);

Instance ID

group ID

CHAK Service

[ . ] 으로 구분되는 구분자(델리미터)를 통해서 설정 정보를 가져올 수 있다.

Page 64: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

유용한 XE3 코어 패키지

Xpressengine\Config

Xpressengine\Category

Xpressengine\Interception

Xpressengine\Comment

Xpressengine\Document

Xpressengine\Keygen

Xpressengine\Menu

Xpressengine\Register

Xpressengine\Site

Xpressengine\Permission

Xpressengine\Routing

Xpressengine\Skin

Xpressengine\Tag Xpressengine\Temporary

Xpressengine\Counter

Xpressengine\DynamicField

Xpressengine\Media

Xpressengine\Database

Xpressengine\Http

Xpressengine\Member

Xpressengine\Plugin

Xpressengine\Seo

Xpressengine\Storage

Xpressengine\Presenter

Xpressengine\Settings

Xpressengine\Support

Xpressengine\Theme Xpressengine\ToggleMenu

Xpressengine\Translation Xpressengine\Trash Xpressengine\UIObject Xpressengine\Widget

너무 많아서 다 보여드릴수가 없어요!

Page 65: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

Artisan Command 를 통한 서비스 관리

Page 66: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

Artisan Command

Artisan Command 를 통한 서비스 관리 (스케쥴링)

Linux Cron Job

http://laravel.com/docs/5.1/scheduling

Page 67: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

Unit Testing

$_SESSION 글로벌 변수에 의존하고 있기도 하고…

Testable XE3

Page 68: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

Unit Testing (XE1)

$_SESSION 글로벌 변수에 의존하고 있기도 하고…

다른 Class의 인스턴스를 런타임 중에 받아오고

Page 69: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

Unit Testing (DI)

class User {public function getCurrentUser() {

$user_id = $_SESSION['user_id'];$user = new User();

$user->select('id', 'username')->where('id', $user_id)->limit(1)->get();

if($user->num_results() > 0){

return $user->all();}return null;

}}

class User {

protected $_db;

public function __construct($db_connection){

$this->_db = $db_connection;}

public function getUser($userId){

$user = $this->_db->select('user')->where('id', $user_id)->limit(1)->get();

if($user->num_results() >0){

return $user->all();}return false;

}}

Non-Testable Code Testable Code

의존성을 생성자에서 주입받는다.

Page 70: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

Unit Testing (XE3)

XE3 Test Coverage (76%)

Page 71: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

Unit Testing

CHAK Service Unit Test

Page 72: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

Unit Testing

72

Cos

t of C

hang

e

0

5

10

15

20

Development Time

XE1 XE3 (TDD Available)

Cost of change vs development time

Page 73: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

XE3로 시작하는 웹서비스 장점

73

• �전세계�수�많은�사용자로부터�검증된�프레임워크�기반��오픈�소스�코드�

• 개발�비용�최소화�(XE�패키지�활용,�서비스�개발�기간�단축)�

• 서드�파티�모듈을�활용하여�서비스�자체�컨텐츠에�집중할�수�있다.�

• 테스팅을�통한�안정적인�배포및�서비스�운영�가능하다.

Page 74: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

XE3로 멋진 서비스를 만들어주세요!

Page 75: XECon2015 :: [2-4] 오승현 - Chak 서비스 구축기 with XE3

감사합니다