<2주차> 노드 기본 기능

pasongtak·2024년 7월 21일

Node.js

목록 보기
2/3

REPL

  • 자바스크립트는 스크립트 언어이므로 즉석에서 코드 실행 가능
  • R(Read), E(Evaluate), P(Print), L(Loop)
  • 터미널에 node 입력
  • 한 줄 짜리 코드 테스트 할 때 적합

JS 파일 만들어 실행

  • node [파일명]

CommonJS 모듈

모듈 내보내기

const odd = '홀수입니다';
const even = '짝수입니다';

// 방법 1
module.exports = {
  odd,
  even
}

//방법 2
exports.odd = odd;
exports.even = even;
  • module.exports = { 변수1, 변수2 };
    • 한 가지만 내보내기 하고 싶을 때 사용 추천
  • exports.변수1 = 변수1;
    • 여러 개 내보내기 하고 싶을 때 사용 추천
  • module.exports === exports === {}

모듈 내용 가져오기

다른 파일에서 require('파일 경로');

this

전역스코프의 this

  • this === module.exports === {}
  • function 안에서 this === global
  • 화살표 함수의 this는 부모의 this를 물려받는다.

require

  • node [파일명]
  • 파일명이 main
  • require.main: 노드 실행 시 첫 모듈을 가리킴
  • require.cache: 한 번 require한 모듈에 대한 캐쉬 정보가 들어있음
    • require가 한 번 실행되면 cache에 저장되고, 다음 실행에는 cache에서 불러온다.

순환 참조

  • 노드가 순환참조가 일어나면 빈 객체({})로 바꿔줌

ECMAScript 모듈

  • var.mjs
export const odd = '홀수입니다';
export const odd = '짝수입니다';
  • func.mjs
import { odd, even } from './var.mjs';

...

export default checkOddOrEven;
  • index.mjs
import checkNumber from './func.mjs';

  • dynamic.mjs
const a = true;
if (a) {
  const m1 = await import('./func.mjs');
  console.log(m1);
  const m2 = await import('./var.mjs');
  console.log(m2);
  • 콘솔
[Module: null prototype] { default: [Function: checkOddOrEven }
[Module: null prototype] { even: 'MJS 짝수입니다', odd: 'MJS 홀수입니다' }
  • 알 수 있는 내용: 다이내믹 임포트, top level await, export dafault !== module.exports

노드 내장 객체

global

  • 브라우저에서의 window 객체와 같은 역할
  • 노드 전역 객체
  • 생략 가능
  • global 속성에 값을 대입하면 다른 파일에서도 사용 가능(자제)

console

  • console.time, console.timeEnd: 시간 로깅
  • console.error: 에러 로깅
  • console.log: 평범한 로그
  • console.dir: 객체 로깅
  • console.trace: 호출스택 로깅(함수 안에서)

타이머 메서드

  • setTimeout(콜백 함수, 밀리초): 밀리초 이후에 콜백 함수 실행
  • setInterval(콜백 함수, 밀리초): 밀리초마다 콜백 함수를 반복 실행
  • setImmediate(콜백 함수): 콜백 함수 즉시 실행
  • clearTimeout(아이디): setTimeout 취소
  • clearInterval(아이디): setInterval 취소
  • clearImmediate(아이디): setImmediate 취소
  • timer.js
const timeout = setTimeout(() => {
  console.log('1.5초 후 실행');
}, 1500);

const interval = setInterval(() => {
  console.log('1초마다 실행');
}, 1000);

const timeout2 = setTimeout(() => {
  console.log('실행되지 않습니다');
}, 3000);

setTimeout(() => {
  clearTimeout(timeout2);
  clearInterval(interval);
}, 2500);
const immediate = setImmediate(() => {
  console.log('즉시 실행');
});

const immediate2 = setImmediate(() => {
  console.log('실행되지 않습니다');
});

clearImmediate(immediate2);

즉시 실행 -> 1초마다 실행 -> 1.5초 후 실행 -> 1초마다 실행

process

  • process.cwd(): 노드 명령어의 실행 위치
  • process.env: 시스템 환경 변수들이 들어있는 객체
  • process.nextTick(콜백): 이벤트 루프가 다른 콜백 함수들보다 nextTick의 콜백 함수를 우선적으로 처리
  • process.exit(): 현재의 프로세스를 멈춤

노드 내장 모듈

os(operating system)

  • 운영체제의 정보를 담고 있음
  • os.arch(): process.arch과 동일
  • os.platform(): process.platform과 동일
  • os.type(): 운영체제의 종류
  • os.uptime(): 운영체제 부팅 이후 흐른 시간을 보여줌(process.uptime() -> 노드의 실행 시간)
  • os.hostname(): 컴퓨터의 이름
  • os.release(): 운영체제의 버전
  • os.homedir(): 홈 디렉터리 경로
  • os.tmpdir(): 임시 파일 저장 경로
  • os.cpus(): cpu 정보(컴퓨터의 코어 정보)
  • os.freemem(): 사용 가능한 메모리(RAM)
  • os.totalmem(): 전체 메모리 용량

path

  • 폴더와 파일 경로를 쉽게 조작하도록 도와주는 모듈

  • path.sep: /, 경로의 구분자

  • path.delimiter: ,(window-> ; ,posix-> , ), 환경 변수의 구분자

  • path.dirname(경로): 파일이 위치한 폴더 경로

  • path.extname(경로): 파일의 확장자

  • path.basename(경로, 확장자): 파일의 이름

  • path.parse(경로): 파일 경로 분해

  • path.format(객체): 파일 경로 합치기

  • path.normalize(경로): \,/ 수정

  • path.isAbsolute(경로): 경로가 절대 경로인지, 상대 경로인지

  • path.relative(기준경로, 비교경로): 어떻게 특정한 디렉토리로 이동하는지 알려줌

  • path.join(경로1, 경로2)

  • path.resolve(경로1, 경로2)

    join과 resolve의 차이: resolve는 /를 절대경로로 처리, join은 상대경로로 처리

URL

  • WHATWG(웹 표준을 정하는 단체의 이름) 방식
  • 노드 내장 객체
  • new URL(주소) -> 주소가 부분별로 정리됨
  • URL.format(URL이름) -> 객체로 바뀜

searchParams

  • searchParams.getAll(키): 키에 해당하는 모든 값을 가져옴
  • searchParams.get(키): 키에 해당하는 첫 번째 값만 가져옴
  • searchParams.has(키): 해당 키가 있는지 없는지 검사
  • searchParams.keys(키): searchParams의 모든 키를 반복기 객체로 가져옴
  • searchParams.values(키): searchParams의 모든 값을 반복기 객체로 가져옴
  • searchParams.append(키, 값): 해당 키 추가, 같은 값 유지하고 추가
  • searchParams.set(키, 값): 같은 키의 값들을 모두 지우고 새로 추가
  • searchParams.delete(키): 해당 키 제거
  • searchParams.toString(): 조작한 searchParams 객체를 다시 문자열로 만듬

DNS

  • dns.lookup(도메인): ip주소
  • dns.resolve(도메인, 레코드 이름): record를 가져옴
    • A: ipv4 주소
    • AAAA:ipv6주소
    • MX: 메일 서버 세팅
    • CNAME: 별칭
    • NS: 네임서버
    • SOA: 도메인 정보

단방향 암호화(crypto)

  • 멀티 쓰레드
  • 암호화: 평문을 암호로 만듦
  • 복호화: 암호를 평문으로 해독

해시 기법(단방향 암호화)

  • 문자열을 고정된 길이의 다른 문자열로 바꾸는 방식
  • crypto.createHash(알고리즘): 사용할 해시 알고리즘을 넣어줌(sha512)
  • crypto.update(문자열): 변환할 문자열
  • crypto.digest(인코딩): 인코딩할 알고리즘(base64, hex, latin1)
  • Node는 pbkdf2, scrypt 알고리즘 지원

pbkdf2

  • crypto.pbkdf2(비밀번호, salt, 반복 횟수, 출력 바이트, 알고리즘)

양방향 암호화

  • crypto.createCipheriv(알고리즘, 키, iv): 암호화 알고리즘과 키, 초기화벡터
  • cipher.update(문자열, 인코딩, 출력 인코딩): 암호화할 대상과 대상의 인코딩, 출력 결과물의 인코딩
  • cipher.final(출력 인코딩): 출력 결과물의 인코딩
  • crypto.createDacipheriv(알고리즘, 키, iv): 복호화할 때 사용, 암호화할 때 사용했던 알고리즘과 키, iv를 그대로 넣어주어야 함
  • decipher.update(문자열, 인코딩, 출력 인코딩): 암호화된 문장, 그 문장의 인코딩, 복호화할 인코딩
  • decipher.final(출력 인코딩): 복호화 결과물의 인코딩

대칭형 암호화(암호문 복호화 가능)

  • key 사용
  • 암호화 할 때와 복호화 할 때 같은 Key를 사용해야 함

util

  • util.deprecated(함수, 경고 메시지 내용): 함수가 조만간 사라지거나 변경될 때
  • util.promisify(함수): async, await 패턴 사용 가능, 콜백이 (error, data) => {} 형식이어야 함

worker_threads

  • 노드에서 멀티 스레드 방식(암호화, 압축)으로 작업할 수 있게 해주는 모듈
  • 예제1
const { Worker, isMainThread, parentPort } = require('worker_threads');

if (isMainThread) { // 메인스레드
  const worker = new Worker(__filename);
  worker.on('message', (value) => console.log('워커로부터', value));
  worker.on('exit', () => console.log('워커 끝~'));
  worker.postMessage('ping');
} else { // 워커스레드
  	parentPort.on('message', (value) => {
      console.log('부모로부터', value);
      parentPort.postMessage('pong');
      parentPort.close();
	})
}
  • 예제2
const { Worker, isMainThread, parentPort, workerData } = require('worker_threads');

if (isMainThread) { // 메인스레드
  const threads = new Set();
  threads.add(new Worker(__filename, {
    workerData: { start: 1 },
  }));
  threads.add(new Worker(__filename, {
    workerData: { start: 2 },
  }));
  for (let worker of threads) {
  	worker.on('message', (value) => console.log('워커로부터', value));
 	worker.on('exit', () => {
      threads.delete(worker);
      if (threads.size === 0) {
      	console.log('워커 끝~'));
      }

} else { // 워커스레드
    const data = workerData;
    parentPort.postMessage(data.start + 100);
}

child process

const spawn = require('child_process').spawn;

var process = spawn('python', ['test.py']);

process.stdout.on('data', function (data) {
  console.log(data.toString());
});
process.stderr.on('data', function (data) {
  console.error(data.toString('utf8'));
});

파일 시스템 사용하기

fs

  • 파일 시스템에 접근하는 모듈
  • 예제1(파일 읽어오기)
const fs = require('fs');

fs.readFile('./readme.txt', (err, data) => {
  if (err) {
    throw err;
  }
  console.log(data);
  console.log(data.toString());
});
  • 예제2(파일 읽어오기)
const fs = require('fs').promises;

fs.readFile('./readme.txt')
  .then((data) => {
  	console.log(data);
  	console.log(data.toString());
  })
  .catch((err) => {
  	throw err;
  });
  • 예제2(파일 생성, 읽기)
const fs = require('fs').promises;

fs.writeFile('./writeme.txt', '글이 입력됩니다.')
  .then(() => {
  	return fs.readFile('./writeme.txt');
  })
  .then((data) => {
    console.log(data.toString());
  })
  .catch((err) => {
  	throw err;
  });
  • 동기 메서드 지원: 사용시 주의!

버퍼와 스트림

  • 버퍼: 일정한 크기로 모아두는 데이터
    • 일정한 크기가 되면 한 번에 처리
    • 버퍼링: 버퍼에 데이터가 찰 때까지 모으는 작업
  • 스트림: 데이터의 흐름
    • 일정한 크기로 나눠서 여러 번에 걸쳐서 처리
    • 버퍼(또는 청크)의 크기를 작게 만들어서 주기적으로 데이터를 전달
    • 스트리밍: 일정한 크기의 데이터를 지속적으로 전달하는 작업
const buffer = Buffer.from('저를 버퍼로 바꿔보세요.');
console.log(buffer);
console.log(buffer.length);
console.log(buffer.toString());

const array = [Buffer.from('띄엄 '), Buffer.from('띄엄 '),Buffer.from('띄어쓰기')];
console.log(Buffer.concat(array).toString());

console.log(Buffer.alloc(5));

파이프와 스트림 메모리 효율 확인

  • fs.access(경로, 옵션, 콜백): 폴더나 파일에 접근할 수 있는지를 체크
  • fs.mkdir(경로, 콜백): 폴더를 만드는 메서드
  • fs.open(경로, 옵션, 콜백): 파일의 아이디를 가져오는 메서드
  • fs.rename(기존 경로, 새 경로, 콜백): 파일의 이름을 바꾸는 메서드
  • fs.readdir(경로, 콜백): 폴더 안의 내용물을 확인할 수 있음
  • fs.unlink(경로, 콜백): 파일을 지울 수 있음
  • fs.rmdir(경로, 콜백): 폴더를 지울 수 있음
  • fs.copyFile(경로1, 경로2): 파일을 복사하는 방법
  • fs.watch(경로, 콜백): 파일을 감시하는 방법
  • fs.existsSync: 파일이나 폴더가 존재하는지 확인
  • fs.stat: 파일이 폴더인지 파일인지 알아내는 방법

스레드풀과 커스텀 이벤트

  • UV_THREADOOL_SIZE = 원하는 사이즈 크기

에러 처리하기

  • 에러가 발생할 만한 곳을 try catch로 감싼다.
  • 노드 비동기 메서드의 에러는 따로 처리하지 않아도 됨
  • 프로미스의 에러는 따로 처리하지 않아도 됨 -> 노드 버전이 올라가면 catch 붙이기

프로세스 종료하기

  • lsof -i tcp:포트
  • kill -9 프로세스아이디

0개의 댓글