[Node] 노드 기능 알아보기

Happy_Nerd·2021년 3월 30일
0

Node

목록 보기
2/3
post-thumbnail

REPL

REPL은 Read Eval Print Loop의 약자이다.
사용자가 입력한 코드를 읽고(Read), 해석하고(Eval), 결과물을 반환하고(Print), 종료할 때까지 반복(Loop)한다.
웹 브라우저의 콘솔창과 비슷하다.

eval = evaluation의 줄임말

Node.js의 REPL은 간단한 코드를 테스트해보는 용도로는 좋지만 긴 코드를 실행하기에는 불편하기 때문에,
긴 코드는 자바스크립트 파일을 만든 후 파일 자체를 실행하는 것이 좋다.

실행 방법

$ node
>

vscode에서 터미널을 열고 node라고 입력만 하면 REPL 환경이 된다.

> 10 + 20
30
> const a = 'yujuck';
undefined
> console.log(a);
yujuck
undefined

위처럼 간단한 코드를 직접 입력해 실행시킬 수 있다.

undefined가 출력되는 이유는!
자바스크립트에서는 어떤 코드가 결과값을 별도로 리턴하지 않으면 undefined를 리턴한 것으로 간주하기 때문이다.
따라서 undefined가 아닌 값을 보고 싶으면 결과값을 리턴해주면 된다!

Underscore(_) 변수 사용

_ 변수를 사용하여 가장 최근의 결과값을 가져올 수 있다.

> const a = 1
undefined
> const b = 20
undefined
> a+b
21
> const result = _
undefined
> console.log(result)
21
undefined

REPL 커맨드

  • ctrl+c 두번 / ctrl+d / .exit - Node REPL 종료
  • 위/아래 방향키 - 명령어 히스토리 탐색 가능
  • Tab키 - 현재 입력한 커맨드로 시작하는 명령어 및 변수 목록을 볼 수 있음
  • .help - 모든 커맨드 목록 확인
  • .break / .clear - 멀티 라인 표현식 입력 도중 입력을 종료
  • .save [filename] - 현재 Node REPL 세션을 파일로 저장
  • .load [filename] - Node REPL 세션을 파일에서 불러옴

js 파일 실행시키기

위에서 말한 것처럼 긴 자바스크립트 코드를 실행하기에 REPL 환경은 불편하기 때문에
보통 .js 파일을 만들어두고 실행시킨다.

// test.js
function hello() {
	console.log("Hello");
}

hello();

test라는 js 파일을 만들어두고,

$ node test(자바스크립트 파일 경로)

터미널에서 입력을 하면 test.js 파일이 실행된다. (REPL 환경 X)
확장자(.js)는 생략할 수 있다.

실행하게 되면

$ node test
hello

hello가 출력되고 종료된다.


모듈 (Module)

모듈: 특정한 기능을 하는 함수나 변수들의 집합

노드는 코드를 모듈로 만들 수 있다.
모듈은 자체로도 하나의 프로그램이면서 다른 프로그램의 일부로 사용할 수 있는데,
자바스크립트에서 코드의 재사용성을 위해 함수로 만드는 것과 비슷하다.

자바스크립트 파일 하나모듈이라고 생각하면 되고,
파일별로 모듈화할 수 있어서 관리하기가 편하다.

모듈을 내보내고 가져올 때에는 CommonJs의 명세를 따라 module.exportrequire를 사용한다.

require()

require함수는 모듈을 로드해주는 함수이다.
모듈을 로드해서 객체 1개를 리턴하기 때문에 변수에 대입해서 사용할 수 있다.

require 함수가 리턴한 객체는 const로 선언해서 받는 것이 좋다.
후에 같은 변수 명에 재선언이 되면 바로 에러가 발생하기 때문에
잘못된 코드를 미리 방지할 수 있다.

사용 예시

// variable.js
const odd = "홀수";
const even = "짝수";

module.exports = { odd, even };


// func.js
const { odd, even } = require('./variable.js');

function checkOddOrEven(num) {
  if (num % 2) return odd;
  else return even;
}

module.exports = checkOddOrEven


// index.js
const { odd, even } = require('./variable');  // .js는 생략 가능하다.
const checkNumber = require('./func');


console.log(checkNumber(10));

module.exports에 객체뿐만 아니라 함수나 변수를 대입할 수 있다.

index.js에서 func.js의 checkOddOrEven함수를 checkNumber로 가져온 것 처럼 모듈을 가져올 때는 변수 이름을 다르게 설정할 수도 있다.

내장 객체

node에서는 기본적인 내장 객체를 제공한다.

global

node.js의 전역 객체

브라우저의 window 객체처럼 global 객체node의 전역 객체이다.
전역 객체이기 때문에 어디서든 접근할 수 있고, 사용 시 생략이 가능하다.
REPL환경에서 쓴 console객체도 사실은 global.console이다.

global 객체에는 여러가지 속성이 이미 있지만
직접 추가해서 전역으로 사용하게 할 수도 있다.

// globalA
module.exports = () => global.name;

// globalB
const A = require('./globalA');

global.name = 'yujuck';
console.log(A());

위와 같은 파일이 있고 node globalB를 실행하면

$ node globalB
yujuck

다음과 같이 출력될 것이다.
global이 전역 객체인 것을 이용해 파일 간 데이터를 공유하고 싶을 때 사용할 수 있다.

console

노드에서 사용하는 console의 앞에는 global이 생략되어있는 것이고
브라우저에서 사용하는 console은 window가 생략되어있는 것이지만,
거의 비슷하다.

여러 메소드 중 자주 사용할만한 것들을 보자면..

  • console.dir(obj[, options]) : 객체를 콘솔에 표시할 때 사용

  • console.log([data][, ...args]) : 로그를 표시할 때 사용

  • console.time([label]) : console.timeEnd와 대응되어 같은 레이블을 가진 time과 timeEnd 사이의 시간을 측정

ex)
console.time('timeA');
console.time('timeB');
~~~~
cosole.timeEnd('timeB');
console.timeEnd('timeA');

// time('timeB') ~ timeEnd('timeB') 출력된 후
// time('timeA') ~ timeEnd('timeA') 출력됨
  • console.error([data][, ...args]) : 에러 내용 표시할 때 사용

이외의 console 객체의 여러 메소드를 보려면 공식 사이트를 참고하면 좋다.

타이머

  • setImmediate(callback[, ...args]) : 콜백 함수를 즉시 실행.
  • setInterval(callback[, delay[, ...args]]) : 설정한 delay(밀리초)마다 콜백 함수를 반복해서 실행.
  • setTimeout(callback[, delay[, ...args]]) : 설정한 delay(밀리초) 이후에 콜백 함수를 실행

위의 타이머 함수들은 모두 아이디를 반환해서 이 아이디를 사용해 타이머를 취소할 수도 있다.
clearImmediate(아이디), clearInterval(아이디), clearTimeout(아이디) 를 사용하면 된다.

__filename, __dirname

  • __filename : 현재 파일명
  • __dirname : 파일 경로

변수처럼 사용하면 되는데,

console.log(__filename);
console.log(__dirname);

이런식으로 사용하면 현재 파일명과 파일 경로를 얻을 수 있다.

module, exports

위에서 모듈을 설명할 때 module.exports를 사용해서 모듈을 내보냈는데, exports로도 모듈을 내보낼 수 있다.

두 개의 동작이 같은 이유는 module.exports와 exports가 참조하는 객체가 같기 때문이다.

주의해야할 점은
exports로 모듈을 만들 때는 exports.속성 = 값 형태로 작성해야하고
module.exports로 만들 때는 module.exports = 객체 형태로 작성해야한다.
exports에 다른 값을 대입하면 객체의 참조 관계가 끊기기 때문에 모듈로 기능하지 않는다.

노드에서의 this ?
최상위 스코프에 존재하는 this는 module.exports(또는 exports 객체)를 가리킨다.
또한, 함수 선언문 내부의 this는 global 객체를 가리킨다.

process

process 객체는 현재 실행되고 있는 노드 프로세스에 대한 정보를 담고 있다.

process.env

process.env를 REPL에 입력하면 환경변수들이 출력되는 것을 볼 수 있다.


(밑에 쭉 더 나온다..)

process.env는 공개되면 안되는 중요한 키를 저장할 때 쓰이기도 한다.

process.nextTick(callback[, ...args])

이벤트 루프가 다른 콜백 함수들보다 nextTick의 콜백함수를 우선으로 처리하도록 만든다.

위에 타이머 함수에서 봤던 setImmediate나 setTimeout보다 먼저 실행된다.
참고로 Promise도 nextTick처럼 다른 콜백보다 우선시된다.
그래서 이 둘은 마이크로태크스(microtask)라고 따로 구분지어 부른다.

process.exit([code])

실행 중인 노드 프로세스를 종료한다.

인자로 코드 번호를 줄 수 있다.
인자를 주지 않거나 0을 주면 정상 종료,
1을 주면 비정상 종료를 뜻한다.

에러가 발생해서 비정상적인 종료를 하는 경우 1을 인자로 넣어주면 된다.

...

공부는 매일 하긴 하는데..
공부한 내용 다 찾아서 정리해서 쓰려니 엄청 오래 걸리고..
그래서 일단은.. 책 내용으로 공부한 부분 글 써버리고
좀 더 깊게 본 내용은 다른 포스트로 작성하는걸로..ㅠㅡㅠ

참고
- node.js 교과서
- https://velopert.com/235
- 공식 사이트 (https://nodejs.org/api/)

0개의 댓글