Nodejs를 이용한 개발

58
asbubam @ Flitto 빠른 개발이 이루어지는 Node.js개발 스택 소개 photo by Jongho Jang

Transcript of Nodejs를 이용한 개발

Page 1: Nodejs를 이용한 개발

asbubam @ Flitto

빠른 웹 개발이 이루어지는 Node.js와

개발 스택 소개photo

by Jongho Jang

Page 2: Nodejs를 이용한 개발

C,�Java�in�여기저기

Ruby�on�Rails,�Node.js�in�News1

Node.js�in�Flitto

Punk�Band�bass

Fashion�Photography�in�Tokyo

Seungwoo�Lee�Engineer�[email protected]

dalsdoll

Page 3: Nodejs를 이용한 개발

現�플리토�남성후디�전속모델�활동�중�

특기:�역동적인�포즈��특이사항:�촬영�후�다이어트로�체중감량에�성공�

스타트업�플리토의�개발자입니다.�

photo by Jongho Jang

www.flitto.com store

Page 4: Nodejs를 이용한 개발

Flitto집단지성 번역 플랫폼 플리토

Page 5: Nodejs를 이용한 개발
Page 6: Nodejs를 이용한 개발

언어의장벽�⾔語の壁�

language�barrier

Page 7: Nodejs를 이용한 개발
Page 8: Nodejs를 이용한 개발

언어의장벽�⾔語の壁�

language�barrier

Page 9: Nodejs를 이용한 개발

www.Flitto.com

Page 10: Nodejs를 이용한 개발

�50개�Node.js�프로젝트���(20개�데몬형태)�

메인서버�약160�개�endpoint�*�CRUD�REST�API����

오늘은�주요�부분만�설명합니다.

Node.js�in�Flitto

Page 11: Nodejs를 이용한 개발

사용�기술

Page 12: Nodejs를 이용한 개발

서버�구조

main server

push

admin

crawler

task

api / front end

Page 13: Nodejs를 이용한 개발

디렉터리 구조- app�- models�- services�- routes�- views�- utils�- test�- …�

-�public�

Page 14: Nodejs를 이용한 개발

Node.js�4.2.1��production�전�서버에�적용�(2015/10/27)�

주의�기존에�설치된�node_modules�

npm�cache��node_gyp��

깔끔하게�지우고�재�설치�

https://github.com/nodesource/distributions�참고�

��

Page 15: Nodejs를 이용한 개발

v0.8.x��������=>��2012/10/17�AWS�t1.micro�서버�생성�

v0.10.x��v0.10.8����=>�2013/05/20�내가�입사한�날�v0.12.x��

v4.2.1�LTS�=>�2015/10/27�빨라진�것�같은�느낌적인느낌

Node.js�버전변화

v0.12.7:��(57.3+60.8+61.5+66.4+69.3)/5�=�63.06�건�/�sec���v4.2.1:��(57.1+73.9+74.8+75.4+78.4)/5�=�71.92�건�/�sec�

(71.92-63.06)/63.06*100�=�약�14.05�%�성능향상

랜딩�화면을�2000번씩�5회�렌더링�테스트

Page 16: Nodejs를 이용한 개발

express�4.x.x

Page 17: Nodejs를 이용한 개발

사용�패키지�aws-sdk�cron�geoip�gm�hiredis�kue�moment�nodemailer�qr-image�…

Page 18: Nodejs를 이용한 개발

개발환경 =�� +

https://www.jetbrains.com/webstorm

Page 19: Nodejs를 이용한 개발

코드�컨벤션

Page 20: Nodejs를 이용한 개발

db�schema�버전관리�flyway

Page 21: Nodejs를 이용한 개발

step�/�async�/�promise

Callback�What?

Page 22: Nodejs를 이용한 개발

tpl()�메소드를�통한��백엔드�/�프론트엔드��

그리기

Page 23: Nodejs를 이용한 개발

pg_node��

pg�를�래핑��트랜잭션�처리�추가�

query�string�출력�log()�추가

Page 24: Nodejs를 이용한 개발

공통으로�사용하는�코드�모듈화

Page 25: Nodejs를 이용한 개발

프론트엔드�패키징�자동화�변경�전:�grunt�+�python�변경�후:�grunt�+�gulp

Page 26: Nodejs를 이용한 개발

서비스가�18개�언어�지원�->�error�메시지도�18개�언어로�

서비스�내�모든�문구,�에러문구,�api에��자체�구현한�i18n�반영��싱크는�redis�pub/sub

Page 27: Nodejs를 이용한 개발

getError(errCode,�사용자의�language�고유키);�

{���statusCode:�404,���body:�{�����code:�404,�����desc:�“Not�Found”,�����message:�“대상이�없습니다.”�����resource:�“url…”���}�}�

Page 28: Nodejs를 이용한 개발

test��mocha,�should

Page 29: Nodejs를 이용한 개발

forever�->�pm2

Page 30: Nodejs를 이용한 개발

글로벌유저�대응��접속�위치�기준��

타임존�계산�및�서비스�

심야시간�푸쉬받지않기!�

우리의�심야시간�!=�유저의�심야시간�

Page 31: Nodejs를 이용한 개발

dev�/�staging�/�real

Page 32: Nodejs를 이용한 개발

배포�

Fabric

+

Page 33: Nodejs를 이용한 개발

AWS�ELB�무중단�서비스�디플로이

Page 34: Nodejs를 이용한 개발

logging�winston�/�morgan

Page 35: Nodejs를 이용한 개발

웹�푸쉬�socket.io��

+�redis�pub/sub

Page 36: Nodejs를 이용한 개발

실험적�admin�

변경�전:�backbone.js�변경�후:�angular.js,�sequelize

Page 37: Nodejs를 이용한 개발

그밖에�노드로�하는�것�쉘스크립트,�크론잡

Page 38: Nodejs를 이용한 개발

그밖에�노드로�하는�것�u+�xpay,�alipay,�paypal�giftishow,�happymoney�

Node.js�포팅�

Page 39: Nodejs를 이용한 개발

그밖에�노드로�하는�것�s3에서�파일�50만개�빨리��

다운받기

aws-sdk,�async(queue)

var�AWS�=�require(‘aws-sdk')���,�s3�=�new�AWS.S3()���,�fs�=�require(‘fs’)���,�targetFile�=�fs.createWriteStream(targetFilePath);�

var�read�=�s3.getObject({�Bucket:�bucket,�Key:�filePath�}).createReadStream();�read.pipe(targetFile);

Page 40: Nodejs를 이용한 개발

그밖에�노드로�하는�것�

형태소�분석�“내일�아침까지�첨부된�엑셀파일에�포함된�문장�중에서��3글자�이상이면서�2번이상�반복되는�명사,�형용사�뽑아주세요.”�“그리고�~이런�느낌적인�느낌의�문장들도�뽑아주세요.”

mecab-ffi�은전한닢(오픈소스�한국어�형태소�분석기�프로젝트)에서�사용하는��mecab-ko(오픈소스�형태소�분석�엔진인�MeCab를�한국어에�맞게�포팅)를�@xissy님이�Node.js�로�포팅�

Page 41: Nodejs를 이용한 개발

그밖에�노드로�하는�것�

형태소�분석라네즈 파워 에센셜 스킨 200ml 제조년월일 13년 06월10일/개봉전 제조일로부터 30개월/개봉후 12개월/제조일은 상품 입출고일에 따로 수시로 변동 될수 있으므로 반드시 판매자에 문의 바랍니다. 1. 세안 후 500우너 동전크기 (지름2.5cm)만큼 화장솜에 적셔 피부결에 따라 발라줍니다. 2.얼굴을 가볍게 닦아내는 기분으로 >사용하시면 투명케어에 더욱 효과적입니다. 1. 상처가 있는 부위 또는 습진 및 피부염 등의 이상이 있는 부위에는 사용하지 마십시오. 2. 화장품을 사용하여 다>음과 같은 이상이 있을 경우에는 사용을 중지할 것이며. 계속 사용하면 증상을 악화시키므로 피부과 전문의 등에게 상담하십시오. 1) 사용 중 붉은 반점. 부어오름. 가려움증. 자극 등의 이상이 있는 경우 2) 적용부위가 직사광선에 의하여 위와 같은 이상이 있을 경우 3. 보관 및 취급상의 주의사항 1) 사용 후에는 반드시 마개를 닫아 두십시오 2) 유소아의 손이 닿지 않는 곳에 보관하십시오 3) 고온 내지 저온의 장소. 직사광선이 닿는 곳에는 보관하지 마십시오 1.모이스쳐(중>건성)-200ml, 2.라이트(지복합성)-200ml, 3.센서티브(민감성)-200ml 아모레퍼시픽/아모레퍼시픽 1.모이스쳐(중건성),2.라이트(지복합성),3.센서티브(민감성) 제조사 홈페이지 및 제조사 고객센타로 문의 또는 동봉된 사용설명서 참조

직사광선 | 2모이스쳐 | 2중건성 | 2라이트 | 2지복합성 | 2센서티브 | 2민감성 | 2

아모레퍼시픽 | 2

Page 42: Nodejs를 이용한 개발

시행착오

Page 43: Nodejs를 이용한 개발

시행착오���

surrogate�pairUTF-16(16-bit�Unicode�Transformation�Format)은�유니코드�문자�인코딩�방식의�하나이다.�주로�사용되는�기본�다국어�평면�(BMP,�Basic�multilingual�plane)에�속하는�문자들은�그대로�16비트�값으로�인코딩이�되고�그�이상의�문자는�특별히�정해진�방식으로�32비트로�인코딩이�된다.�

기본�다국어�평면에�포함되지�않는�문자들,�즉�16비트로�값을�표현할�수�없는�문자들은�서러게이트(Surrogate)�문자�영역에�해당하는�두�개의�16비트�문자로�변환되어�이�한�쌍(즉�32비트)이�그�문자를�나타내게�된다.

https://ko.wikipedia.org/wiki/UTF-16

Page 44: Nodejs를 이용한 개발

😃https://www.flitto.com/twitter/158

Page 45: Nodejs를 이용한 개발

> var str = ‘안녕하세요반가워요\ud83d\ude03하이';> str‘안녕하세요반가워요😃하이’

> str.length

Page 46: Nodejs를 이용한 개발

> var str = ‘안녕하세요반가워요\ud83d\ude03하이';> str‘안녕하세요반가워요😃하이’

> str.length13

> encodeURI(str.slice(0,10))URIError: URI malformed at encodeURI (native) …

Page 47: Nodejs를 이용한 개발

> var str = ‘안녕하세요반가워요\ud83d\ude03하이';> str‘안녕하세요반가워요😃하이’

> str.length13

> encodeURI(str.slice(0,10))URIError: URI malformed at encodeURI (native) …

> var decodedArr = punycode.ucs2.decode(str);> var slicedStr = punycode.ucs2.encode(decodedArr.slice(0,10));> slicedStr‘안녕하세요반가워요😃’

> encodeURI(slicedStr);에러안남.

https://goo.gl/uZIV7m

Page 48: Nodejs를 이용한 개발

시행착오��

forEach�안에�비동기코드�엄~~청�많이�동시�실행�시스템�콜스택에도�한계가..�

users.forEach(function(user)�{�����헨리를�팔로우한�전체�유저에게�비동기로�푸쉬�});

async.queue�등을�사용해서�동시�실행되는�비동기코드를�제어

Page 49: Nodejs를 이용한 개발

시행착오�

�npm�install�했더니�동작이�달라요.�버전올라가면서�변경된�사항�요체크!�

ex)�"sequelize":�“latest”�sequelize�v2하고�v3는�달라도�너무달라요.

Page 50: Nodejs를 이용한 개발

시행착오�서버는�3년으로�사지말고��

aws가�가격인하를�계속�하고�새로운�상품도�나오고�하니�1년단위로..

Page 51: Nodejs를 이용한 개발

하고싶어요

Page 52: Nodejs를 이용한 개발

하고싶어요�es6�

11/10�신규�feature에�사용�시작!!!�사용하고�있지만�좀더�적극적으로!!

Page 53: Nodejs를 이용한 개발

하고싶어요�Node.js�production�적용�

좋은�예�되기

Page 54: Nodejs를 이용한 개발

하고싶어요�NPM�package�등록�오픈소스�기여

Page 55: Nodejs를 이용한 개발

geoip�PR

Page 56: Nodejs를 이용한 개발

하고싶어요�평일�개발�세미나에��

1만원�내고�참여하는당신!��함께�하고�싶어요!

Page 57: Nodejs를 이용한 개발

1

2

구인은�1번

구직은�2번

서버

Page 58: Nodejs를 이용한 개발

asbubam

asbubam�@�Flitto.com

감사합니다.�:)