node js 21.05.05


  • Node.js : 크롬 v8 엔진으로 만든 자바스크립트 런타임. 이벤트 기반 및 논블로킹 IO 모델 특성을 가지고 있다.

v8 : 자바스크립트를 기계어로 컴파일 런타임 : 프로그래밍 언어가 구동되고 있는 환경

이벤트 : 유저의 버튼 클릭이나 네트워크에 리소스 요청 하는 것 등

논블로킹(비동기): 다음 함수의 실행이 현재 함수의 종료를 기다리지 않음 ( vs 블로킹(동기) : 다음 함수의 실행이 현재 함수의 종료 이후에 이루어지는 것)

I/O 모델 : input(request 등)을 주면 output(response)을 주는 모델

노드 JS는 자바스크립트를 컴파일 해주는 엔진(v8)으로 빌드 된 자바스크립트가 구동 되는 환경으로 유저의 클릭이나 네트워크에 리소스를 요청하는 이벤트가 논블로킹으로 이루어지는 인풋/아웃풋 모델 특성을 가지고 있다.

즉, Node.js는 자바스크립트를 컴파일 하여 구동하고, 이벤트 기반의 논블로킹 모델로 속도가 빠른 특징을 가지고있는 자바스크립트 구동 환경

  • Node 내장 모듈 : 노드에 내장 된 모듈 (ex : fs, http, url, path 등). (Node가 설치 되어 있다면 별도로 설치할 필요가 없다)

  • module 사용 방법

require('모듈 이름')
  • NPM(노드 패키지 매니저) : 노드 모듈 오픈소스 라이브러리. 사용자들이 만든 외장 모듈들이 모여있는 모듈 스토어(== 앱스토어)
package.json

NPM을 활용하기 위한 정보들이 모여있는 파일. + 프로젝트 전반에 관한 정보가 적혀있음.

  • scripts : CLI에서 해당 코드 실행 가능
$ npm 스크립트명
// 스크립트 명에 있는 값 실행.
  • dependencies : production과 관계 있음. 설치 시 –save 옵션을 줘야한다.
$ npm i --save react
// or
$ yarn add react

save를 꼭 해줘야하는 이유 : 다른 사람이 git clone을 하고 npm i로 dpendencies에 있는 미설치 모듈 설치 가능. 협업을 위해 save를 써서 package.json의 dpendencies에 저장. 만약 dpendencies에 저장하지 않는다면 저장되지 않은 모듈은 npm i로 설치 불가. 해당 모듈이 코드에서 쓰이고 있다면 코드는 오류가 발생(이 경우 별도로 모듈 설치가 필요하다.)

  • devDependencies : production과 관계 없는 개발만을 위한 dependency

dev dependency에 패키지 설치 시 마지막에 –dev 옵션을 줘서 등록한다.

$ npm install @babel/core --dev

nodemon : 저장 사항을 반영해서 서버를 새로고침 해주는 라이브러리(모듈)

npm 사용법

1.npm init : pakage.json 설정 후 생성

$ npm init
// or
$ npm init -y  // 설정 기본 값으로

2.nodemon 설치 :

$ npm i nodemon --dev
// 프로덕션이 아닌 개발만을 위한 모듈이므로 --dev에 저장해준다.

3.script 등록

  • pakage.json
  "scripts": {
    "test": "mocha spec/test.mocha.js",
    "report": "mocha spec/test.mocha.js --reporter @mochajs/json-file-reporter",
    "submit": "codestates-submission"
  },
  • 실행 방법
$ npm 스크립트명
// 스크립트 명에 저장 된 값이 실행

$ npm run test
// or
$ npm test
  • pakage.json 예시
// 프로젝트 정보 : npm init으로 설정 가능
{
  "name": "chatterbox-client",
  "version": "1.0.0",
  "description": "codestates-immersive-course-sprint",

  // production과 관계 있는 dependency : npm i 모듈명 --save
  "dependencies": {
    "@codestates-cc/submission-npm": "^1.1.2"
  },
  // production과 관계 없는 개발만을 위한 dependency : npm i 모듈명 --dev
  "devDependencies": {
    "@mochajs/json-file-reporter": "^1.3.0",
    "chai": "^4.2.0",
    "eslint": "^5.14.1",
    "husky": "^0.14.3",
    "jsdom": "^16.4.0",
    "lint-staged": "^7.3.0",
    "mocha": "^8.2.1",
    "sinon": "^7.2.4"
  },
  // 설정된 스크립트 : [npm 스크립트명]으로 실행
  "scripts": {
    "test": "mocha spec/test.mocha.js",
    "report": "mocha spec/test.mocha.js --reporter @mochajs/json-file-reporter",
    "submit": "codestates-submission"
  },
  "lint-staged": {
    "linters": {
      "*.js": [
        "eslint",
        "git add"
      ]
    },
    "ignore": [
      "node_modules/"
    ]
  },
  "author": "Codestates"
}

Node Debugger : Node js 디버깅 방법

–inspect 옵션 활용

// pakage.json
"scripts": {
    "start": "nodemon --inspect server/basic-server.js",
    "test": "jest",
}

// --inspect 옵션을 작성하고 서버에 연결하면 콘솔에 다음과 같은 메시지가 나온다.
// Debugger listening on ws://127.0.0.1...

브라우저 개발자도구 접속 후 노드 로고(녹색 육각형) 클릭

  • app.js
app.get('/messages', cors(), (req, res) =>{
    console.log(res);
    res.status(200).send(messages)
  })
app.post('/messages', cors(), jsonParser, (req, res) =>{
    console.log(res);
    // jsonParser를 하면 데이터가 req.body에 있다.
    messages.results.push(req.body)
    console.log(messages);
    res.status(201).send(messages)
  })
app.use(cors(), (req, res) => {
  res.status(404).send('invalid user')
})
  • 개발자 도구 노드 콘솔 창 : HTTP 요청의 콘솔 로그를 볼 수 있다.
ServerResponse {_events: {…}, _eventsCount: 2, _maxListeners: undefined, outputData: Array(0), outputSize: 0, …}

{results: Array(1)}

brk : 시작하자마자 디버깅

// pakage.json
"scripts": {
    "start": "nodemon --inspect-brk server/basic-server.js",
    "test": "jest",
}

// --inspect 옵션을 작성하고 서버에 연결하면 콘솔에 다음과 같은 메시지가 나온다.
// Debugger listening on ws://127.0.0.1...

브라우저 개발자도구 접속 후 노드 로고(녹색 육각형) 클릭.

Source tap에서 자세하게 확인 가능

vs code 디버깅 추가 공부

Common Js

  • 모든 모듈은 자신만의 독립적인 실행 영역이 있어야한다.

  • 모듈 정의는 전역 객체인 exports 객체를 사용한다.

  • 모듈 사용은 require 함수를 이용한다.

module.exports vs exports

exports는 module.exports를 참조하는 변수 + 축약형 일 뿐이다.

module.exports에 무언가가 이미 붙어있다면, exports는 무시된다.

  • module.exports 사용
// hello.js
module.exports = { a: 1}
// hello-runner.js
const hello = require('./hello');
console.log(hello); 
// { a: 1 }
  • exports 사용
// hello.js
exports = { a: 1 }
// 이미 module.exports에 { a: 1 } 할당되어있는 상태이므로
// 위 코드는 exports란 변수에 { a: 1 }를 할당한 것 뿐이다.
console.log(exports);
// { a: 1 }
// hello-runner.js
const hello = require('./hello');
// 당연히 불러올수 없다.
console.log(hello); 
// {}

둘 중에 하나만 써라!




© 2020.11. by creamer

Powered by CREAMer