SWIFT로만든SERVER FRAMEWORK 개발기
발표자소개
이요섭
호서대학교컴퓨터공학과
장태환
한국기술교육대메카트로닉스(4)
CONTENTS
1. TREVI란?• 무엇인가?• Lime이란?• 왜만들었지?• 어떻게시작했을까
2. 한계점• 확장의한계
3. 웹어플리케이션 이해하기• 코드에게물어보기• 망설이지말고돌려보기• 배운것을반영하기• 성장한점
4. 시스템모듈 이해하기• 시스템라이브러리적용하기• 상위언어에서 c 모듈사용시문제점• 코드에게배우고반영하기• 성장한점
5. 앞으로의 방향
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 등)
앞으로의방향
‘해보고싶었으니까’를넘어서서
앞으로의방향
‘누군가에게쓰이기위해’를향해서.
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