자료 구조 <Data Structure>

[JS] node.js 의 module 에 대하여

실버사서 Silver Librarian 2021. 7. 20. 17:21

면책(Disclaimer).

이 게시글은 개인 참고 노트 목적으로서 작성 되었으며, 상업적 목적으로 작성되지 않았습니다

 

근원.

 

Readline | Node.js v16.5.0 Documentation

Readline# Source Code: lib/readline.js The readline module provides an interface for reading data from a Readable stream (such as process.stdin) one line at a time. It can be accessed using: const readline = require('readline'); The following simple exampl

nodejs.org

 

File System 모듈 - 한 눈에 끝내기?

 

module - readline

 

[Node.js]표준 입력 받기(readline)

[Node.js]readline

velog.io

요약:

- Readable stream (예: process.stdin) 에서 데이터를 읽기 위한 인터페이스 를 제공. 이를 사용하여 access 가능.

 

const readline = require("readline");

 

- readline.Interface는 readline.createInterface() method 를 통해 생성 가능.

- 맨 위 상단의 공식 문서에 나오는 readline 예시 실행 시, 다음과 같은 출력이 나옴.

 

const readline = require('readline');

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

rl.question('What do you think of Node.js? ', (answer) => {
  console.log(`Thank you for your valuable feedback: ${answer}`);
  rl.close();
});
> What do you think of Node.js?
>> [user] : blabla
> Thank you for your valuable feedback: blabla

이게 끝이 아니었다. 

 

close()

const readline = require('readline');

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

rl.on('line', (input) => {
  console.log(`Recived : ${input}`);
});

- 위 코드를 실행 하면, 입력(input)을 계속해서 받게 됨.

- 입력을 원하는 만큼 받으려면, 특정 조건에 rl.close() 를 추가해야 함.

 

// readline 에 close method 라...이건 뭐 읽는 걸 중단 하게 하는 terminate 명령어 쯤 되는걸까? 알아봤다.

 

const readline = require('readline');

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let count = 0;

rl.on('line', (input) => {
  console.log(`Recived : ${input}`);
  count += 1;
  if (count === 5) {
    rl.close();
  }
});

위 코드 실행시, 입력을 5번 받고, rl.close() method 를 통해, 입력 받는 걸 종료하게 된다.

 

// 역시, 이건 무한정 받지 말고 어느 시점에서 '그만 받아!' 라고 종료 명령을 내리는 method 였다.

 

그리고...

 

readline-sync

readline의 경우, 입력을 비동기적으로 처리함.

- 입력을 동기적으로 처리하기 위한 package임.

- readline-sync -npm

 

// 이건 그냥 node.js 기반에서 readline 을 동적으로 처리하려면 이를 입력해서 설치후 실행하라는 의미이다.

 

추가 참조 글: 1

 

module - fs

이미 요약을 넘었지만...그래도 참고 노트 개념으로 적어두었다.

 

fs module 이란

이번 시간에는 fs module에 관해서 살펴보겠다. 오늘 비동기와 promise 스프린트를 하는데, 내가 뭘하고 있는 건지, 이게 무엇을 위한 것인지 감이 안 잡혀서 이렇게 정리를 해보기로 결심했다. 만약

velog.io

요약:

The fs module of Node.js provides useful functions to interact with the file system.

 

fs module 사용 시, 파일 최상단에 이 표현식을 입력 해야 한다.

 

const fs = require( "fs" ); // => fs 모듈 불러오기

 

참고로, const, let, var, 어느 쪽이든 상관없다.

 

- 모든 method 는 sync 냐 async 냐 구분할 수 있다.

 

간단하게, sync 면 서버가 돌아가는 상태에서 하는 짓. 따라서, 실시간 동기화 업데이트를 따로 구현하지 않는 이상, 서버를 종료 후에 업데이트 내용을 반영해서 서버를 재시작 해야 한다.

 

- 다른 작업을 동시에 하기 어려움이 있는 이유로, async 방식이 많이 쓰인다고 한다.

- async 방식은, 파일을 read 함과 동시에, 다른 작업도 동시 수행 가능.

- 단, async function 은 항상 마지막 parameter 가 수행 완료 시, 호출할 callback function 으로 작성해야 한다 함.

 

// 좋다. 다만 혹시 모르니 백업 용으로 적어둬야겠다.

 

- filename 은 '불러올 파일의 위치(경로)' 이다. 

- 이는 string, BUffer, URL, integer 타입이 올 수 있다 한다 (보통은 문자열을 사용).

- [options] 는 가지고 오는 데이터를 (어떤 유형으로 인코딩 할지를) 정해준다 한다.

- 이는 생략 가능하나, utf8 로 적어준다 한다. 참고로 그 utf8 의 다른 언어 표시 용도가 맞다. 뭔지는 알 것이다.

 

async 방식이라면, 인자를 하나 더 받는다 한다.

callback function 인데, 여기서 err 와 data 를 인자로 받는다고 한다.

 

// 음음...그랬던 거군. 다행이다. 난 저게 정말 컴퓨터만을 위한 괴기 문자인줄 알았습니다.

 

readFile (읽기 파일)

fs.readFile(filename, [options], callback)
// filename의 파일을 [options]의 방식으로 읽은 후, callback으로 전달된 함수를 호출. (async)

fs.readFileSync(filename, [options])
// filename의 파일을 [options]의 방식으로 읽은 후, 문자열을 반환. (sync)

자 잠시, 흰 배경, 아니 검은 배경(...)을 생각해보자.

예를 들어, 텍스트 파일 내부에 this is text 라고 적어둔다면...아래와 같다.

 

//main.js

const fs = require("fs");

 

// 1) async way to read it out

fs.readFile("text.txt", "utf8", function(err, data) {

   console.log("비동기적으로 읽어보는 " + data);

});

// For asynchronous way, callback 함수 must be returned once final parameter element has done its task.

 

// 2) sync way to read it out

let text = fs.readFileSync("text.txt", "utf8");

console.log("동기적으로 읽어보는 " + text);

 

// 좋아, 이제 err, data 를 포함해서 무슨 소린지 좀 보이는걸.

 

- 두 함수 중, 가장 먼저 console 에 출력 되는 것은

sync function 이 먼저이다. 순서상으로는 async function 이 먼저인데.

 

이를 이해 하려면 이벤트 루프의 작동 방식을 이해 하고 있어야 한다고 한다.

그대로 가져오자면:

"간단히 말해서, 동기적인 함수는 콜 스택에 바로 들어갔다가 일이 끝나면 사라지지만, 비동기적 함수는 불려지기 전까지는 이벤트 루프에 의해 다른 곳에 가있다가 필요해지는 순간 혹은 마지막 순간에 콜 스택에 불려져서, 일을 처리하고 사라진다."

 

// 오, 영상이 있다.

 

writeFile (쓰기 파일)

 

// 설마 module 보다가 CRUD 를 다 다루는건 아닌가 슬슬 걱정이 조금 된다.

// 일단 그것도 다뤄는 봤으니, 뭐 복습하는 셈 치고 볼까.

 

fs.writeFile(filename, data, [options], callback)
=> filename의 파일에 [options]의 방식으로 data 내용을 쓴 후 callback 함수를 호출합니다.(async)

fs.writeFileSync(filename, data, [options])
=> filename의 파일에 [options]의 방식으로 data 내용을 씁니다.(sync)

// main.js
const fs = require("fs");

let data = "fs.writeFile test";

// 1) async way writing
// final parameter element shall bring the callback function once its task(job) is done.

fs.writeFile("text1.txt", data, "utf8", function(err) {
	console.log("비동기적 파일 쓰기!!");
});

// 2) sync way writing

fs.writeFileSync("text2.txt", data, "utf8");
console.log("동기적 파일 쓰기!!);

- 쓰기도 마찬가지이다. 코드 실행 시, '동기적 파일 쓰기!!' 가 (sync)먼저 출력된다.

 

// 그럼, fs module 에서 읽기와 쓰기 까지는 이렇게 알아 두면 좋겠네.

// 잠깐, 이해는 하는데...음, 뭐 하나만 더 해볼까.

 

예외 처리 방식

- 파일 입출력은 여러 원인으로 예외가 발생할 수 있다.

- 파일 입출력을 하면서 중요한 것이 예외 처리다.

- 이는 시스템이 비정상적으로 종료되지 않게 하기 위한, 필수 사항이다.

- 동기적 방식과, 비동기적 방시에서의 예외 처리 방식이 조금씩 다르다.

 

// oh...sugar.

 

1) 동기적 방식 예외 처리 (exception handling of the sync way)

- JS 예외 처리할 때, 일반적으로 쓰는 방식인 try ~ catch 구문으로 처리한다.

- 쓰기도 마찬가지이다. try catch 구문으로 써준다.

 

// 음, 일단 node.js 영역으로 들어간 건 맞구나. 하지만, 알고리즘이라 해도, 알고 써야지.

 

//main.js
const fs = require("fs");

// 파일 읽기( 동기적인 예외 처리) - file reading (handling the exception of sync way)
try {
	let data = fs.readFileSync("notexist.txt", "utf8"); // 파일이 없는데 읽으려 하는 경우
    console.log(data);
}
catch (err) {
	console.log(err);
}

주의사항:

try () {...} 가 아니다.

try {...} 가 맞다.

 

2) 비동기적 방식 예외처리 (async way to handle the exception)

- async 방식에서는 예외 발생시, callback function 의 parameter 에서 err 에 전달 된다.

- 따라서, 따로 try ~ catch 구문 사용 필요가 없다.

// main.js
const fs = require("fs");

// 파일 읽기 (file reading)
fs.readFile("notextist.txt", "utf8", function (err, data) { //존재 하지 않는 파일 읽을 때,
	if (err) {
    	console.log(err); // 읽기 실패 // So basically, create an error on purpose.
    }
    else {
    	console.log(data); // 읽기 성공
    }
});

<end of fs module>

// 더 알아 보고 싶다면, https://nodejs.org/api/fs.html

 

도움되는 링크:

Programming with Mosh
https://www.youtube.com/watch?v=PFmuCDHHpwk

코드스테이츠 Help-Desk
https://github.com/codestates/help-desk/issues/317

flaviocopes
https://flaviocopes.com/node-module-fs/

what the heck is the event loop anyway
https://www.youtube.com/watch?v=8aGhZQkoFbQ

 

여기까지 참고한 링크는, 이미 제목 부분에다가 걸어 두었으니 참고하면 되겠습니다.

 

여담 1.

원본과 달리 영어로 적어둔 게 군데군데 있는데, 이건 필자의 편의상 변환 해 둔 목적이 가장 큽니다.

 

여담 2.

module...백엔드와도 관계가 많은 개념인 듯 하다. 그래서 node.js 가 풀스택이라는 건지도 모르겠다.

 

링크.

오, 여기도 있었다. 오픈튜토리얼.

 

면책(Disclaimer).

이 게시글은 개인 참고 노트 목적으로서 작성 되었으며, 상업적 목적으로 작성되지 않았습니다.