ºÝºÝߣ

ºÝºÝߣShare a Scribd company logo
p l a y . n o d e ( ) ;
asbubam @ Flitto
집단지성 번역 í”Œëž«í¼ ¶¥Œë¦¬í† ëŠ” 노드를 어떻게 사용하는가?
photo
by
Jongho Jang
C, Java in 여기저기
Ruby on Rails, Node.js in News1
Node.js in Flitto
Punk Band bass
Fashion Photography in Tokyo
Seungwoo Lee
Engineer
asbubam@Flitto.com
…
dalsdoll
ç¾ ¶¥Œë¦¬í†  남성후디 ì „ì†ëª¨ë¸ í™œë™ ì¤‘
특기: ì—­ë™ì ì¸ í¬ì¦ˆ
특ì´ì‚¬í•­: ì´¬ì˜ í›„ 다ì´ì–´íŠ¸ë¡œ 체중ê°ëŸ‰ì— 성공
스타트업 ¶¥Œë¦¬í† ì˜ 개발ìžìž…니다.
photo by Jongho Jang
www.flitto.com store
Flitto집단지성 번역 í”Œëž«í¼ ¶¥Œë¦¬í† 
곤니찌와 하지메마시떼.
와따시와슈우단시세혼야í¬í”Œë¼í† í¬ë¯€ë…¸
¶¥Œë¦¬í† ë°ì‚¬-바카ì´í•˜ì¯”오단ë˜ìš°ì‹œë–¼ì´ë£¨
ì´ìŠ¹ìš°ë˜ëª¨ìš°ì‹œë§ˆìŠ¤
쿄와¶¥Œë¦¬í† ì™€ë…¸ë„ì œì´ì—스오ë„ìš°ì–ë•Œ
쯔깟ë°ì´ë£¨ë…¸ê¹Œë‹ˆì¯”ì´ë–¼í•«í‘œì‚¬ì„¸ë–¼ì´ë”°ë‹¤ì¿ 
코토니나리마시따.
ë„우죠요로시꾸오네가ì´ì‹œë§ˆìŠ¤
언어ì˜ìž¥ë²½
⾔語ã®å£
language barrier
어떠세요?
ì–¸ì–´ì˜ ìž¥ë²½ì´ íŒíŒ ëŠê»´ì§€ì‹œì£ ?
하지만 저는 ¶¥Œë¦¬í†  ë²ˆì—­ìš”ì²­ê¸°ëŠ¥ì„ í†µí•´
ì¼ë³¸ì–´ì™€ í•œêµ­ì–´ì— ëŠ¥í†µí•œ minj9ë•¡ë•¡ 회ì›ë‹˜ì˜
ë„ì›€ì„ ë°›ì„ ìˆ˜ 있었습니다. :)
언어ì˜ìž¥ë²½
⾔語ã®å£
language barrier
¶¥Œë¦¬í† ëŠ” ë²ˆì—­ì´ í•„ìš”í•œ 사람과
ë²ˆì—­ì„ í•  수 있는 사람ì„
똑똑하게 연결해주고,
ì§‘ë‹¨ì§€ì„±ì˜ íž˜ì„ í†µí•´
ì–¸ì–´ì˜ ìž¥ë²½ì„ ë›°ì–´ë„˜ëŠ” 서비스입니다.
www.Flitto.com
www.Flitto.com 웹사ì´íŠ¸
ì•„ì´í°, 안드로ì´ë“œ 마켓ì—ì„œ 만나실 수 있습니다!
50ê°œ Node.js 프로ì íŠ¸
(20ê°œ ë°ëª¬í˜•íƒœ)
ë©”ì¸ì„œë²„ 약160 ê°œ endpoint * CRUD
REST API
ì˜¤ëŠ˜ì€ ì£¼ìš” 부분만 설명합니다.
Node.js in Flitto
사용 기술
AWS 위ì—ì„œ 운용하고 있으며 아래 ê¸°ìˆ ë“¤ì„ ì‚¬ìš©í•©ë‹ˆë‹¤.
사용 기술
backbone.js, angular.js는 어드민ì—ì„œ 사용하고
웹서비스 프론트는 jquery와 순수 ìžë°”스í¬ë¦½íŠ¸ë¡œ 구성ë˜ì–´ 있습니다.
sequelize는 백오피스ì—ì„œ 사용합니다.
서버 구조
main server
push
admin
crawler
task
api / front end
ë©”ì¸ì„œë²„, 어드민, í¬ë¡¤ë§, 테스트관리, 푸쉬를 처리하는 ë°ëª¬ë“¤ê³¼
ê³ ìœ ì˜ ê¸°ëŠ¥ì„ í•˜ëŠ” ìž‘ì€ ì„œë¹„ìŠ¤ë“¤ë¡œ ì´ë¤„져있습니다.
서버 구조
main server
push
admin
crawler
task
api / front end
PostgreSQL(RDS) ì„ ë©”ì¸ë””비로 하고 ìš©ë„ì— ë”°ë¼ì„œ
휘발성, 비정형 ë°ì´í„°ëŠ” mongoDBì—, 세션정보와 ì ‘ê·¼ì´ ë¹ˆë²ˆí•œ ë°
ì´í„°ëŠ” Redisì— ì €ìž¥í•˜ê³  있습니다.
디렉터리 구조
- app
- models
- services
- routes
- views
- utils
- test
- …
- public
ë©”ì¸ ì„œë¹„ìŠ¤ì˜ ë””ë ‰í„°ë¦¬ 구조는
ì¼ë°˜ì ì¸ express 프로ì íŠ¸ì˜ 구조와 비슷합니다.
Node.js 4.2.1
production ì „ ì„œë²„ì— ì ìš© (2015/10/27)
주ì˜
ê¸°ì¡´ì— ì„¤ì¹˜ëœ node_modules
npm cache
node_gyp
ê¹”ë”하게 지우고 재 설치
https://github.com/nodesource/distributions 참고
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회 ë Œë”ë§ í…ŒìŠ¤íŠ¸
특정 페ì´ì§€ë¥¼ 2가지 버전 환경ì—ì„œ 테스트한 결과로
모든 í™˜ê²½ì„ í†µí‹€ì–´ 14.05%를 보장할 수는 없지만
실제 서비스 ë°˜ì˜ê²°ê³¼ 버전업으로 만족할 만한 ì„±ëŠ¥ì„ ì–»ê³  있다고 íŒë‹¨ë©ë‹ˆë‹¤.
express 4.x.x
express 4.8.x 를 프러ë•ì…˜ì—ì„œ ë¬¸ì œì—†ì´ ì‚¬ìš©í•˜ê³  있습니다.
사용 패키지
aws-sdk
cron
geoip
gm
hiredis
kue
moment
nodemailer
qr-image
…
cron: 프로세스 ë‚´ì—ì„œ ì •ì˜í•˜ëŠ” í¬ë¡ ìž¡ 실행
geoip: ip로 geolocation 정보 가져오기
gm: ì´ë¯¸ì§€ 변환, hiredis: redis LRANGE 등ì—ì„œ 성능향ìƒ
kue: redis ì— ë¶™ì—¬ì„œ í잉, moment: 날짜 시간 i18nì ìš©
nodemailer: ë©”ì¼ì „송, qr-image: qr코드 ìƒì„±
개발환경 = +
https://www.jetbrains.com/webstorm
최근엔 ë””ë²„ê¹…ë„ ë§Žì´ ì¢‹ì•„ì¡Œì–´ìš”. :)
코드 컨벤션
서버팀ì›ì´ 3명ì´ìƒì´ ë˜ë©´ì„œë¶€í„° 코드 ì»¨ë²¤ì…˜ì„ ìœ„í‚¤ì— ì •ë¦¬í•˜ê³  있어요.
db schema 버전관리
flyway
flyway를 사용해서 db schema 버전관리를 하고 있어요.
ê°œë°œìž ê°„ì˜, í˜¹ì€ ì„œë²„ ê°„ì˜ db schema싱í¬ì— 편하고 좋아요.
step / async / promise
Callback What?
Callback ì´ ì¤‘ì²©ë˜ëŠ” 문제는
stepì„ ë§Žì´ ì´ìš©í•˜ë‹¤ê°€ 작년부터는 asyncë¡œ ì´ë™í•˜ê³  있고
특정부분ì—는 promise를 사용하고 있어요.
ê°œì¸ì ì¸ ìƒê°ì´ì§€ë§Œ
Node.jsë¡œ 개발하면서 Callbackì— ì˜í•œ 문제는 í¬ê²Œ ê²ªì€ ê²½í—˜ì´ ì—†ì–´ìš”.
오히려 비ë™ê¸°ì ì¸ ì„¤ê³„ê²½í—˜ì´ ì•„ì§ ë§Žì§€ì•Šì•„ì„œ 겪는
시행착오가 ë” ë§Žì€ ê²ƒ 같아요.
tpl() 메소드를 통한
백엔드 / 프론트엔드
그리기
íŒŒìƒ¬ì„ ë Œë”ë§í•˜ëŠ” tpl() 메소드를 ì •ì˜í•˜ê³ 
백엔드와, 프론트엔드ì—ì„œ
ë™ì¼í•œ 탬플릿 파ì¼, 메소드를 ì´ìš©í•´ì„œ íŒŒìƒ¬ì„ ê·¸ë¦¬ê³  있어요.
pg_node
pg 를 래핑
트랜잭션 처리 추가
query string 출력 log() 추가
postgresql ì—°ë™ ì‹œ ë§Žì´ ì‚¬ìš©í•˜ëŠ” pg 모듈ì—
트랜잭션 처리를 래핑하고
query parameter를 넣어 log를 출력하는 log 메소드를 추가해서 사용해요.
공통으로 사용하는 코드
모듈화
서비스 ì „ì—­ì—ì„œ 사용하고, 공통ë˜ëŠ” 부분ì€
별ë„ì˜ ëª¨ë“ˆë¡œ 분리해서 여러곳ì—ì„œ 사용하고 있어요.
프론트엔드 패키징 ìžë™í™”
변경 전: grunt + python
변경 후: grunt + gulp
스프ë¼ì´íŠ¸ ì´ë¯¸ì§€ ìƒì„±
JS, css 압축 등 프론트엔드 패키징ì—
grunt + gulp ì¡°í•©ì„ ì‚¬ìš©í•´ìš”.
서비스가 18ê°œ 언어 지ì›
-> error ë©”ì‹œì§€ë„ 18ê°œ 언어로
서비스 ë‚´ 모든 문구, ì—러문구, apiì—
ìžì²´ 구현한 i18n ë°˜ì˜
싱í¬ëŠ” redis pub/sub
getError(errCode, 사용ìžì˜ language 고유키);
{
statusCode: 404,
body: {
code: 404,
desc: “Not Foundâ€,
message: “대ìƒì´ 없습니다.â€
resource: “url…â€
}
} errCode와 language 고유 í‚¤ì˜ ì¡°í•©ì„ í†µí•´
사용ìžì˜ 모국어로 오류코드를 출력하고 있어요.
statusCode는 httpìŠ¤íŽ™ì„ ë”°ë¥´ê³ 
body.code는 디테ì¼í•˜ê²Œ ì •ì˜í•´ì„œ 사용해요.
ì—ëŸ¬ì½”ë“œì— ëŒ€ì‘하는 서비스와 ë””ë²„ê¹…ì„ ìœ„í•´ì„œ
유저ì—게 보여지는 ì—러(녹색부분)
ì„œë²„ì— ë³´ì—¬ì§€ëŠ” ì—러(붉ì€ìƒ‰ë¶€ë¶„)를 구분해서 처리해요.
test
mocha, should
test는 mocha 와 should ì¡°í•©ì„ ì‚¬ìš©í•´ìš”.
forever -> pm2
프로세스 관리는 forever ì—ì„œ pm2ë¡œ 넘어가서
최근 프로ì íŠ¸ëŠ” 대부분 pm2를 사용하고 있어요.
pm2ê°€ 조금 ë” ì´ì˜ê³ , 조금 ë” ì•ˆì •ì ì¸ 것 같아요.
글로벌유저 대ì‘
ì ‘ì† ìœ„ì¹˜ 기준
타임존 계산 ë° ì„œë¹„ìŠ¤
심야시간 푸쉬받지않기!
ìš°ë¦¬ì˜ ì‹¬ì•¼ì‹œê°„ != ìœ ì €ì˜ ì‹¬ì•¼ì‹œê°„
¶¥Œë¦¬í† ëŠ” 현재 170여개국ì—ì„œ 사용 중ì´ê¸° 때문ì—,
실제 유저가 ì ‘ì†í•˜ëŠ” ìœ„ì¹˜ì˜ íƒ€ìž„ ì¡´ì— ë§žê²Œ 서비스를 ë°˜ì˜í•˜ê³  있어요.
dev / staging / real
개발환경ì€
dev / staging / real 로 분리해서 사용하구요.
ë°°í¬
Fabric
+
기존ì—는 Fabric만 사용해서 ë°°í¬í–ˆì—ˆëŠ”ë°ìš”.
팀ì›ë“¤ì´ 늘고, ë™ì‹œì— 개발ë˜ëŠ” 피ì³ë„ 늘어나면서
Jenkins를 ë„입하게 ë˜ì—ˆê³ 
현재는 ë°°í¬í•  ë•Œ 굉장히 편안하고 ë¶€ë‹´ì—†ì´ í•˜ê³  있어요.
AWS ELB
무중단 서비스 디플로ì´
AWS ELB를 물론 사용하고 있고
ë””í”Œë¡œì´ ì‹œì—, aws-sdk ë¡œ 구현한 ë°°í¬ë¡œì§ì„ 통해
ELBì—ì„œ 순차ì ìœ¼ë¡œ 빼고 ì—…ë°ì´íŠ¸ 하고 다시 넣고 하는 ê³¼ì •ì„ ê±°ì¹˜ê³  있어요.
logging
winston / morgan
ë¡œê¹…ì€ í”„ë¡œì íŠ¸ë§ˆë‹¤ 조금 다르지만
대체ì ìœ¼ë¡œ winston ê³¼ morganì„ ì‚¬ìš©í•´ìš”.
웹 푸쉬
socket.io
+ redis pub/sub
socket.io + redis pub/sub ì„ í†µí•´
ì›¹ì„œë¹„ìŠ¤ì— ì‹¤ì‹œê°„ 알람 ê¸°ëŠ¥ì„ êµ¬í˜„í–ˆì–´ìš”.
ì‹¤í—˜ì  admin
변경 전: backbone.js
변경 후: angular.js, sequelize
실험ì ì¸ 기능ì´ë‚˜, ê¸°ìˆ ì˜ ë°˜ì˜ì€ ë©”ì¸ì„œë¹„스ì—ë„ ë§Žì´ í•˜ì§€ë§Œ
ì–´ë“œë¯¼ì— íŠ¹ížˆ ë§Žì´ ì‹œí—˜ì‚¼ì•„ ë„ìž…í•´ë³´ê³  있어요.
ì–´ë“œë¯¼ì€ ê¸°ì¡´ì—는 backbone.js를 사용하다가
최근ì—는 angular.js 와 sequelize를 사용하고 있어요.
ê·¸ë°–ì— ë…¸ë“œë¡œ 하는 것
쉘스í¬ë¦½íŠ¸, í¬ë¡ ìž¡
쉘 스í¬ë¦½íŠ¸, í¬ë¡ ìž¡ë„ Node.js 스í¬ë¦½íŠ¸ë¡œ 구현하고 있어요.
Node.js로 다할 수 있어요. :)
ê·¸ë°–ì— ë…¸ë“œë¡œ 하는 것
u+ xpay, alipay, paypal
giftishow, happymoney
Node.js í¬íŒ…
ê¸°ì¡´ì— php, javaë¡œ 작성ë˜ì–´ ìžˆë˜ apië“¤ì„ Node.js ë¡œ í¬íŒ…í•´ì„œ 사용해요.
ê·¸ë°–ì— ë…¸ë“œë¡œ 하는 것
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);
AWS S3ì—ì„œ ìˆ˜ë§Žì€ íŒŒì¼ì„ ë™ì‹œì— 옮겨야할 ë•
aws-sdk + stream ì¡°í•©ì´ ìµœê³ ì—ìš”.
ê·¸ë°–ì— ë…¸ë“œë¡œ 하는 것
형태소 분ì„
â€œë‚´ì¼ ì•„ì¹¨ê¹Œì§€ ì²¨ë¶€ëœ ì—‘ì…€íŒŒì¼ì— í¬í•¨ëœ 문장 중ì—ì„œ
3ê¸€ìž ì´ìƒì´ë©´ì„œ 2번ì´ìƒ 반복ë˜ëŠ” 명사, 형용사
뽑아주세요.â€
“그리고 ~ì´ëŸ° ëŠë‚Œì ì¸ ëŠë‚Œì˜ ë¬¸ìž¥ë“¤ë„ ë½‘ì•„ì£¼ì„¸ìš”.â€
mecab-ffi
ì€ì „한닢(오픈소스 한국어 형태소 분ì„기 프로ì íŠ¸)ì—ì„œ 사용하는
mecab-ko(오픈소스 형태소 ë¶„ì„ ì—”ì§„ì¸ MeCab를 í•œêµ­ì–´ì— ë§žê²Œ í¬íŒ…)를
@xissyë‹˜ì´ Node.js ë¡œ í¬íŒ…
ê·¸ë°–ì— ë…¸ë“œë¡œ 하는 것
형태소 분ì„
ë¼ë„¤ì¦ˆ 파워 ì—센셜 스킨 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
mecab-ffi ëª¨ë“ˆì„ í†µí•´ 어렵지 않게 구현할 수 있었어요. :)
시행착오
시행착오
surrogate pair
UTF-16(16-bit Unicode Transformation Format)ì€ ìœ ë‹ˆì½”ë“œ ë¬¸ìž ì¸ì½”딩 ë°©ì‹ì˜ 하나ì´
다. 주로 사용ë˜ëŠ” 기본 다국어 í‰ë©´ (BMP, Basic multilingual plane)ì— ì†í•˜ëŠ” 문ìžë“¤ì€
그대로 16비트 값으로 ì¸ì½”ë”©ì´ ë˜ê³  ê·¸ ì´ìƒì˜ 문ìžëŠ” 특별히 정해진 ë°©ì‹ìœ¼ë¡œ 32비트로
ì¸ì½”ë”©ì´ ëœë‹¤.
기본 다국어 í‰ë©´ì— í¬í•¨ë˜ì§€ 않는 문ìžë“¤, 즉 16비트로 ê°’ì„ í‘œí˜„í•  수 없는 문ìžë“¤ì€ 서러
게ì´íŠ¸(Surrogate) ë¬¸ìž ì˜ì—­ì— 해당하는 ë‘ ê°œì˜ 16비트 문ìžë¡œ 변환ë˜ì–´ ì´ í•œ ìŒ(즉 32
비트)ì´ ê·¸ 문ìžë¥¼ 나타내게 ëœë‹¤.
https://ko.wikipedia.org/wiki/UTF-16
문제를 겪고 ì•Œê²Œëœ surrogate pair
😃
https://www.flitto.com/twitter/158
우리가 í”히 접하는 emojiê°€ 바로 surrogate pairì—
> var str = ‘안녕하세요반가워요ud83dude03하ì´';
> str
‘안녕하세요반가워요😃하ì´â€™
> str.length
str.length ì˜ ê°’ì€ ëª‡ì¼ê¹Œìš”?
> var str = ‘안녕하세요반가워요ud83dude03하ì´';
> str
‘안녕하세요반가워요😃하ì´â€™
> str.length
13
> encodeURI(str.slice(0,10))
URIError: URI malformed
at encodeURI (native)
…
네 13ì´ì—ìš”. 그리고 10번째까지 ìžë¥´ë©´ ìŠ¤ë§ˆì¼ emoji까지 sliceë˜ë¦¬ë¼ ìƒê°í–ˆëŠ”ë°
오류가 ë°œìƒí•˜ê³  ë§ì•˜ì–´ìš”.
> var str = ‘안녕하세요반가워요ud83dude03하ì´';
> str
‘안녕하세요반가워요😃하ì´â€™
> str.length
13
> 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
node.js v0.6 버전부터 í¬í•¨ëœ punycode를 통해
decodingí•œ 결과를 사용해서 slice하면 ì´ ë¬¸ì œë¥¼ í•´ê²°í•  수 있어요.
좀 ë” ìžì„¸í•œ ì„¤ëª…ì€ ì—¬ê¸°ì— -> https://t.co/fbehjnz8fQ
시행착오
forEach ì•ˆì— ë¹„ë™ê¸°ì½”ë“œ ì—„~~ì²­ ë§Žì´ ë™ì‹œ 실행
시스템 콜스íƒì—ë„ í•œê³„ê°€..
users.forEach(function(user) {
헨리를 팔로우한 ì „ì²´ 유저ì—게 비ë™ê¸°ë¡œ 푸쉬
});
async.queue ë“±ì„ ì‚¬ìš©í•´ì„œ ë™ì‹œ 실행ë˜ëŠ” 비ë™ê¸°ì½”드를 제어
í•­ìƒ ì–¼ë§ˆë‚˜ ë§Žì€ ì–‘ì˜ ì½”ë“œê°€ ë™ì‹œì— 비ë™ê¸°ë¡œ 실행ë˜ê³  있는 지
ìƒê°í•˜ê³  ë˜ ìƒê°í•´ì•¼ í•´ìš”!
시행착오
npm install í–ˆë”니 ë™ìž‘ì´ ë‹¬ë¼ìš”.
버전올ë¼ê°€ë©´ì„œ ë³€ê²½ëœ ì‚¬í•­ 요체í¬!
ex) "sequelize": “latestâ€
sequelize v2하고 v3는 달ë¼ë„ 너무달ë¼ìš”.
ëª¨ë“ˆì´ ë²„ì „ì—… ë˜ë©´ì„œ 성능향ìƒë§Œ ë˜ëŠ”게 아니ë¼
사용방법ì´ë‚˜ 파ë¼ë¯¸í„°íƒ€ìž…ì´ ë°”ë€ŒëŠ” 경우가 있으니 모듈 릴리즈노트를 잘 살펴야해요!
시행착오
서버는 3년으로 사지ë§ê³ 
awsê°€ 가격ì¸í•˜ë¥¼ ê³„ì† í•˜ê³  새로운 ìƒí’ˆë„ 나오고 하니 1년단위로..
예, 그렇다고 합니다. :)
Çê˜ê³ ì‹¶ì–´ìš”
Çê˜ê³ ì‹¶ì–´ìš”
es6
es6를 ì„œë¹„ìŠ¤ì— ë„입하고 싶었µç”ë°ìš”.
Çê˜ê³ ì‹¶ì–´ìš”
es6
11/10 ì‹ ê·œ featureì— ì‚¬ìš© 시작!!!
마침 11/10ì¼ë¶€í„° 개발ë˜ëŠ” 새로운 featureì— classê°œë…부터 ë°˜ì˜í•˜ê²Œ ë˜ì—ˆìŠµë‹ˆë‹¤. :)
Çê˜ê³ ì‹¶ì–´ìš”
Node.js production ì ìš©
ì¢‹ì€ ì˜ˆ ë˜ê¸°
오늘 발표 주제가 ‘node.js in production 사용 예’ 였다면
다ìŒì— ë˜ ë°œí‘œí•  기회가 있다면
¶¥Œë¦¬í† ë¥¼ ê¼­ ì¢‹ì€ ì„œë¹„ìŠ¤ë¡œ 만들어서
‘node.js in production (킹왕짱) ì¢‹ì€ ì˜ˆâ€™ ë¡œ 발표할 수 있기를… 하고 ë°”ë¼ë´…니다.
Çê˜ê³ ì‹¶ì–´ìš”
NPM package 등ë¡
오픈소스 기여
회사 내부ì—ì„œ 만들어서 사용하는 ëª¨ë“ˆë“¤ì„ ì´ì˜ê²Œ 정리해서
NPM packageì— ë“±ë¡í•˜ê³ 
오픈소스ì—ë„ ê¸°ì—¬í•˜ê³  싶어요.
geoip PR
ìž‘ì€ ë°œê±¸ìŒì´ì§€ë§Œ, 조금씩 PRë„ ë³´ë‚´ê³  ë¨¸ì§€ë„ ë˜ê³  있어요. :)
Çê˜ê³ ì‹¶ì–´ìš”
í‰ì¼ Node.js 세미나ì—
4ë§Œì› ë‚´ê³  참여하는당신!
함께 하고 싶어요!
그래요. ì •ë§ ë‹¹ì‹ ê³¼ 함께하고 싶어요!
그리고,
Node.js를 하는 ë” ë§Žì€ ê°œë°œìžë“¤ê³¼ 소통하고 싶어요!
저는 Node.js를 ì •ë§ ì¢‹ì•„í•˜ê³ , Node.jsë¡œ 개발하는게 ì •ë§ ì¦ê±°ìš°ë‹ˆê¹Œìš”. :)
1
2
구ì¸ì€ 1번
구ì§ì€ 2번
서버
구글ì—ì„œ ‘ì´ìŠ¹ìš° ì´ë ¥ì„œâ€™ í˜¹ì€ â€˜ì´ìŠ¹ìš° ì´ë ¥ì„œ 서버’ 를 검색하시면
2ê°œì˜ ìŠ¬ë¼ì´ë“œê°€ 나오는ë°ìš”.
1ë²ˆì€ ì œê°€ 구ì§í•  ë•Œ ë§Œë“¤ì—ˆë˜ ì´ë ¥ì„œ 슬ë¼ì´ë“œ
2ë²ˆì€ ¶¥Œë¦¬í† ì— 입사해서 함께할 팀ì›ì„ ì°¾ì„ ë•Œ ë§Œë“¤ì—ˆë˜ ìŠ¬ë¼ì´ë“œì—ìš”.
다시 정리하면 여러분ì€
구ì¸ì€ 1번
구ì§ì€ 2번
ë§í¬ë¥¼ í´ë¦­í•˜ì‹œë©´ ë©ë‹ˆë‹¤. :)
asbubam
asbubam @ Flitto.com
ê°ì‚¬í•©ë‹ˆë‹¤. :)
발표 들어주시고, ë˜ ì´ë ‡ê²Œ 슬ë¼ì´ë“œ 찾아 ë´ì£¼ì…”ì„œ ê°ì‚¬í•©ë‹ˆë‹¤.
온 ì„¸ìƒ ê°œë°œìžë¥¼ 다 만나고 ì‹¶ì€ ì €ë‹ˆê¹Œ
언제든 편하게 ì—°ë½ì£¼ì‹œê³ , 페ì´ìŠ¤ë¶ ì¹œêµ¬ë„ í•´ì£¼ì„¸ìš”! :)
ë²ˆì—­ì´ í•„ìš”í•  ë•Œ 집단지성 번역 í”Œëž«í¼ ¶¥Œë¦¬í†  기억해주시고,
서버, 웹, 앱 개발팀, 마케팅, ê¸°íš ì „ì²´íŒŒíŠ¸ì—ì„œ ìƒì‹œ êµ¬ì¸ ì¤‘ì— ìžˆìœ¼ë‹ˆ
ì„œë¹„ìŠ¤ì— ê´€ì‹¬ì´ ìžˆìœ¼ì‹œë©´, 그리고 저와 함께 ì¼í•˜ê³  싶으시다면 언제든 ì—°ë½ì£¼ì„¸ìš”!

More Related Content

Node.js in Flitto

  • 1. p l a y . n o d e ( ) ; asbubam @ Flitto 집단지성 번역 í”Œëž«í¼ ¶¥Œë¦¬í† ëŠ” 노드를 어떻게 사용하는가? photo by Jongho Jang
  • 2. C, Java in 여기저기 Ruby on Rails, Node.js in News1 Node.js in Flitto Punk Band bass Fashion Photography in Tokyo Seungwoo Lee Engineer asbubam@Flitto.com … dalsdoll
  • 3. ç¾ ¶¥Œë¦¬í†  남성후디 ì „ì†ëª¨ë¸ í™œë™ ì¤‘ 특기: ì—­ë™ì ì¸ í¬ì¦ˆ 특ì´ì‚¬í•­: ì´¬ì˜ í›„ 다ì´ì–´íŠ¸ë¡œ 체중ê°ëŸ‰ì— 성공 스타트업 ¶¥Œë¦¬í† ì˜ 개발ìžìž…니다. photo by Jongho Jang www.flitto.com store
  • 7. 하지만 저는 ¶¥Œë¦¬í†  ë²ˆì—­ìš”ì²­ê¸°ëŠ¥ì„ í†µí•´ ì¼ë³¸ì–´ì™€ í•œêµ­ì–´ì— ëŠ¥í†µí•œ minj9ë•¡ë•¡ 회ì›ë‹˜ì˜ ë„ì›€ì„ ë°›ì„ ìˆ˜ 있었습니다. :)
  • 8. 언어ì˜ìž¥ë²½ ⾔語ã®å£ language barrier ¶¥Œë¦¬í† ëŠ” ë²ˆì—­ì´ í•„ìš”í•œ 사람과 ë²ˆì—­ì„ í•  수 있는 ì‚¬ëžŒì„ ë˜‘ë˜‘í•˜ê²Œ 연결해주고, ì§‘ë‹¨ì§€ì„±ì˜ íž˜ì„ í†µí•´ ì–¸ì–´ì˜ ìž¥ë²½ì„ ë›°ì–´ë„˜ëŠ” 서비스입니다.
  • 9. www.Flitto.com www.Flitto.com 웹사ì´íŠ¸ ì•„ì´í°, 안드로ì´ë“œ 마켓ì—ì„œ 만나실 수 있습니다!
  • 10. 50ê°œ Node.js 프로ì íŠ¸ (20ê°œ ë°ëª¬í˜•íƒœ) ë©”ì¸ì„œë²„ 약160 ê°œ endpoint * CRUD REST API ì˜¤ëŠ˜ì€ ì£¼ìš” 부분만 설명합니다. Node.js in Flitto
  • 11. 사용 기술 AWS 위ì—ì„œ 운용하고 있으며 아래 ê¸°ìˆ ë“¤ì„ ì‚¬ìš©í•©ë‹ˆë‹¤.
  • 12. 사용 기술 backbone.js, angular.js는 어드민ì—ì„œ 사용하고 웹서비스 프론트는 jquery와 순수 ìžë°”스í¬ë¦½íŠ¸ë¡œ 구성ë˜ì–´ 있습니다. sequelize는 백오피스ì—ì„œ 사용합니다.
  • 13. 서버 구조 main server push admin crawler task api / front end ë©”ì¸ì„œë²„, 어드민, í¬ë¡¤ë§, 테스트관리, 푸쉬를 처리하는 ë°ëª¬ë“¤ê³¼ ê³ ìœ ì˜ ê¸°ëŠ¥ì„ í•˜ëŠ” ìž‘ì€ ì„œë¹„ìŠ¤ë“¤ë¡œ ì´ë¤„져있습니다.
  • 14. 서버 구조 main server push admin crawler task api / front end PostgreSQL(RDS) ì„ ë©”ì¸ë””비로 하고 ìš©ë„ì— ë”°ë¼ì„œ 휘발성, 비정형 ë°ì´í„°ëŠ” mongoDBì—, 세션정보와 ì ‘ê·¼ì´ ë¹ˆë²ˆí•œ ë° ì´í„°ëŠ” Redisì— ì €ìž¥í•˜ê³  있습니다.
  • 15. 디렉터리 구조 - app - models - services - routes - views - utils - test - … - public ë©”ì¸ ì„œë¹„ìŠ¤ì˜ ë””ë ‰í„°ë¦¬ 구조는 ì¼ë°˜ì ì¸ express 프로ì íŠ¸ì˜ 구조와 비슷합니다.
  • 16. Node.js 4.2.1 production ì „ ì„œë²„ì— ì ìš© (2015/10/27) ì£¼ì˜ ê¸°ì¡´ì— ì„¤ì¹˜ëœ node_modules npm cache node_gyp ê¹”ë”하게 지우고 재 설치 https://github.com/nodesource/distributions 참고
  • 17. 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회 ë Œë”ë§ í…ŒìŠ¤íŠ¸ 특정 페ì´ì§€ë¥¼ 2가지 버전 환경ì—ì„œ 테스트한 결과로 모든 í™˜ê²½ì„ í†µí‹€ì–´ 14.05%를 보장할 수는 없지만 실제 서비스 ë°˜ì˜ê²°ê³¼ 버전업으로 만족할 만한 ì„±ëŠ¥ì„ ì–»ê³  있다고 íŒë‹¨ë©ë‹ˆë‹¤.
  • 18. express 4.x.x express 4.8.x 를 프러ë•ì…˜ì—ì„œ ë¬¸ì œì—†ì´ ì‚¬ìš©í•˜ê³  있습니다.
  • 19. 사용 패키지 aws-sdk cron geoip gm hiredis kue moment nodemailer qr-image … cron: 프로세스 ë‚´ì—ì„œ ì •ì˜í•˜ëŠ” í¬ë¡ ìž¡ 실행 geoip: ipë¡œ geolocation ì •ë³´ 가져오기 gm: ì´ë¯¸ì§€ 변환, hiredis: redis LRANGE 등ì—ì„œ ì„±ëŠ¥í–¥ìƒ kue: redis ì— ë¶™ì—¬ì„œ í잉, moment: 날짜 시간 i18nì ìš© nodemailer: ë©”ì¼ì „송, qr-image: qr코드 ìƒì„±
  • 20. 개발환경 = + https://www.jetbrains.com/webstorm 최근엔 ë””ë²„ê¹…ë„ ë§Žì´ ì¢‹ì•„ì¡Œì–´ìš”. :)
  • 21. 코드 컨벤션 서버팀ì›ì´ 3명ì´ìƒì´ ë˜ë©´ì„œë¶€í„° 코드 ì»¨ë²¤ì…˜ì„ ìœ„í‚¤ì— ì •ë¦¬í•˜ê³  있어요.
  • 22. db schema 버전관리 flyway flyway를 사용해서 db schema 버전관리를 하고 있어요. ê°œë°œìž ê°„ì˜, í˜¹ì€ ì„œë²„ ê°„ì˜ db schema싱í¬ì— 편하고 좋아요.
  • 23. step / async / promise Callback What? Callback ì´ ì¤‘ì²©ë˜ëŠ” 문제는 stepì„ ë§Žì´ ì´ìš©í•˜ë‹¤ê°€ 작년부터는 asyncë¡œ ì´ë™í•˜ê³  있고 특정부분ì—는 promise를 사용하고 있어요. ê°œì¸ì ì¸ ìƒê°ì´ì§€ë§Œ Node.jsë¡œ 개발하면서 Callbackì— ì˜í•œ 문제는 í¬ê²Œ ê²ªì€ ê²½í—˜ì´ ì—†ì–´ìš”. 오히려 비ë™ê¸°ì ì¸ ì„¤ê³„ê²½í—˜ì´ ì•„ì§ ë§Žì§€ì•Šì•„ì„œ 겪는 시행착오가 ë” ë§Žì€ ê²ƒ 같아요.
  • 24. tpl() 메소드를 통한 백엔드 / 프론트엔드 그리기 íŒŒìƒ¬ì„ ë Œë”ë§í•˜ëŠ” tpl() 메소드를 ì •ì˜í•˜ê³  백엔드와, 프론트엔드ì—ì„œ ë™ì¼í•œ 탬플릿 파ì¼, 메소드를 ì´ìš©í•´ì„œ íŒŒìƒ¬ì„ ê·¸ë¦¬ê³  있어요.
  • 25. pg_node pg 를 래핑 트랜잭션 처리 추가 query string 출력 log() 추가 postgresql ì—°ë™ ì‹œ ë§Žì´ ì‚¬ìš©í•˜ëŠ” pg ëª¨ë“ˆì— íŠ¸ëžœìž­ì…˜ 처리를 래핑하고 query parameter를 넣어 log를 출력하는 log 메소드를 추가해서 사용해요.
  • 26. 공통으로 사용하는 코드 모듈화 서비스 ì „ì—­ì—ì„œ 사용하고, 공통ë˜ëŠ” ë¶€ë¶„ì€ ë³„ë„ì˜ ëª¨ë“ˆë¡œ 분리해서 여러곳ì—ì„œ 사용하고 있어요.
  • 27. 프론트엔드 패키징 ìžë™í™” 변경 ì „: grunt + python 변경 후: grunt + gulp 스프ë¼ì´íŠ¸ ì´ë¯¸ì§€ ìƒì„± JS, css 압축 등 프론트엔드 íŒ¨í‚¤ì§•ì— grunt + gulp ì¡°í•©ì„ ì‚¬ìš©í•´ìš”.
  • 28. 서비스가 18ê°œ 언어 ì§€ì› -> error ë©”ì‹œì§€ë„ 18ê°œ 언어로 서비스 ë‚´ 모든 문구, ì—러문구, apiì— ìžì²´ 구현한 i18n ë°˜ì˜ ì‹±í¬ëŠ” redis pub/sub
  • 29. getError(errCode, 사용ìžì˜ language 고유키); { statusCode: 404, body: { code: 404, desc: “Not Foundâ€, message: “대ìƒì´ 없습니다.†resource: “url…†} } errCode와 language 고유 í‚¤ì˜ ì¡°í•©ì„ í†µí•´ 사용ìžì˜ 모국어로 오류코드를 출력하고 있어요. statusCode는 httpìŠ¤íŽ™ì„ ë”°ë¥´ê³  body.code는 디테ì¼í•˜ê²Œ ì •ì˜í•´ì„œ 사용해요. ì—ëŸ¬ì½”ë“œì— ëŒ€ì‘하는 서비스와 ë””ë²„ê¹…ì„ ìœ„í•´ì„œ 유저ì—게 보여지는 ì—러(녹색부분) ì„œë²„ì— ë³´ì—¬ì§€ëŠ” ì—러(붉ì€ìƒ‰ë¶€ë¶„)를 구분해서 처리해요.
  • 30. test mocha, should test는 mocha 와 should ì¡°í•©ì„ ì‚¬ìš©í•´ìš”.
  • 31. forever -> pm2 프로세스 관리는 forever ì—ì„œ pm2ë¡œ 넘어가서 최근 프로ì íŠ¸ëŠ” 대부분 pm2를 사용하고 있어요. pm2ê°€ 조금 ë” ì´ì˜ê³ , 조금 ë” ì•ˆì •ì ì¸ 것 같아요.
  • 32. 글로벌유저 ëŒ€ì‘ ì ‘ì† ìœ„ì¹˜ 기준 타임존 계산 ë° ì„œë¹„ìŠ¤ 심야시간 푸쉬받지않기! ìš°ë¦¬ì˜ ì‹¬ì•¼ì‹œê°„ != ìœ ì €ì˜ ì‹¬ì•¼ì‹œê°„ ¶¥Œë¦¬í† ëŠ” 현재 170여개국ì—ì„œ 사용 중ì´ê¸° 때문ì—, 실제 유저가 ì ‘ì†í•˜ëŠ” ìœ„ì¹˜ì˜ íƒ€ìž„ ì¡´ì— ë§žê²Œ 서비스를 ë°˜ì˜í•˜ê³  있어요.
  • 33. dev / staging / real ê°œë°œí™˜ê²½ì€ dev / staging / real ë¡œ 분리해서 사용하구요.
  • 34. ë°°í¬ Fabric + 기존ì—는 Fabric만 사용해서 ë°°í¬í–ˆì—ˆëŠ”ë°ìš”. 팀ì›ë“¤ì´ 늘고, ë™ì‹œì— 개발ë˜ëŠ” 피ì³ë„ 늘어나면서 Jenkins를 ë„입하게 ë˜ì—ˆê³  현재는 ë°°í¬í•  ë•Œ 굉장히 편안하고 ë¶€ë‹´ì—†ì´ í•˜ê³  있어요.
  • 35. AWS ELB 무중단 서비스 ë””í”Œë¡œì´ AWS ELB를 물론 사용하고 있고 ë””í”Œë¡œì´ ì‹œì—, aws-sdk ë¡œ 구현한 ë°°í¬ë¡œì§ì„ 통해 ELBì—ì„œ 순차ì ìœ¼ë¡œ 빼고 ì—…ë°ì´íŠ¸ 하고 다시 넣고 하는 ê³¼ì •ì„ ê±°ì¹˜ê³  있어요.
  • 36. logging winston / morgan ë¡œê¹…ì€ í”„ë¡œì íŠ¸ë§ˆë‹¤ 조금 다르지만 대체ì ìœ¼ë¡œ winston ê³¼ morganì„ ì‚¬ìš©í•´ìš”.
  • 37. 웹 푸쉬 socket.io + redis pub/sub socket.io + redis pub/sub ì„ í†µí•´ ì›¹ì„œë¹„ìŠ¤ì— ì‹¤ì‹œê°„ 알람 ê¸°ëŠ¥ì„ êµ¬í˜„í–ˆì–´ìš”.
  • 38. ì‹¤í—˜ì  admin 변경 ì „: backbone.js 변경 후: angular.js, sequelize 실험ì ì¸ 기능ì´ë‚˜, ê¸°ìˆ ì˜ ë°˜ì˜ì€ ë©”ì¸ì„œë¹„스ì—ë„ ë§Žì´ í•˜ì§€ë§Œ ì–´ë“œë¯¼ì— íŠ¹ížˆ ë§Žì´ ì‹œí—˜ì‚¼ì•„ ë„ìž…í•´ë³´ê³  있어요. ì–´ë“œë¯¼ì€ ê¸°ì¡´ì—는 backbone.js를 사용하다가 최근ì—는 angular.js 와 sequelize를 사용하고 있어요.
  • 39. ê·¸ë°–ì— ë…¸ë“œë¡œ 하는 것 쉘스í¬ë¦½íŠ¸, í¬ë¡ ìž¡ 쉘 스í¬ë¦½íŠ¸, í¬ë¡ ìž¡ë„ Node.js 스í¬ë¦½íŠ¸ë¡œ 구현하고 있어요. Node.jsë¡œ 다할 수 있어요. :)
  • 40. ê·¸ë°–ì— ë…¸ë“œë¡œ 하는 것 u+ xpay, alipay, paypal giftishow, happymoney Node.js í¬íŒ… ê¸°ì¡´ì— php, javaë¡œ 작성ë˜ì–´ ìžˆë˜ apië“¤ì„ Node.js ë¡œ í¬íŒ…í•´ì„œ 사용해요.
  • 41. ê·¸ë°–ì— ë…¸ë“œë¡œ 하는 것 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); AWS S3ì—ì„œ ìˆ˜ë§Žì€ íŒŒì¼ì„ ë™ì‹œì— 옮겨야할 ë• aws-sdk + stream ì¡°í•©ì´ ìµœê³ ì—ìš”.
  • 42. ê·¸ë°–ì— ë…¸ë“œë¡œ 하는 것 형태소 ë¶„ì„ â€œë‚´ì¼ ì•„ì¹¨ê¹Œì§€ ì²¨ë¶€ëœ ì—‘ì…€íŒŒì¼ì— í¬í•¨ëœ 문장 중ì—ì„œ 3ê¸€ìž ì´ìƒì´ë©´ì„œ 2번ì´ìƒ 반복ë˜ëŠ” 명사, 형용사 뽑아주세요.†“그리고 ~ì´ëŸ° ëŠë‚Œì ì¸ ëŠë‚Œì˜ ë¬¸ìž¥ë“¤ë„ ë½‘ì•„ì£¼ì„¸ìš”.†mecab-ffi ì€ì „한닢(오픈소스 한국어 형태소 분ì„기 프로ì íŠ¸)ì—ì„œ 사용하는 mecab-ko(오픈소스 형태소 ë¶„ì„ ì—”ì§„ì¸ MeCab를 í•œêµ­ì–´ì— ë§žê²Œ í¬íŒ…)를 @xissyë‹˜ì´ Node.js ë¡œ í¬íŒ…
  • 43. ê·¸ë°–ì— ë…¸ë“œë¡œ 하는 것 형태소 ë¶„ì„ ë¼ë„¤ì¦ˆ 파워 ì—센셜 스킨 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 mecab-ffi ëª¨ë“ˆì„ í†µí•´ 어렵지 않게 구현할 수 있었어요. :)
  • 45. 시행착오 surrogate pair UTF-16(16-bit Unicode Transformation Format)ì€ ìœ ë‹ˆì½”ë“œ ë¬¸ìž ì¸ì½”딩 ë°©ì‹ì˜ í•˜ë‚˜ì´ ë‹¤. 주로 사용ë˜ëŠ” 기본 다국어 í‰ë©´ (BMP, Basic multilingual plane)ì— ì†í•˜ëŠ” 문ìžë“¤ì€ 그대로 16비트 값으로 ì¸ì½”ë”©ì´ ë˜ê³  ê·¸ ì´ìƒì˜ 문ìžëŠ” 특별히 정해진 ë°©ì‹ìœ¼ë¡œ 32비트로 ì¸ì½”ë”©ì´ ëœë‹¤. 기본 다국어 í‰ë©´ì— í¬í•¨ë˜ì§€ 않는 문ìžë“¤, 즉 16비트로 ê°’ì„ í‘œí˜„í•  수 없는 문ìžë“¤ì€ 서러 게ì´íŠ¸(Surrogate) ë¬¸ìž ì˜ì—­ì— 해당하는 ë‘ ê°œì˜ 16비트 문ìžë¡œ 변환ë˜ì–´ ì´ í•œ ìŒ(즉 32 비트)ì´ ê·¸ 문ìžë¥¼ 나타내게 ëœë‹¤. https://ko.wikipedia.org/wiki/UTF-16 문제를 겪고 ì•Œê²Œëœ surrogate pair
  • 47. > var str = ‘안녕하세요반가워요ud83dude03하ì´'; > str ‘안녕하세요반가워요😃하ì´â€™ > str.length str.length ì˜ ê°’ì€ ëª‡ì¼ê¹Œìš”?
  • 48. > var str = ‘안녕하세요반가워요ud83dude03하ì´'; > str ‘안녕하세요반가워요😃하ì´â€™ > str.length 13 > encodeURI(str.slice(0,10)) URIError: URI malformed at encodeURI (native) … 네 13ì´ì—ìš”. 그리고 10번째까지 ìžë¥´ë©´ ìŠ¤ë§ˆì¼ emoji까지 sliceë˜ë¦¬ë¼ ìƒê°í–ˆëŠ”ë° ì˜¤ë¥˜ê°€ ë°œìƒí•˜ê³  ë§ì•˜ì–´ìš”.
  • 49. > var str = ‘안녕하세요반가워요ud83dude03하ì´'; > str ‘안녕하세요반가워요😃하ì´â€™ > str.length 13 > 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 node.js v0.6 버전부터 í¬í•¨ëœ punycode를 통해 decodingí•œ 결과를 사용해서 slice하면 ì´ ë¬¸ì œë¥¼ í•´ê²°í•  수 있어요. 좀 ë” ìžì„¸í•œ ì„¤ëª…ì€ ì—¬ê¸°ì— -> https://t.co/fbehjnz8fQ
  • 50. 시행착오 forEach ì•ˆì— ë¹„ë™ê¸°ì½”ë“œ ì—„~~ì²­ ë§Žì´ ë™ì‹œ 실행 시스템 콜스íƒì—ë„ í•œê³„ê°€.. users.forEach(function(user) { 헨리를 팔로우한 ì „ì²´ 유저ì—게 비ë™ê¸°ë¡œ 푸쉬 }); async.queue ë“±ì„ ì‚¬ìš©í•´ì„œ ë™ì‹œ 실행ë˜ëŠ” 비ë™ê¸°ì½”드를 제어 í•­ìƒ ì–¼ë§ˆë‚˜ ë§Žì€ ì–‘ì˜ ì½”ë“œê°€ ë™ì‹œì— 비ë™ê¸°ë¡œ 실행ë˜ê³  있는 지 ìƒê°í•˜ê³  ë˜ ìƒê°í•´ì•¼ í•´ìš”!
  • 51. 시행착오 npm install í–ˆë”니 ë™ìž‘ì´ ë‹¬ë¼ìš”. 버전올ë¼ê°€ë©´ì„œ ë³€ê²½ëœ ì‚¬í•­ 요체í¬! ex) "sequelize": “latest†sequelize v2하고 v3는 달ë¼ë„ 너무달ë¼ìš”. ëª¨ë“ˆì´ ë²„ì „ì—… ë˜ë©´ì„œ 성능향ìƒë§Œ ë˜ëŠ”게 ì•„ë‹ˆë¼ ì‚¬ìš©ë°©ë²•ì´ë‚˜ 파ë¼ë¯¸í„°íƒ€ìž…ì´ ë°”ë€ŒëŠ” 경우가 있으니 모듈 릴리즈노트를 잘 살펴야해요!
  • 52. 시행착오 서버는 3년으로 사지ë§ê³  awsê°€ 가격ì¸í•˜ë¥¼ ê³„ì† í•˜ê³  새로운 ìƒí’ˆë„ 나오고 하니 1년단위로.. 예, 그렇다고 합니다. :)
  • 55. Çê˜ê³ ì‹¶ì–´ìš” es6 11/10 ì‹ ê·œ featureì— ì‚¬ìš© 시작!!! 마침 11/10ì¼ë¶€í„° 개발ë˜ëŠ” 새로운 featureì— classê°œë…부터 ë°˜ì˜í•˜ê²Œ ë˜ì—ˆìŠµë‹ˆë‹¤. :)
  • 56. Çê˜ê³ ì‹¶ì–´ìš” Node.js production ì ìš© ì¢‹ì€ ì˜ˆ ë˜ê¸° 오늘 발표 주제가 ‘node.js in production 사용 예’ 였다면 다ìŒì— ë˜ ë°œí‘œí•  기회가 있다면 ¶¥Œë¦¬í† ë¥¼ ê¼­ ì¢‹ì€ ì„œë¹„ìŠ¤ë¡œ 만들어서 ‘node.js in production (킹왕짱) ì¢‹ì€ ì˜ˆâ€™ ë¡œ 발표할 수 있기를… 하고 ë°”ë¼ë´…니다.
  • 57. Çê˜ê³ ì‹¶ì–´ìš” NPM package ë“±ë¡ ì˜¤í”ˆì†ŒìŠ¤ 기여 회사 내부ì—ì„œ 만들어서 사용하는 ëª¨ë“ˆë“¤ì„ ì´ì˜ê²Œ 정리해서 NPM packageì— ë“±ë¡í•˜ê³  오픈소스ì—ë„ ê¸°ì—¬í•˜ê³  싶어요.
  • 58. geoip PR ìž‘ì€ ë°œê±¸ìŒì´ì§€ë§Œ, 조금씩 PRë„ ë³´ë‚´ê³  ë¨¸ì§€ë„ ë˜ê³  있어요. :)
  • 59. Çê˜ê³ ì‹¶ì–´ìš” í‰ì¼ Node.js ì„¸ë¯¸ë‚˜ì— 4ë§Œì› ë‚´ê³  참여하는당신! 함께 하고 싶어요! 그래요. ì •ë§ ë‹¹ì‹ ê³¼ 함께하고 싶어요! 그리고, Node.js를 하는 ë” ë§Žì€ ê°œë°œìžë“¤ê³¼ 소통하고 싶어요! 저는 Node.js를 ì •ë§ ì¢‹ì•„í•˜ê³ , Node.jsë¡œ 개발하는게 ì •ë§ ì¦ê±°ìš°ë‹ˆê¹Œìš”. :)
  • 60. 1 2 구ì¸ì€ 1번 구ì§ì€ 2번 서버 구글ì—ì„œ ‘ì´ìŠ¹ìš° ì´ë ¥ì„œâ€™ í˜¹ì€ â€˜ì´ìŠ¹ìš° ì´ë ¥ì„œ 서버’ 를 검색하시면 2ê°œì˜ ìŠ¬ë¼ì´ë“œê°€ 나오는ë°ìš”. 1ë²ˆì€ ì œê°€ 구ì§í•  ë•Œ ë§Œë“¤ì—ˆë˜ ì´ë ¥ì„œ 슬ë¼ì´ë“œ 2ë²ˆì€ ¶¥Œë¦¬í† ì— 입사해서 함께할 팀ì›ì„ ì°¾ì„ ë•Œ ë§Œë“¤ì—ˆë˜ ìŠ¬ë¼ì´ë“œì—ìš”. 다시 정리하면 ì—¬ëŸ¬ë¶„ì€ êµ¬ì¸ì€ 1번 구ì§ì€ 2번 ë§í¬ë¥¼ í´ë¦­í•˜ì‹œë©´ ë©ë‹ˆë‹¤. :)
  • 61. asbubam asbubam @ Flitto.com ê°ì‚¬í•©ë‹ˆë‹¤. :) 발표 들어주시고, ë˜ ì´ë ‡ê²Œ 슬ë¼ì´ë“œ 찾아 ë´ì£¼ì…”ì„œ ê°ì‚¬í•©ë‹ˆë‹¤. 온 ì„¸ìƒ ê°œë°œìžë¥¼ 다 만나고 ì‹¶ì€ ì €ë‹ˆê¹Œ 언제든 편하게 ì—°ë½ì£¼ì‹œê³ , 페ì´ìŠ¤ë¶ ì¹œêµ¬ë„ í•´ì£¼ì„¸ìš”! :) ë²ˆì—­ì´ í•„ìš”í•  ë•Œ 집단지성 번역 í”Œëž«í¼ ¶¥Œë¦¬í†  기억해주시고, 서버, 웹, 앱 개발팀, 마케팅, ê¸°íš ì „ì²´íŒŒíŠ¸ì—ì„œ ìƒì‹œ êµ¬ì¸ ì¤‘ì— ìžˆìœ¼ë‹ˆ ì„œë¹„ìŠ¤ì— ê´€ì‹¬ì´ ìžˆìœ¼ì‹œë©´, 그리고 저와 함께 ì¼í•˜ê³  싶으시다면 언제든 ì—°ë½ì£¼ì„¸ìš”!