109
SWIFT로 만든 SERVER FRAMEWORK 개발기

제 5회 D2 CAMPUS SEMINAR - Swift로 만든 serverframework 개발기

Embed Size (px)

Citation preview

SWIFT로만든SERVER FRAMEWORK 개발기

발표자소개

이요섭

호서대학교컴퓨터공학과

장태환

한국기술교육대메카트로닉스(4)

CONTENTS

1. TREVI란?• 무엇인가?• Lime이란?• 왜만들었지?• 어떻게시작했을까

2. 한계점• 확장의한계

3. 웹어플리케이션 이해하기• 코드에게물어보기• 망설이지말고돌려보기• 배운것을반영하기• 성장한점

4. 시스템모듈 이해하기• 시스템라이브러리적용하기• 상위언어에서 c 모듈사용시문제점• 코드에게배우고반영하기• 성장한점

5. 앞으로의 방향

TREVI란?

TREVI & LIME

Trevi란무엇인가?

Trevi는Swift로만들어진

서버프레임워크입니다.

Node.js와비슷한방식으로작동하며,사용법도비슷합니다.

Trevi란무엇인가?

서버프레임워크란, 외부에서의접속을처리할수있는

네트워킹라이브러리의묶음이라할수있습니다.

ex) Node.js

Lime이란?

Lime은Swift로만들어진

웹애플리케이션프레임워크입니다.

Express.js와비슷한방식으로작동하며,사용법도비슷합니다.

웹애플리케이션프레임워크(Web application framework)

동적인웹페이지나, 웹애플리케이션, 웹서비스개발보조용으로만들어지는애플리케이션프레임워크의일종.

웹페이지를개발하는과정에서겪는어려움을줄이는것이주목적으로통상데이터베이스연동, 템플릿형태의표준, 세션관리, 코드재사용등의기능을포함한다.

Lime이란?

출처 : https://ko.wikipedia.org/wiki/웹애플리케이션프레임워크

Lime이란?

요약하면, 웹애플리케이션프레임워크란,

웹상에서구동되는어플리케이션의제작을위한

라이브러리의묶음이라할수있습니다.ex) Express.js

Trevi & Lime

Trevi는혼자사용되면 Web Server로사용되고

Lime과함께사용하면

Web Application Server로사용됩니다. .

Trevi Stack

Middleware

Lime

Trevi

왜만들었을까?

왜만들었지?

Swift로만들어진서버프레임워크가없어서.

왜만들었지?

사실, Apple가고싶어서.

어떻게시작했을까?

어떻게시작했을까

기본적인이론을공부했습니다.HTTP, TCP, Server Model 등등

어떻게시작했을까

Q. 스스로바둑을두는프로그램

을만들려는데기본적인기계학습이론만안다고만들수있을까?

어떻게시작했을까

무식하면용감하다

어떻게시작했을까

아는것과할수있는것을최대한사용해서 Node.js 인터페이스와비슷하게만들었습니다.

어떻게시작했을까

Trevi 사용예제코드

어떻게시작했을까

Http Server

Socket

Request Response

Finish read Data

Middleware Manager

Routeable

Route Mapping Table

Application

Middleware

Middleware

Middleware

Middleware

Trevi 초기구성

한계점

한계점

서버프레임워크의기능과웹어플리케이션프레임워크의기능간

의존성이강해확장을할수없었습니다.

한계점

의존성이강하다.

1.Trevi + @ 가불가능오직 Trevi(Lime)만 가능

2.HTTP만 가능, HTTPS, FTP는 불가능한구조

한계점

Apple의 system library인 GCD가

Linux를완벽하게지원하지도않았습니다.

한계점

해결할법모르는바보들이모이면?

멍청이 + 멍청이 = 똥멍청이

한계점

해결할법모르는바보들이모이면?

멍청이 + 멍청이 = 똥멍청이

한계점

만들어본사람도별로없습니다.

한계점

철학도필요했습니다.

미국가서어떻게만들었냐물어볼수없으니,만들어진것을살펴보기로했습니다.

웹어플리케이션이해하기

코드에게물어보기

코드를분석하기로분석하기로결심한이유?

코드에게물어보기

메이저코드를분석하면해결책을얻을수있을것같았고,

코드에게물어보기

천명에가까운인원이오랜기간고민했던것이내가했던고민의솔루션이라고생각

했으며,

코드에게물어보기

Node.js를지향하고있었기때문에그들의코드를분석하기로했습니다.

코드에게물어보기

롤모델인

Node.js & Express.js(웹서버 프레임워크 & 웹 어플리케이션프레임워크)

코드에게물어보기

Javascript와 Swift는

코드에게물어보기

함수형프로그래밍

코드에게물어보기

이벤트기반

코드에게물어보기

코드의흐름을파악하기가어렵고, 놓치는데이터들이많았습니다.

코드에게물어보기

그렇다면,그많고이해하기힘든코드를

어떻게효율적으로분석할수있을까요?

코드에게물어보기

1. 책읽듯코드를읽기

2. 실제로실행시키며,디버거나로그를활용

코드에게물어보기

아무리복잡해보이는코드도실행시켜보면생각보다쉽게이해할수있습니다.

코드에게물어보기

디버깅은 한눈에변하는값들을확인할수있어읽을때놓칠수있는값을확인할수있습니다.

코드에게물어보기

1. Kitura 코드깨기

코드읽어보기 & Trevi 모듈과비교하기

코드에게물어보기

1. Kitura 코드깨기

코드읽어보기 & Trevi 모듈과비교하기

코드에게물어보기

2. Node.js & Express.js 코드깨기

IDE를활용해디버깅하면서프로세스를이해

코드에게물어보기

2. Node.js & Express.js 코드깨기

IDE를활용해디버깅하면서프로세스를이해

망설이지말고돌려보기

Event&

Prepared

망설이지말고돌려보기

실행방식의차이

코드에게물어보기

그무렵, 경쟁모델인

IBM-Kitura, Perfect의코드를분석

출처 : https://developer.ibm.com/swift/kitura/출처 : http://perfect.org/

배운것을반영하기

코드를읽으면무식하게만든 것과확실한개념적차이를이해할 수있습니다.

출처 : https://github.com/nodejs/node

배운것을반영하기

데이터를읽는법(Before & After)

배운것을반영하기

무작정만들었을때

Http Server

Socket

Request Response

Finish read Data

Middleware Manager

Routeable

Route Mapping Table

Application

Middleware

Middleware

Middleware

Middleware

배운것을반영하기

HTTP Request

Read

HTTP Parser

OnBody

OnBodyComp

OnHeader

OnHeaderComp

OnInComing

Socket

State handler

BeginBesiness Logic

HTTP Server

socket parser

socket parser

socket parser

… …

socket parser

Node.js를분석후

배운것을반영하기

라우팅(Before & After)

배운것을반영하기

Query Parser

Middeware manager

OAuth

Multi-Part

Router

error

/index Function

Router

/trevi Function

/d2/fast Routable

/naver Function

무작정만들었을때

배운것을반영하기

Node.js 분석후

Lime Layer

Middleware

Router

ApplicationProtocol

1 N

배운것을반영하기

Node.js 분석후

배운것을반영하기

Node.js 분석후

Router

/main

/join

/login

ClientClientClient

/…/…/…

성장

코드를읽고?

성장

언어의스킬을이해

알고리즘의중요성

성장

언어의스킬을이해

알고리즘의중요성

성장

무엇보다중요한것

성장

이제모르는것이생겼을때다른코드를분석하는데겁을먹지않는

다!

시스템모듈이해하기

시스템라이브러리적용하기

웹어플리케이션서버는 socket, file system, thread 등많은시스템함수를호출합니다.

시스템라이브러리적용하기

이와같은시스템함수를호출할때서버의성능을높이려면 blocking이

발생하지않도록해야합니다.

시스템라이브러리적용하기

이를위해소켓을 non-blocking으로설정하고event-driven 방식으로처리하려면

구현하기어렵고프로젝트가많이복잡해집니다.

시스템라이브러리적용하기

또한 OS별로효율적으로처리하는시스템함수 API가달라서이를일일이처리하기에는

많은작업이필요합니다.

시스템라이브러리적용하기

- epoll - kqueueOS

System Library

GCD, libevent, libuv

Framework

Node.js, kitura

시스템라이브러리적용하기

Apple runtime system library

출처 : https://developer.apple.com/library/ios/documentation/Performance/Reference/GCD_libdispatch_Ref/

시스템라이브러리적용하기

GCD는어플리케이션을개발하는사용자에게

Asynchronous I/O 및 multicore hardware에서효율적으로동작하는환경을제공합니다.

시스템라이브러리적용하기

하지만어떻게설계해야할까?

시스템라이브러리적용하기

처음에는 GCD를적용한간단한 Swift socket 프로젝트분석

출처 : https://github.com/AlwaysRightInstitute/SwiftSockets

시스템라이브러리적용하기

SwiftSockets에서 GCD의동작방식이해와POSIX Socket API 공부후

이전 Trevi 시스템모듈을설계했습니다.

시스템라이브러리적용하기

• 이전 Trevi system module

시스템라이브러리적용하기

• 이전 Trevi system module

Socket 127.0.0.1 : 8080non-block, sockopt

SocketSocket Socket

Listener

accept

accept

accept

시스템라이브러리적용하기

• 이전 Trevi system module

Socket

SocketSocket Socket

readable

readablewritable

readablewritable

readablewritable

시스템라이브러리적용하기

• 이전 Trevi system module

Mainqueue

Main thread

시스템라이브러리적용하기

• 이전 Trevi system module

Global queue

ThreadPool

Thread

Thread

Thread

Thread

Thread

Thread

Thread

시스템라이브러리적용하기

이때까지이모듈이효율적으로동작하고아무문제가없다고생각했지만…

시스템라이브러리적용하기

출처 : https://github.com/apple/swift-corelibs-libdispatch

리눅스에서 GCD 적용문제

시스템라이브러리적용하기

GCD의 Linux 지원에문제가있었고,사용이어려워졌습니다.

시스템라이브러리적용하기

그리고파일시스템을개발시기존 Socket 모듈의Read / Write 부분재사용불가했습니다.

시스템라이브러리적용하기

출처 : http://libuv.org/

Node.js system library

시스템라이브러리적용하기

기본적으로 Asynchronous I/O 지원하며multi-platform 에서안정적으로동작합니

다.또한다양한 server side API들을지원하여

GCD을대체하여적용하였습니다.

고급언어에서 c API 사용시문제점

libuv는 C로구성된 system library이며Swift에서 C library를적용하고사용하는데

는아무런문제가없었습니다.

고급언어에서 c API 사용시문제점

그러나 libuv는발생하는이벤트의 callback을

C의함수포인터로인자를받아서Swift의클로저를 libuv의 callback 함수로사용하기에는많은어려움이있습니다.

고급언어에서 c API 사용시문제점

libuv callback 함수예시

고급언어에서 c API 사용시문제점

class Server {var clientNumber = 0var socket: Listener!func createServer (port: Int) {

socket = Listener(port)socket.listenClientEvent(){

client inclientNumber += 1self.printClientNumber()

}}

func printClientNumber(){print(“client number : \(clientNumber)”)

}}

변수및함수참조

클로저를 libuv callback 함수대입시문제

코드에게배우고반영하기

그럼이제어떻게?

코드에게배우고반영하기

API 문서및예제코드를통해배우고

libuv를 적용한서버프레임워크들을분석(Node.js, Luvit, Julia … etc)

코드에게배우고반영하기

Node.js architecture

출처 : http://www.iij.ad.jp/en/company/development/tech/nodejs/index.html

코드에게배우고반영하기

해당부분은 GitHub의 nodejs/node 에서src 디렉토리아래 c++ 모듈

코드에게배우고반영하기

• 현재 Trevi system module

코드에게배우고반영하기

• 현재 Trevi system module

handlestruct

static object dictionary

handleobject

callbacks(closure)

코드에게배우고반영하기

• 이전 system module의문제해결

코드에게배우고반영하기

• multi-thread model

New eventWork event module

onConnection onRead

afterWrite onClose

onTimeout

onConnection onRead

afterWrite onClose

onTimeout

Work thread pool

Thread

코드에게배우고반영하기

• Cluster module (예정)

출처 : http://www.aosabook.org/en/posa/from-socialcalc-to-ethercalc.html

성장

어려운부분들을해결하는데가장도움이된방법

성장

실행 &분석

성장

이를통해배울수있었던것?

성장

숙련된개발자의개발방법잘몰랐던부분의이론이나지식

…etc

(socket, swift socket api, blocking, library 등)

앞으로의방향

앞으로의방향

‘해보고싶었으니까’를넘어서서

앞으로의방향

‘누군가에게쓰이기위해’를향해서.

THANKS

Reference

• https://ko.wikipedia.org/wiki/웹 애플리케이션프레임워크• https://github.com/expressjs/express• https://nodejs.org/en/• https://developer.ibm.com/swift/kitura/ • http://perfect.org/• https://github.com/nodejs/node• https://github.com/AlwaysRightInstitute/SwiftSockets• https://github.com/apple/swift-corelibs-libdispatch• http://www.iij.ad.jp/en/company/development/tech/nodejs/i

ndex.html