nodejs: 44개의 글
참조문서 : https://www.npmjs.com/package/body-parser post로 요청된 body를 쉽게 추출할 수 있는 모듈이다. 추출된 결과는 request객체(IncomingMessage 타입)에 body 속성으로 저장된다. API문서보면 다양한 메소드들이 많지만, 여기서는 URL-encoded form body parser만 사용한다. npm install body-parser 로 설치한다. 1. http 내장모듈만 쓰는 것과 뭐가 틀린가? http모듈로만 post body를 파싱하려면, req.on('data', function(chunk) { body += chunk; }); 와 같이 이벤트를 등록해야한다. 그다음에 인코딩처리를 해줘야한다. 그치만 body-parser를 쓰면 ..
참조문서 https://github.com/nodejs/node https://nodejs.org/ko/docs/guides/event-loop-timers-and-nexttick/ https://medium.com/the-node-js-collection/what-you-should-know-to-really-understand-the-node-js-event-loop-and-its-metrics-c4907b19da4c 이벤트루프는 nodejs 의 핵심개념인데, 열심히 파헤쳐보자. 먼저 구글에 널려있는 많은 아키텍처들은 전부 틀렸다고 한다. 이 말은 libuv의 핵심 개발자 Bert Belder 등이 했다고 참조문서에서 말한다. 아무튼 그래서 구글링을 열심히해봐도 공식문서에 부합하는 아키텍쳐 그림이 없..
참조문서 https://nodejs.org/ko/docs/guides/simple-profiling/ https://nodejs.org/api/debugger.html#debugger_v8_inspector_integration_for_node_js node에서 힙덤프 뜨기, CPU프로파일링 등을 하려면 몇가지 방법이 있지만, 이게 제일 쉽고 편한 것 같다. 1. 디버거 붙이기 node --inspect 소스명.js로 실행한다. 그러면 아래와 같이 나온다 chrome-devtools://devtools/remote/serve_file/@11cd6e111b9f111d1111f5bf532f6aec5f1111111/inspector.html?experiments=true&v8only=true&ws=127.0...
참조문서 : https://www.html5rocks.com/ko/tutorials/speed/static-mem-pools/ 1. 메모리 누수 원인 nodejs는 v8엔진에서 GC를 주기적으로 수행한다. nodejs는 메모리관리가 불완전하고 어려운데, 그 이유는 GC역시 메인스레드(이벤트루프)에서 실행되기 때문이다. 따라서 메인스레드가 바쁜 작업(CPU인텐시브)을 돌릴 경우, 메모리는 급격히 증가하는데.. GC가 낄 틈새가 없는 것이다. 2. 메모리 누수 해결방안 이러한 메모리 누수를 피하려면 3가지 방법이 있다. 모두 다 이벤트루프를 고려한 프로그래밍이다. process.nextTick과 setTimeout을 활용하여 GC가 낄 틈새를 만들어주는 것이다. 클로저와 스택의 빈번한 사용을 자제한다 GC를..
참조문서 http://docs.libuv.org/en/latest/index.html http://nikhilm.github.io/uvbook/index.html nodejs의 핵심이 libuv가 아닐까한다. 여기에 이벤트루프와 쓰레드풀들이 모두 있다. 1. libuv가 무엇인가? libuv는 비동기 입출력, 이벤트 기반에 초점을 맞춘 라이브러리이다. 전통적으로 IO처리는 요청마다 스레드를 사용하는 방식이다. 하지만 libuv는 비동기, 논블로킹 스타일을 사용한다. 이를 이용하기 위해 각 커널의 비동기IO를 이용한다. 리눅스의 경우에는 커널 2.6부터 적용된 AIO가 있고 윈도우에는 IOCP가 있다. 운영체제의 비동기 이벤트는 libuv의 이벤트로 취급된다. 예를들어 파일쓰기가 끝났다고 한다면, libu..
참조문서 : http://docs.libuv.org/en/latest/threadpool.html 기본적으로 뒤에서 열심히 일하는 워커(IO작업 담당)들은 멀티쓰레드인데, 기본 크기가 4이다. 이는 최대 128까지 늘릴 수 있다. 특정 함수가 쓰레드풀을 사용할 때, libuv는 최대 쓰레드 수를 미리 할당해주는데, 이를 늘려주면 스레딩의 성능이 향상된다. 대신 메모리 오버헤드가 늘어난다. 따라서 적당한 크기의 쓰레드 수를 잡아주면 좋다. nodejs에서 워커 쓰레드의 수는 process.env.UV_THREADPOOL_SIZE 에서 제어할 수 있다. 그러나 동적으로 소스.js 레벨에서 제어할 수는 없다. (소스.js에서process.env.UV_THREADPOOL_SIZE=64 이런거 안된다.) 따라서 ..
참조문서 : https://www.npmjs.com/package/request 내장 http모듈은 라인 수를 왕창 먹는다 http, https 분기처리 리다이렉트되서 상태코드 30x뜨는거 처리 로직 스트림으로 http소스 읽고 처리 로직 해결방안 : request 모듈 사용 http고 https고 request()면 다 한번에 읽는다 30x는 request() 요청 시, followRedirect와 maxRedirects 인자 설정으로 간단히 해결할 수 있다. http소스는 res.body에 이미 다 파싱되어있다. 1. 기본 사용 npm install request 로 설치한다. var request = require("request"); request("http://sjh836.tistory.com"..
참조문서 : http://restify.com/docs/home/ Restify는 Express에서 파생된 nodejs REST 프레임워크이다. npm install restify 으로 설치한다. 1. Express와 뭐가 다른가? 물론 둘다 RESTful API 서버를 만들 수 있다. 차이점만 보자면, express는 웹 모듈로서 웹 애플리케이션을 위해 많은 기능(템플릿, 렌더링 등)을 제공한다. restify는 express에 비해 가볍고, express의 아키텍처를 그대로 가져오면서, REST API서버운영을 위한 특화된 기능들이 있다. 즉 RESTful API서비스만을 위한 경량 프레임워크이다. 성능차이는 크게 없는 듯하다. 여러 포스팅에서 성능테스트한 글을 확인했지만 express와 restif..
참조문서 : http://expressjs.com/en/4x/api.html express는 경량 HTTP 웹 프레임워크다. 요청과 응답, 미들웨어 사용, 템플릿 엔진을 제공한다. npm install express 로 설치한다. 1. 미들웨어 작은 단위 모듈로 요청과 응답을 처리하는 함수 형태 express는 여러 개의 미들웨어로 구성 미들웨어 사용 설정 : app.use([미들웨어]) 예제 app.use(function (req, res) { res.send('hello Express!'); }); 1-1. 미들웨어 설정(mount) app.use([path,] function [,function]) path를 생략하면 루트(/)이다. function을 2개이상 둘 수도있다. 즉 같은 요청을 여러개의..
참조문서 : https://nodejs.org/dist/latest-v6.x/docs/api/http.html require('http'); 를 써야한다. nodejs는 자체적으로 http 서버를 갖고 있기 때문에, 아파치나 nginx 같은거 안써도 된다. 1. 개요 HTTP 서버 http.Server : HTTP 서버 http.IncomingMessage : HTTP 서버의 요청 메세지, Readable Stream 이다. http.ServerResponse : HTTP 서버의 응답 클래스 HTTP 클라이언트 http.Client : HTTP 클라이언트 http.ClientRequest : HTTP 클라이언트 요청 메세지 http.IncomingMessage : HTTP 서버의 응답 메세지, Reada..