3. 노드 기능(1)

Donghun Seol·2022년 9월 13일
0

node.js 교과서

목록 보기
4/12

3.노드 기능(1)

REPL 사용하기

Read Evaluate Print Loop

터미널에서 node

JS 파일 실행하기

다 알제?

모듈 만들기

아래와 같은 두 가지 방식이 있다.

const odd = "oddNum";
const even = "evenNum";

module.exports = { odd, even };

//index.js
const {odd, even } = require('./var');
exports.odd = "oddNum";
exports.even = "evenNum";

ES6문법을 활용한 모듈
바로는 안되고
파일의 확장자를 .mjs로 지정하거나 package.json에 type:"module"속성을 넣어야 한다.

const odd = "oddNum";
const even = "evenNum";
export defaults = { odd, even }

// import
import { odd, even } from './var'

노드 내장 객체 알아보기

global

전역객체, 모든 파일에서 접근가능하다.
global.message를 export해서 파일간 데이터 전달 가능하지만 유지보수가 힘들어지므로 사용하지말것

console

console.time('label')
console.timeEnd('label')
console.table([obj1, obj2]); // DBlike printing
console.dir(obj);
console.trace('label')

타이머

아래 타이머 3총사는 생성시 자신의 id를 반환한다

  • setTimeout
  • setInterval
  • setImmediate

타이머를 취소하려면 id가 필요하다

  • clearTimeout(id)
  • clearInterval(id)
  • clearImmediate(id)

퀴즈
아래 코드의 실행 결과는? 정답

const timeout = setTimeout(() => {
  console.log('A runs after 1.5sec');
}, 1500);

const interval = setInterval(() => {
  console.log('B runs every 1 sec');
}, 1000);

const timeout2 = setTimeout(() => {
  console.log('C Not Running');
}, 3000);

setTimeout(() => {
  clearTimeout(timeout2);
  clearInterval(interval);
}, 2500)

const immediate = setImmediate(() => {
  console.log('D runs Right NOW!');
});

const immediate2 = setImmediate(() => {
  console.log('E not running');
}
      
clearImmediate(immediate2)

setImmediate(callback) vs setTimeout(callback, 0)

  • 유사하게 동작하지만 헷갈리지 않게 setImmediate를 항상 활용하자.

__filename, __dirname

현재 파일명과 폴더명을 나타낸다. path모듈과 함께 사용된다.

module, exports, require

module.exports 와 exports는 같은 객체를 참조한다.
한 파일에 둘을 혼용하지 않는 것이 좋다.

노드의 글로벌 컨텍스트에서 this는 무엇일까?

this === module.exports //true
this === exports //true

노드는 순환참조 발생시 순환참조되는 대상을 빈 객체로 만들어버린다.
발생하지 않도록 유의해서 코딩한다.

process

현재 실행중인 노드 프로세스에 대한 정보를 담고 있다.

process.env
process.version
process.pid
process.uptime()
process.cwd()

process.exit(CODE) // 0은 정상, 이외는 비정상 종료

process.nextTick(callback)

  • 이벤트 루프가 다른 콜백 함수보다 nextTick의 콜백을 먼저 처리하게 한다.
  • 다시말하면 해당 콜백은 마이크로 태스크 큐에 등록된다.
  • Promise의 우선순위도 nextTick과 동일하다.
setImmediate(() => {
  console.log('immediate');
});
process.nextTick(() => {
  console.log('nextTick');
});
setTimeout(() => {
  console.log('timeout');
}, 0);
Promise.resolve().then(() => console.log('promise'));
// nextTick -> promise -> timeout -> immediate

노드 내장 모듈 사용하기

os

주요 메서드

os.type()
os.platform()
os.uptime()
os.cpus().length
os.tmpdir

path

path.basename(pathString, extname)// filename without ext
path.parse(pathString)
path.format(obj)
path.join('/','usr','local','node') // /usr/local/node

url

노드에서 URL은 두가지 종류가 있다. 일반적으로 WHATWG 방식이 편리하지만 예전 방식을 활용해야만 하는 경우도 있다.

  • 웹표준 WHATWG
    • searchParams 객체가 생성되어 유용하게 활용가능
const url = require('url'):

urlString = "https://www.google.com/search?q=complex+query+string&rlz=1C5CHFA_enKR978KR978&oq=complex+query+string&aqs=chrome..69i57j0i19j0i8i19i30l4.3831j1j4&sourceid=chrome&ie=UTF-8"

let WHATWGUrl = new URL(urlString);
url.format(WHATWGUrl);

{searchParams: URLSearchParams {
    'q' => 'complex query string',
    'rlz' => '1C5CHFA_enKR978KR978',
    'oq' => 'complex query string',
    'aqs' => 'chrome..69i57j0i19j0i8i19i30l4.3831j1j4',
    'sourceid' => 'chrome',
    'ie' => 'UTF-8' }
}
let searchParams = WHATWGUrl.searchParams;
searchParams.append()
searchParams.set()
searchParams.delete()
searchParams.toString()
  • 예전 노드 방식
    • querystring 모듈을 활용하면 쿼리를 객체로 다뤄준다.
const url = require('url'):
const querystring = require('querystring');
urlString = "https://www.google.com/search?q=complex+query+string&rlz=1C5CHFA_enKR978KR978&oq=complex+query+string&aqs=chrome..69i57j0i19j0i8i19i30l4.3831j1j4&sourceid=chrome&ie=UTF-8"

let parsedUrl = url.parse(urlString);
url.format(parsedUrl);
query = querystring.parse(paredUrl.query);

crypto

암호화는 멀티스레드로 작동함
간단한 암호화를 위해서는 crypto-js 패키지 활용을 추천함.

util

util.deprecate
util.promisify : 콜백패턴을 프로미즈로 바꿈

const util = require('util');
const crypto = require('crypto');
const dontUseMe = util.deprecate((x, y) => {
  console.log(x + y);
}, 'do not use this function, it is deprecated');

const randomBytesPromise = util.promisify(crypto.randomBytes);

worker_threads

워커 스레드 모듈로 노드에서도 멀티 스레드 방식으로 작업 가능하다.
메인스레드에서 워커스레드를 생성하고, 메시지로 통신한 다음 작업이 끝나면 모인 데이터를 취합한다.

child_process

외부 명령어 실행시키고 싶을 때 사용한다.
결과는 이벤트리스너에 버퍼 형태로 전달된다.

const exec = require('child_process').exec;
const process = exec('ls')

process.stdout.on('data', data => {
  console.log(data.toString());
}
                  
const spawn = require('child_process').spawn;
const process = spawn('python', ['test.py']);

기타 모듈들

assert
string_decoder
tls
net

정답

D - B - A - B

profile
I'm going from failure to failure without losing enthusiasm

0개의 댓글