그동안 javascript를 동작시키기 위해선, html의 script 태그에 src="app.js" property를 추가하여 브라우저를 통해 코드를 돌리고, 콘솔창에 뜨는 결과물을 확인했어야 했다. Node.js는 브라우저 없이 javascript 파일을 돌리는 툴이다. 최근 몇 년 들어서 매우 가파른 상승세를 보이고 있다고 한다. (그동안 노드를 몇 번 다룬 적이 있긴 했는데 '브라우저 없이 js를 돌리는 툴'이라는 정의는 처음 배웠다. 신기..)
현재 듣고 있는 강의에서 설명하는 내용 위주로 node.js의 겉핥기 내용을 정리해보도록 하겠다.
🌱 PROCESS
간단히 말하자면 브라우저의 window, python이나 기타 프로그래밍 언어의 sys같은 global object. process.argv를 통해 콘솔에서 node 파일을 돌릴 시에 들어오는 arguments들을 관리할 수 있다. 다른 프로그래밍 언어들의 arg와 마찬가지로 argv[0]는 node 파일 자체의 위치, argv[1]는 현재 돌리는 js 파일의 위치이고 argv[2]부터가 사용자가 전달하는 argv값이다. 그래서 애초에 process.argv.slice(2)를 하고 시작한다고 하더라...
노드 파일을 돌리는 법은 간단하다. 그냥 우리가 작성한 javascript 파일이 있는 디렉토리로 가서, $ node app.js 라고 커맨드를 입력하기만 하면 된다.(작업중인 js파일 이름이 app.js라고 하자..) node 자체에서 제공하는 파일 api들이 있는데, 간단히 require('fs')를 통해 사용자에게 입력받은 파일 제목으로 project 폴더와 기본 파일들을 몇 개 만들어 보았다.
promise 위에서 동작하는 라이브러리들이 많다! async에서는 기본적으로 마지막 파라미터가 콜백함수여야한다. arg로 err을 받고 그걸 핸들링하는 방식. sync와 async의 차이, 콜백함수가 어떤 것인지, 그걸 어떻게 핸들링하면 좋을지, try-catch의 정확한 사용 방법 등을 앞에 배운 뒤에 쭉 따라가니 훨씬 나았다. 작년 여름방학때 이 강의를 들었어야했다(,,,)
🌱 MODULE.EXPORT
자바스크립트 안에서 쓰는 많은 method나 변수 등의 파일간 이용을 위해 만들어진 모듈.
const add = (x, y) => x + y;
const PI = 3.14159;
const square = x => x * x;
exports.square = square;
exports.PI = PI;
exports.add = add;
우리의 math.js에서 add, squre라는 function과 PI라는 constant variable을 설정했다고 가정하자. 그리고 각각의 것들을 exports를 통해 어딘가로 보내는 코드가 있다.
const { PI, square } = require('./math');
console.log(PI)
// 3.14159
console.log(square(9))
// 81
다른 파일, 예컨대 app.js라는 파일을 새로 만든 뒤 math.js에서 exports한 것을 require을 통해 받는다.(한번에 destruct 했음을 볼 수 있음). 그 뒤에 app.js에선 선언하지 않은 변수나 함수를 사용하면 주석과 같이 출력되게 된다. 원하는 결과가 나옴을 확인할 수 있다.
추가로, 하나하나의 파일이 아닌 디렉토리 자체를 require할 때엔, 그 디렉토리 안에 있는 index.js에서 export한 오브젝트만을 가리키게된다.
// directory를 import하면 암묵적으로 index.js file에서 export된 것을 가져온다..
const cats = require("./shelter");
console.log("REQUIRED AN ENTIRE DIRECTORY!", cats);
🌱 npm : Node Package Manager
npm이란 무엇이냐?
1. Library of packages. ALL FREE! 다른 개발자들이 먼저 만들어놓은 라이브러리들의 모임이다.
2. command line tool to install those packages. npm을 통해 그 라이브러리들을 다운받고 개발 환경을 설정할 수 있다.
react, express 등도 npm의 package중 하나이다.
아주 간단한 npm package를 다운받고 이용하는 과정을 통해 익숙해지도록 하겠다.
give-me-a-joke
A npm-module for random and customized jokes.. Latest version: 0.5.1, last published: 6 months ago. Start using give-me-a-joke in your project by running `npm i give-me-a-joke`. There are 5 other projects in the npm registry using give-me-a-joke.
www.npmjs.com
문서를 따라하면 간단하게 random joke를 주는 npm module이 있다. 우리가 작업하는 디렉토리에 가서 문서에 적힌 대로
$ npm install --save give-me-a-joke
을 입력하면, package-lock.json, node_modules 등이 다운로드된다. 그리고 또한 가이드 문서에 적힌 대로 require을 하고 제공하는 function을 이용한 뒤 node index.js를 실행하면 랜덤한 조크가 콘솔에 프린트되는 것을 확인할 수 있다.
const giveMeAJoke = require('give-me-a-joke');
// To get a random dad joke
giveMeAJoke.getRandomDadJoke (function(joke) {
console.log(joke);
});
물론 여러개의 모듈을 한꺼번에 다운받고 여러번 require해서 짬뽕 모듈을 쓰는 것 역시 가능하다.
여기서 알아두어야 하는 것이, global과 local package의 차이점이다. '-g' flag를 추가하면 작업중인 디렉토리가 아니라 전체 디렉토리에서 해당 npm library를 이용할 수 있다..
🌱 DEPENDENCIES (PACKAGE.JSON)
우리가 직접 npm module을 만들고자 할 때, 우리의 프로젝트 디렉토리를 하나 만들고
$ npm init
를 커맨드 창에 작성한 뒤 기본 설정을 마치면 package.json파일이 해당 디렉토리에 생성됨을 확인할 수 있다. 이 때, 우리의 모듈을 만들면서 또다른 npm module을 이용하기 위해 npm install ~~을 한다면, package.json파일의 dependency 값들이 추가됨을 알 수 있다.
1. 우리가 어떤 모듈을 사용하면서 이 모드를 개발하고 있는지 확인할 수 있도록
2. 나중에 그것을 사용할 때 dependency가 존재하는 모듈들을 자동으로 다운받을 수 있도록
package.json의 dependency 항목은 표시하고 있는 것이다.
node_modules가 없는 일반 파일을 다운받은 뒤 node index.js를 돌리면 node_modules파일이 없어서 에러가 뜨게 된다. 이 때
$ npm install
을 통해 package.json에 dependency가 있는 모듈 항목들을 다운받아주게 된다!
GitHub - dkhd/node-group-chat: Build A Group-Chat App in 30 Lines Using Node.js
Build A Group-Chat App in 30 Lines Using Node.js. Contribute to dkhd/node-group-chat development by creating an account on GitHub.
github.com
한 번 npm install 전과 후의 localhost:8000을 비교해보도록 하자..
package.json이 있는 root directory에서 "npm install"을 하는 것이 무엇을 의미(dependency)하는지 숙지하자!