일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- redis
- 데이터통신
- mybatis
- effective
- Static
- html
- Linux
- git
- reactive
- mongodb
- Heap
- ajax
- r
- AWS
- github
- socket
- 네트워크
- reactor
- Lombok
- Elk
- HTTP
- javascript
- cache
- nodejs
- VCS
- network
- spring
- Java
- libuv
- NoSQL
- Today
- Total
목록node.js (18)
빨간색코딩
1. 테스트를 왜 해야하는가?테스트를 안하는 개발자는 없다. 코드 작성 후 서버를 뛰워서 api url을 호출해서 응답값을 확인해보고, UI에서 버튼을 눌러보고 하는 것도 모두 테스트이다. 그러나 여기서 다루는 테스트의 정의는 '개발자가 작성한 테스트 코드에 의한 테스트'이다. 이것은 코드로 작성되었으므로 테스트 자동화가 가능해지며(CI연동 등), 다른 개발자도 이것을 통해 동일하게 반복적으로 테스트할 수 있어진다.1-1. 테스트 코드의 중요성반복적인 행위를 줄여준다. (비용감소) 테스트코드 없이 테스트를 하려면 계속 서버를 on/off하며 수동으로 동작시켜 줘야 할 것이다. (주로 nodemon 활용) 궁극적으로 애플리케이션이 복잡해진다면 테스트역시 복잡해진다.빠른 오류&버그 확인과 수정, 리팩토링의 ..
참조문서 : https://ejs.co/#docs1. 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-parserpost로 요청된 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를 쓰면 bodyP..
참조문서https://github.com/nodejs/nodehttps://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:https://devtools/remote/serve_file/@11cd6e111b9f111d1111f5bf532f6aec5f1111111/inspector.html?experiments=true&v8only=true&ws=127.0.0.1:9..
참조문서 : 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.plugin(aut..
참조문서 : https://mongoosejs.com/docs/guide.htmlMongoose는 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의 모든 것을 사용할 수 있다.2..
참조문서 https://docs.libuv.org/en/latest/index.html https://nikhilm.github.io/uvbook/index.html nodejs의 핵심이 libuv가 아닐까한다. 여기에 이벤트루프와 쓰레드풀들이 모두 있다. 1. libuv가 무엇인가? libuv는 비동기 입출력, 이벤트 기반에 초점을 맞춘 라이브러리이다. 전통적으로 IO처리는 요청마다 스레드를 사용하는 방식이다. 하지만 libuv는 비동기, 논블로킹 스타일을 사용한다. 이를 이용하기 위해 각 커널의 비동기IO를 이용한다. 리눅스의 경우에는 커널 2.6부터 적용된 AIO가 있고 윈도우에는 IOCP가 있다. 운영체제의 비동기 이벤트는 libuv의 이벤트로 취급된다. 예를들어 파일쓰기가 끝났다고 한다면, libu..
참조문서 : https://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("https://sjh836.tistory.com",..
참조문서 : https://restify.com/docs/home/Restify는 Express에서 파생된 nodejs REST 프레임워크이다. npm install restify 으로 설치한다.1. Express와 뭐가 다른가?물론 둘다 RESTful API 서버를 만들 수 있다. 차이점만 보자면, express는 웹 모듈로서 웹 애플리케이션을 위해 많은 기능(템플릿, 렌더링 등)을 제공한다.restify는 express에 비해 가볍고, express의 아키텍처를 그대로 가져오면서, REST API서버운영을 위한 특화된 기능들이 있다. 즉 RESTful API서비스만을 위한 경량 프레임워크이다.성능차이는 크게 없는 듯하다. 여러 포스팅에서 성능테스트한 글을 확인했지만 express와 restify는 비슷..
참조문서 : https://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..
1. 중첩 콜백 콜백지옥에 빠지기 쉬운 상황 task1 실행 이후에 task2,3,4 등이 순차적 실행 task1 실행 결과를 이용해 task2 가 실행 예제로 본다면 아래와 같은 상황이다.task1(a, b, function(err, result1) { task2(c, function(err, result2) { task3... task4... }); }); 2. Async 참조문서 : https://caolan.github.io/async/docs.html 외부모듈이기 때문에 npm install async로 설치한다. 행위 순서 제어 series(tasks[, callback]) : 각 태스크는 함수이고, 중간에 에러가 나면 다음태스크를 실행하지 않고, 완료 콜백으로 에러를 전달한다. results..