Achievement Goals
Node.js의 fs 모듈의 사용법을 이해할 수 있다.
*Node.js는 "비동기 이벤트 기반 자바스크립트 런타임이다.
싱글(단일)스레드 : 한번에 노드제이에스가 실행하 수 있는 파일은 한개임.
fs(File System) 의 약자로, fs모듈을 설치하면 PC의 파일을 읽거나 저장하는 등의 일을 할 수 있게 도와준다.
node.js 에는 컴퓨터의 계산기 기능, 메모장 기능 처럼 기본적으로 세팅되어있는 내장 모듈이 있다.
자바스크립트파일을 불러오기 위해 밑에 작성된 키워드를 작성한것처럼
<script src = '파일명'/>
node.js 에서는 내장모듈을 불러오기 위해 require 를 사용한다.
const fs = require('fs'); // 파일 시스템 모듈 불러오기
const dns = require('dns'); // DNS 모듈을 불러오기
마치 리액트에서 import 하여 파일을 불러오는것과 같다고 볼 수 있다.
그렇다면 node.js 에서도 리액트처럼 외부 모듈을 설치할 수 있을까?
물론 그렇다!
내장된 모듈이 아닌, 제 3의 모듈을 설치 하기 위해서는 다음과 같은 코드를 작성한다.
npm install underscore //설치 후
const _ = require('underscore'); //require 로 불러와 사용.
fs.readFile() 은 로컬에 존재하는 파일을 읽어오는 메소드다.
fs.readFile 은 비동기적으로 파일 내용 전체를 읽으며 세가지의 인자를 넘길 수 있다.
fs.readFile(path[, options], callback)
첫번째 인자에 오는 path 는 파일 이름을 넘겨주는 인자로서,
<string> || <Buffer> || <URL> || <integer>
총 위의 네가지의 타입이 올 수 있는데, 보통은 문자열타입이 온다고 보면 된다.
공식문서조차 [,options] 라고 써있는 options 는 말그대로 옵셔널 하다.
<Object> | <string>
온다면 위의 두 타입이 올 수 있는데 만약 스트링 타입으로 오게 된다면
인코딩을 넘기게 되는데, 그동안 우리가 많이 봤던 'utf8' 이 알고보니 문자열.. 뭐 관련있나봄 (내공이 부족하여,, 여기까지 ㅏ하하하)
utf-8 은 한국어라나 뭐라나 영어,일본어 등등은 따로 코드가 있다고 한다.
하지만 optional 한 options 인자자리에 'utf8' 를 써주지 않는다면 비동기 함수의 인자에 toString() 처리를 해주어야 한다.
함수를 인자로 받는 callback() 은
err <Error>
data <string> | <Buffer>
err, data 를 인자로 받는데 콜백으로 받은 함수에서 파일을 읽고, 파일을 비동기적으로 실행한다.
위 세가지를 종합해보면 다음과 같은 형태를 띈다.
fs.readFile('test.txt', 'utf8', (err, data) => {
if (err) {
throw err;
}
console.log(data);
});
이런저런 설명 다 됐고, 한마디로 간단히 말하면 빠르게! 사용하기 위해서이다.
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
프로그램의 진행 상황을 간단하게 설명하자면,
각 a,b,c 라는 함수가 있다고 치자.
각기 실행시간이 다른 이 함수들을 비동기적으로 처리하고, 관리하는 메소드로
callback / promise(resolve,reject) / async,await
세가지가 있다고 앞서 설명했다.
이 방법들을 사용하기전, 비동기적 파일을 읽도록 도와주는 친구가 바로 이 fs.readFile 이다.
노드의 fs 모듈친구의 도움을 받아 비동기는 더 빨리 끝날 수 있는것이다.
const getDataFromFile = function (filePath, callback) {
//파일을 읽어와야 한다.
fs.readFile(filePath,'utf8',(err,data) => {
//utf8 로 변환한다. 없으면 data는 toString() 작성.
if(err){
callback(err,null)
}else{
callback(null,data) // or (null,data.toString();)
}
});
};
갓잇?
여기서의 에러는 리드파일에서 생성되는 에러이고, 에러가 생성되면(트루가 되면) 에러가 생성된다. 주의할점은, 위의 코드처럼 인자 callback를 불러오고, callback 은 err,data 인자가 두개이기 때문에 어디서 에러처리를 해주고 어디서 데이터 처리를 해줄지 명확하게 표시를 해야한다. 그래서
err => callback(err,null)
data => callback(null,data)
그냥 비어있는 상태의 null 처리를 반드시 해주도록 한다!
🤔 "" 빈문자열이나 undefined 를 쓰면안되나유?
빈문자열이나 undefined 또한 한자리 차지하고있는? 애들이기때문에 callback 인자로서 제대로 된 역할을 하지 못할것이다.