4. What is Node.js
Created by Ryan Dahl starting in 2009.02 (personal project)
JavaScript Runtime on V8 JavaScript engine (Google Chrome Web
browser) based
Server Side JavaScript
implements some CommonJS (JavaScript: not just for browsers any
more!) standard spec like Couch DB, RingoJS
Single Thread(Not Multi Thread), Single Stack, Event Loop
Everything is Nonblocking I/O, But 개발자가 작성한 코드(싱글쓰레
드)는 동기
5. History
2009.02.09 Ryan posted “Event driven TCP library HTTP
Server on chrome web browser’s V8 engine” idea.
inspiration from (CouchDB, Ebb, Flow, FUSE, libebb, libeio, libev,
libircclient, Merb, Mongrel, NGINX, nginx-ey-balancer, Ragel, Ruby
on Rails, SqueezeBox, timber lang, XUpload)
2009.02.15 created GitHub repository
2009.11.07 v0.1.16 in JSConf.eu
2012.09.20 v0.8.9 14,919 NPM packages
6. Advantages
* 동시 접속 수에 따른 초당 요청 처리 수가 멀티쓰레딩에 비해 월등함.
100명의 동접자, 1메가 바이트 응답
node 822 req/sec
nginx 708 req/sec
thin 85 req/sec
mongrel 4 req/sec
* 2012년 9월 현재 14,919 개의 Package가 존재, 개발이 용이
* JavaScript
7. Disadvantages
CPU 개수, Memory 용량을 높여도 성능이 크게 향상되지 않는다.
(노드 인스턴스를 여러 개 실행함으로써 해결 가능)
짧은 역사로 인해 다양한 상황에서의 검증이 이뤄지지 않음
callback style 구현의 어려움
8. blocking / nonblocking
* blocking (동기)
puts(“이름을 입력하세요”);
var name = gets();
puts(“당신의 이름은 “ + name + “입니다.”);
puts(“next work.”);
* nonblocking (비동기)
puts(“이름을 입력하세요”);
gets(function(name) {
puts(“당신의 이름은 “ + name + “입니다.”);
});
puts(“next work.”);
9. Coding convention
* 들여쓰기 들여쓰기는 공백 2칸으로 한다.
* 세미콜론 세미콜론은 항상 사용한다.
* 작은따옴표 문자열 등은 큰 따옴표 대신 작은따옴표를 사용한다.
* 중괄호 다음과 같이 작성한다.
if (true) {
//내용
}
* 변수 소문자로 시작하는 카멜케이스(camel case) 사용
* 클래스 대문자로 시작하는 카멜케이스 사용
* 상수 모두 대문자
* 동등비교 == 대신 ===를 사용한다.
* 콜백함수 콜백함수에서 첫 파라미터는 에러 파라미터로 사용한다.
callback(err, param1, param2)
10. ex) simple web server
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello Worldn');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');
11. ex) tcp server
var net = require('net');
var server = net.createServer(function (socket) {
socket.write('Echo serverrn');
socket.pipe(socket);
});
server.listen(1337, '127.0.0.1');
12. ex) File System
var fs = require('fs');
fs.readFile(‘./test.txt’, encoding=‘utf-8’, function(err, data) {
if (err) {
throw err;
}
console.log(data);
});
console.log(‘파일의 내용 : ’);
//infinite loop
while(true) {}
//safe
setTimeout(function() {
console.log(5 secs timeout);
}, 5000);