Silver Library (Archived)
[JS] node.js 의 module 에 대하여 본문
면책(Disclaimer).
이 게시글은 개인 참고 노트 목적으로서 작성 되었으며, 상업적 목적으로 작성되지 않았습니다
근원.
module - readline
요약:
- 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
이미 요약을 넘었지만...그래도 참고 노트 개념으로 적어두었다.
요약:
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).
이 게시글은 개인 참고 노트 목적으로서 작성 되었으며, 상업적 목적으로 작성되지 않았습니다.
'CS Library' 카테고리의 다른 글
이 카테고리의 개요. (0) | 2021.10.22 |
---|---|
점근 표기법 (Big-O 표기법) 과 알고리즘 (0) | 2021.10.22 |
JS - Array, call back function, scope chain (0) | 2021.07.23 |
JS - Enumerable, 그리고 configurable (0) | 2021.07.21 |
반드시 복습 해야 할 개념 (amidst JS 자료구조) (0) | 2021.07.10 |