JavaScript BackEnd/Node.js, Express: 71개의 글
참조문서 : http://ejs.co/#docs 1. ejs 란? ejs는 Embedded JavaScript Template의 약자로 nodejs 진영에서 많이 사용하는 템플릿엔진이다. 문법이 단순하다. 2. 기본 문법 주석 : JS 코드 : 변수 출력(html escape 처리: >를 $gt로 변환) : 태그내부 공백 제거 : html escape안하고 변수 출력 : ejs 분할 3. nodejs와 연동(= 데이터 넘겨주기) 3-1. express 없이 연동하기 const ejs = require("ejs"); ejs.render(경로, 데이터, 옵션); 3-2. express 에서 연동하기 app.js 에서 app.set('view engine', 'ejs'); 처리하는 라우터에서 아래와 같은 로직..
참조문서 : 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를..
참조문서 : https://www.npmjs.com/package/mongoose-auto-increment 시퀀스 넘버키를 편하게 쓸 수 있다. npm install mongoose-auto-increment 를 다운로드받는다. 1. 연결 const connection = mongoose.connect(....) autoIncrement.initialize(connection); 으로 연결한다. mongoose.connect의 콜백에 autoIncrement.initialize()를 넣으면 Error: mongoose-auto-increment has not been initialized 가 떨어진다. 2. 시퀀스넘버 설정 const logger = new Schema({..}) logger.plugi..
참조문서 : http://mongoosejs.com/docs/guide.html Mongoose는 MongoDB의 ODM(Object Data Mapping)으로 nodejs 모듈이다. ODM은 데이터베이스와 객체지향 프로그래밍 언어 사이 호환되지 않는 데이터를 변환하는 프로그래밍 기법을 말한다. 여기서는 4.11버전을 사용중이다. npm install mongoose 로 설치한다. 1. mongodb VS mongoose 자바로 생각하면 mongodb모듈은 JDBC드라이버고, mongoose는 Hibernate나 Mybatis같은 개념같다. 속도가 예민하다면 mongodb모듈을 쓰라고 말하고 있다. 기본적으로 mongoose도 mongodb 모듈 위에서 동작하므로, mongodb의 모든 것을 사용할 수..
참조문서 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"..