WebAssembly — hello world 어셈블리를 브라우저에 올려보자

WebAssembly 이름만 들어도 긴장되는 이 프로젝트는 지금 읽으시면서 생각하시는 그대로 web + Assmbly의 조합입니다.

링크 : http://webassembly.org/

스크린샷 2017-01-21 오후 10.11.16

어셈블리어(assembly)는 기계어와 일대일 대응이 되는 컴퓨터 프로그래밍의 저급 언어이다.

출처: http://blog.opid.kr/162 [opid’s document]

브라우저 상에서 돌아가는 기계어라니 생각만 해도 즐거운 이 상상은 사실 비슷한 일들을 시도 했었던 몇 군데의 의기투합으로 완성됩니다.

결론부터 얘기하자면 오늘 소개하고 싶은 최종 프로젝트는 Web Assmebly의 binaryen 입니다.

WebAssembly/binaryen

WebAssembly/binaryen

binaryen — Compiler infrastructure and toolchain library for WebAssembly, in C++

GitHub

이 프로젝트를 설명을 하기 위해서는 먼길을 가야 할 거 같습니다. 하지만 매우 흥미로운 주제라고 생각되니까 시작해 보겠습니다.

1. asm.js 와 emscripten

최근 몇년동안 브라우저에서 mame게임이라던지 둠이라던지 등의 오픈소스로 풀려있는 게임들에 대해서 브라우저에서 돌아가는 프로젝트를 많이들 보셨을 겁니다. 어제 저는 Quake3 를 웹에서 돌려 보았습니다.

크롬에서 퀘이크 하는 모습[그림1]크롬 퀘이크 출처 — https://twitter.com/search?q=%23quakejs 오오오 다 부시고 싶다!!!!

먼저 브라우저 상에서 저런 게임 개발 + 연산을 하기 위해서는 어떤 일이 있어야 하는지를 생각해 봅시다.

  1. 엄청나게 빠른 자바스크립트를 개발하는거야!
  2. 네이티브 코드를 브라우저에서 돌리는 거야
  3. WebGL로 짜면 안되나요?

이렇게 접근한 눈에 띄는 큰 세력이 있었습니다. 하나는 asm.js라는 커뮤니티고 또 하나는 Emscripten 입니다.

1.1. asm.js.

링크 : http://asmjs.org/

스크린샷 2017-01-21 오후 10.16.19

asm.js는 다들 오해하시고 있는 부분이 있는데 어떤 새로운 컴파일 된 형태의 언어를 뜻하는 것은 아닙니다. JavaScript 스펙 중에 C나, C++ 처럼 좀더 low level로 건드릴 수 있는 형태로 나와 있는 API들을 사용해서 조금 덜 human readable한 코드지만 성능이 빠른 형태의 코드를 뜻합니다.

좀더 깊은 이해를 위해서는 아웃사이더 님의 다음글을 추천합니다.

asm.js에 대해서 :: Outsider's Dev Story

asm.js에 대해서 :: Outsider’s Dev Story

asm.js을 처음 듣게 된 것은 존 레식이 올린 다음 트윗을 보고나서였다. Asm.js is seriously one of the most exciting things to happen in JavaScript-land in a long time. Congrats Firefox team!? John Re…

Outsider’s Dev Story

어쨌든 결론만 놓고 보면 asm.js를 사용하면 native 코드에 비해 1.5배밖에 안느린 코드를 짤 수 있다. 라는 놀라운 일이 벌어집니다. GUI 쪽은 Java보다 대 놓고 빨라질 가능성을 가지게 되는 점입니다.

1.2.Emscripten

이번엔 그렇다면 다른 방법으로 native 코드를 JavaScript로 바꿔야지 하고 접근한 프로젝트를 소개합니다.

스크린샷 2017-01-21 오후 10.19.21

사이트에가서 보면 아시겠지만 이 프로젝트는 LLVM(Low Level Virtual Machine) 기반으로 C,C++로 짜여진 것을 JavaScript로 바꿔주는 프로젝트라는 것을 알 수 있습니다.

1.3. 도원결의

출처 : 나무위키 진삼국무쌍7

뭐 여러분 모두 짐작하셨다시피 asm.js의 엄청난 속도를 보고 emscripten은 LLVM을 asm.js로 컴파일 하기에 이릅니다.

1.4. 한방 그림

출처 : http://ejohn.org/blog/asmjs-javascript-compile-target/

그림은 jquery의 구루 john resig의 사이트에 올라와 있는 그림인데, C/C++ 코드를 짜면 Clang이 LLVM의 바이트 코드로 뱉어 냅니다. 그 결과는 spec 이 있으므로 컴파일러가 이해하는 수준의 순서로 Asm.js 스펙에 넣고 OpenGL을 쓰는 경우는 WebGL 스펙까지도 내려가서 변환해 줍니다. 그림 하나면 이해가 될 거를 많이도 내려 왔습니다.

2. WebAssembly

드디어 오늘 이야기 할 WebAssembly 입니다. 자 이쯤 오면 이런 생각할 사람이 있을 거 같습니다.

흠… 그럴게 아니라 진짜 Assembly Spec을 만드는게 어때?

그런데 그것이 실제로 일어났습니다.

어느 순간에 깃헙에 WebAssembly라는 그룹이 생기더니 design이라는 프로젝트를 통해 스펙을 주고 받고 있었습니다.

WebAssembly/design

WebAssembly/design

design — WebAssembly Design Documents

GitHub

한 1년 정도 watch를 하고 두고 보고 있었습니다. 최근에 생긴변화 마일 스톤이 생겨서 한번 확인해 보면 좋겠다 싶어서 들여다 보았더니 생각보다 이야기 할 것들이 있습니다.

Past Milestones

  • April 2015 — WebAssembly Community Group started
  • June 2015 — The first public announcement [1][2]
  • March 2016 — Definition of core feature with multiple interoperable implementations [1] [2] [3]
  • October 2016 — Browser Preview announced with multiple interoperable implementations [1] [2] [3]

16년 12월에 브라우저 프리뷰로 올라온 버전 위주로 이야기를 할까 합니다.

2.1. binaryen

실제로 targaryen 네이밍 컨벤션을 따랐다고 합니다. 헐. 덕.

뭔가 왕좌의 게임에 나올 거 같은 프로젝트 이름인데 실제로 emscripten 과 라임을 맞추기 위해서 노력했고 네이밍 컨벤션은 그걸 따랐다고 깃헙 공식페이지에 announce하고 있습니다. 개발의 시작은 덕질

먼저 시작하기 전에 이 어셈블리 (바이너리) 파일 포맷을 wasm 라고 정의했고 파일 확장자는 .wasm이라는 것만 알아두시면 됩니다. 저는 이걸 아는데 시간이 많이 걸렸어요. 이후 binayen은 굉장히 간단합니다. 브라우저에서 이제 wasm 파일을 인식하니 두가지 옵션이 남았죠.

  1. emscripten으로 컴파일 할때 wasm 파일을 만들어 준다.
  2. asm.js 파일을 wasm 파일로 바꿔준다.

2.2. hello world를 찍어보자.

백문이 불여일타! 개발자라면 응당 한번 찍어봐야 합니다.

2.2.1. 선행 설치

아 가슴뛰는 순간이네요. 일단 emscripten 과 binaryen을 인스톨 해야죠. 여기서 상당히 헤메었엇는데 저만 믿고 따라오시면 됩니다.

먼저 EMSDK라는 Emscripten SDK를 설치 하셔야 됩니다. 아래 걸어둔 링크에 따라 다운로드 받고 순서대로 실행하시면 됩니다.

링크 : http://kripken.github.io/emscripten-site/docs/getting_started/downloads.html

스크린샷 2017-01-22 오후 1.46.23

그런데 문제가 있습니다. EMSKD의 명령어 중에 옵션에 latest 를 하면 1.35 버전을 가지고 오게 되서 binaryen을 지원하지 않습니다. 바꿔야 되는 부분은 제가 빨간색으로 표시해 두겠습니다.

\# Fetch the latest registry of available tools.  
./emsdk update  

\# Download and install the latest SDK tools.  
./emsdk install incoming  

\# Make the "latest" SDK "active"  
./emsdk activate sdk-incoming-64bit

으로 변경을 해 주셔야만 제대로 컴파일이 됩니다.

먼저 helloworld.c 소스를 작성해 보겠습니다.

\#include <stdio.h\>  

int main() {  
printf("hello, world!\\n");  
return 0;  
}

이제 다음과 같은 명령어를 통해 컴파일을 실행하면

$emcc hello\_world.c -o hello.js -s 'BINARYEN="~/dev/native-osx/binaryen"'

hello.wasm 파일이 떨어집니다.

hex 에디터로 열어서 hello, world를 찾아 보는것이 도리겠죠?

오…. 소름

그런데… 이걸 어떻게 브라우저에 띄울까요? 걱정 안해도 됩니다. 브라우저에서 볼 수 있도록 명령어를 제공합니다.

emcc hello\_world.c -s WASM=1 -o hello.html

타겟을 html로 주고 WASM=1로 주게 되면 우리가 필요한 모든 파일들을 볼 수 있으며textarea 에 뜨는 것을 확인할 수 있습니다.

물론 실행은 크롬 canary 버전에서 실행했습니다. 아직 프리뷰 버전이라 정식 버전에는 들어가지 않았습니다.

2.3. 한방 그림

C,C++ -> Clang -> LLVM -> WASM 로 바로 되는 그림이면 좋겠지만 아직은 C,C++ -> (Clang -> LLVM -> asm.js )-> WASM 과정으로 이루어지는 형태입니다. 물론 이런 것들은 시간이 더 지나면서 바뀌게 될 것으로 보입니다. 괄호 안의 것들을 지우는 작업이 미래의 일이리라 보여집니다.

3. 여담들

  1. 마지막으로 Angry bots 가 브라우저상에 돌아가는 동영상이고 저는 직접 플레이 해 보았는데 그냥.. 3D게임을 그대로 돌리는데 전혀 이상없는 수준이고 로딩 속도도 훨씬 빠르더군요.

이 프로젝트는 지속적으로 주목해 봐야 합니다. 단연코!

  1. 참고로 WASM 파일을 어떻게 다룰 것인지는 아래 링크를 참조하시기 바랍니다.

링크 : http://webassembly.org/docs/js/

스크린샷 2017-01-22 오후 1.49.16

  1. 이전에 emscripten같은 프로젝트가 없었냐 하면 그것도 아닙니다. GWT는 java를 JavaScript로 바꾸는 작업을 했었고 이런 일련의 과정들이 현재의 밑거름이 되겠죠.

Originally published at 개발바보들.

By Keen Dev on January 21, 2017.

Exported from Medium on May 31, 2017.

Kong으로 시작하는 마이크로 서비스 아키텍처 — 1

프로젝트를 진행하며 MSA 를 적용하게 되었습니다. MSA를 적용하면서 맞닥들이는 실제 사례를 들어 시작해 볼까합니다.

MSA를 왜 적용하게 되었는지, 어떻게 적용하는지 이것을 하기 위해서 팀은 어떤일을 해야 하는지, 기술적인 검증은 어떻게 진행되는지 진지하게 살펴보도록 하겠습니다.

발단

어떤 아키텍쳐?

프로젝트를 수행할 때에 가장 난감할 때가 바로 결정된 아키텍처를 받아들었을 때입니다. 대부분의 경우는 feature가 정해지기도 전에 아키텍처를 정하고 들어가는 데 이런 재밌는 일은 주로 규모가 큰 팀간의 협업에서 일어납니다.

아키텍처가 강제되는 예

  1. SI프로젝트 처럼 납기가 중요한 경우

프로젝트를 효과적으로 수행하기 위해서 전자정부 프레임워크라던지, 사내 프레임워크를 쓰게 되면 얻을 수 있는 효과는 납기의 단축과 품질의 확보가 있지만 trade-off 로 잃게 되는 것이 개발자들의 역량 향상입니다.

2. 새로운 기술에 대한 호기심이 왕성한 리더가 있는 경우

주로 개발 리더들의 호기로운 도전에서 일어납니다. “이번에는 스프링 클라우드를 써 봐야지 하는 형태로 도전을 하고, (성공해 왔던) 그 동안의 전적들을 마음에 새기면서 개발자들에게도 동기부여를 하기 위해서 생겨납니다.

3. 실제 서비스에 유용하게 설계되어야 할 때

서비스는 점점 늘어날 것이 예상되고, 서비스간의 결합도는 낮추고 응집도는 높여야 하는데 개발과 운영이 동시에 진행이 되는 일들이 눈에 뻔히 보일 때. 라고 적었지만 이런 인사이트를 가진 리더를 미리 만난다면 행운이겠지만 보통 이런일은 내 생에는 일어나지 않을 확률이 높습니다.

뭐 이런 저런 이유들이 있겠지만 이번의 경우는 리더가 MSA를 하겠다는 이야기를 하고 진행이 되었기에 2번이라기 보다는 BDD(Boss Driven Dev)에 가깝다고 볼 수 있겠습니다.

전개

인터넷 상에서 찾아지는 대부분의 슬라이드와 글들이 철학으로 치자면 너무나 형이상학적이고 관념적이라 프로젝트를 진행할 때는 오히려 방해가 되는 듯 해서 기술적인 포인트 들로 내려가서 접근했습니다. 이렇게 접근한 후에 거꾸로 아키텍처의 좋은 점들을 찾아내는 방식을 취하기로 했습니다.

1. Kong — API Gateway

이 콩이 아닙니다.

마이크로 서비스 아키텍처를 도입할 때 기존의 도식에서 가장 도드라지게 보였던 것은 API Gateway 라는 존재입니다. 물론 마이크로 서비스는 DDD를 비롯해서 Monolithic 과의 비교등등을 이야기 할 수 있겠지만 그런 이야기는 이 글보다 훨씬 좋은 글들이 많습니다. 추천을 드리자면 다음 글을 읽어보시면 도움이 될 듯합니다.

클릭하시면 글로 이동합니다.

API 게이트 웨이

API 게이트웨이는 이른바 모노리띡 구조에서 마이크로 서비스로 서비스들을 쪼개고 나면 그 서비스들간이 연계할 수 있도록 도와주고 찾아갈 수 있도록 해 주며 개발할 때 API 들을 등록할 수 있는 역할들을 해 줍니다. 가장 유명한 API 게이트 웨이는 아마존의 API 게이트웨이겠죠.

Kong

Open-Source API Management and Microservice Management
_Secure, Manage & Extend your APIs or Microservices with plugins for authentication, logging, rate-limiting…_getkong.org

getkong.org 로 접속을 하고 나면 opensource API Gateway 라는 타이틀을 달고 kong이 우리를 반겨줍니다.

이 툴 과 몇가지를 조금더 조합해서 만족할 만한 그림이 나오면 서비스를 구성해 볼 생각입니다.

강조하고 있는 것은 Restful Interface , Plugin Oriented, Platform Agnostic 인데 모두 프로젝트를 위해서 중요한 부분입니다. 결국은 API 간의 호출은 REST 를 이용할 것이고 인증과 로깅, 서비스 제한, 과금등의 문제들을 플러그인 기능을 통해 풀려질 것이고 모든 플랫폼에서 돌아갈 수 있도록 서비스 하는 것은 너무나 중요합니다.

설치

저는 두가지 유형으로 설치해 보았습니다. 하나는 docker이미지를 통해서 이고 하나는 인스톨러인데 모두 훌륭하게 동작을 합니다. 다만, 인스톨러를 통해 설치를 하면 postgresql 비번을 설치 과정중에 정의를 하게 되는 부분이 있는데 docker 이미지는 그 과정 조차 필요 없더군요. ( 보안을 위해서는 변경이 필요하겠죠?)

OSX에서 인스톨 하는 방법

Docker를 이용해 설치하는 방법

1분만에 실행해 보기

그림에서 보는데로 API를 만들고 플러그인을 등록하면 된다고 하는데…

실제로 타이핑을 하다보면 많이 귀찮습니다.

kong-dashboard

그래서 kong-dashboard 라는 프로젝트를 설치하면 위의 귀찮음들을 해결할 수 있습니다.

PGBI/kong-dashboard
_kong-dashboard - Dashboard for managing Kong gateway_github.com

(개발자의 완성은 언제나 얼굴…)

출처 : https://github.com/PGBI/kong-dashboard

API 를 위와 같이 작성을 하고 나면 추가가 됩니다.

출처 : https://github.com/PGBI/kong-dashboard

아마존의 API 게이트웨이를 축약시켜 놓은 것 처럼 잘 만들어 놓은 UI를 가지고 있습니다. 실행시키고 나면 favicon이 리액트가 뜨는 걸로 봐서는 UI는 리액트 기반인듯 합니다.

플러그인을 설치 하는 것도 아래그림처럼 손쉽게 가능합니다.

플러그인에는 인증부터 시작해서 로깅, 분석까지 많은 부분을 커버해 주고 있어서 매우 유용합니다. 분석툴의 경우에는 과금이 되는 거 같군요.

2. JSON-Server

하지만 이렇게 API 게이트 웨이를 설치만 하는 것으로는 충분하지 않습니다. 실제로 서비스를 만들어야 하는데 이 마이크로 서비스들은 아직 시작 단계에서는 정의하기 힘든 상황이 대부분일 것입니다.

마이크로 서비스를 실제로 이야기는 많이 하지만 도입할 수 없는 딜레마 중의 하나는 아까 도입 예에서도 말씀드렸다시피 마이크로 서비스를 느낌같은 느낌으로 도입하기에는 부담이 스럽고 그렇다고 도전해 볼만큼 만만하지도 않기 때문입니다. 그래서 저는 이렇게 접근했습니다.

typicode/json-server
_json-server - Get a full fake REST API with zero coding in less than 30 seconds (seriously)_github.com

JSON Server라는 유용한 server가 있습니다.

이 녀석이 하는 일은…. 개발자가 알기 쉽게 명령어 부터 보여드리겠습니다.

$json-server --watch db.json --port 3000

db.json이라는 JSON 을 만들어 놓고 json-server 라는 명령어를 통해 포트를 지정하고 — watch 옵션을 통해 JSON 파일이 바뀌면 자동으로 서비스도 변경되는 진정한 마이크로 마이크로 서버 입니다. (훌륭하지 않습니까?)

{  
"posts": \[  
{ "id": 1, "title": "json-server", "author": "typicode" }  
\],  
"comments": \[  
{ "id": 1, "body": "some comment", "postId": 1 }  
\],  
"profile": { "name": "typicode" }  
}

이렇게 생겼다고 하면 http://localhost:3000/로 접근하면 다음과 같이 결과를 받을 수 있는 것입니다.

이렇게 먼저 관계가 있을 마이크로 서비스들을 나열하고 서비스들을 구성해 본 다음에 도메인 주도 설계들을 도입해서 Drill Down 하는 과정을 거쳐갈 것입니다. 이렇게 할 경우에 Monolithic 아키텍처로 풀어야할 도메인들은 미리 도출이 되는 강점이 있고 이후에 클라이언트와 서버는 JSON Server를 통해 인터페이스 해서 서로에게 의존성 없이 개발하게 되는 과정을 거칠 수 있습니다.

다음 그림은 Kong server 에 API서비스를 등록하는 화면입니다.

ip는 비밀 포트는 안비밀

그러고 나면 다음과 같은 결과들을 확인해 볼 수 있습니다.

플러그인 관련해서는 차후에 진행해 보도록 하겠습니다.

지금까지 셋팅한 부분을 요약한 그림은 아래 그림 정도가 되겠군요.

콩까지 맙시다.

다음 편부터는 사용자 스토리를 작성하고 실제 예를 들어 서비스를 만드는 과정, 이후 플러그인을 붙여보는 작업 등으로 진행해 보겠습니다.

By Keen Dev on December 28, 2016.

Exported from Medium on May 31, 2017.