1. fs Module
fs 모듈은 파일 시스템에 접근하는 모듈이다. 파일 생성, 삭제 및 read/write 할 수 있다.
밑에 코드는 간단한 fs모듈을 사용한 코드이다.
// 파일 시스템 접근
// fs모듈 : 파일 시스템에 접근 모듈
const fs = require('fs');
fs.readFile('./readme.txt', (err, data) => {
if (err) {
throw err;
}
console.log(data);
console.log(data.toString());
})
여기서 주의깊게 봐야할 것은 console.log(data) 의 출력값으로 버퍼가 나오는 것이다.
2. 버퍼와 스트림에서 자세히 설명하겠다.
// writeFIle.js
const fs = require('fs');
fs.writeFile('./writeme.txt', 'write me!', (err) => {
if (err) {
throw err;
}
fs.readFile('./writeme.txt', (err, data) => {
if (err) {
throw err;
}
console.log(data.toString());
})
})
다음은 data를 입력하여 file을 저장하는 코드이다.
2. 버퍼와 스트림
파일을 읽거나 쓰는 방식에는 크게 두가지 방식이 있다.
(1) 버퍼를 이용한 방식 (2) 스트림을 이용한 방식
쉽게 예를 들면 영상을 로딩할 때 버퍼링한다고 하고, 영상을 실시간 송출할 때는 스트리밍한다고 한다.
버퍼링은 영상을 재생할 수 있을 때까지 데이터를 모으는 동작이고, 스트리밍은 방송인의 컴퓨터에서 시청자의 컴퓨터로 영상 데이터를 조금씩 전송하는 동작이다.
노드의 버퍼와 스트림도 비슷한 개념이다. 노드는 파일을 읽을 때 메모리에 파일 크기만큼 공간을 마련해두며, 파일 데이터를 모리에 저장 후 사용자가 조작할 수 있도록 한다.
즉, 메모리에 저장된 데이터가 버퍼이다.
아래는 Buffer class 를 사용한 코드이다.
Buffer class는 버퍼를 직접 다룰 수 있는 클래스이다.
// buffer.js
const buffer = Buffer.from('change me to buffer!');
console.log('from():', buffer);
console.log('length:', buffer.length);
console.log('toString():', buffer.toString());
const array = [Buffer.from('space '), Buffer.from('space '), Buffer.from('write')];
const buffer2 = Buffer.concat(array);
console.log('concat():', buffer2.toString());
const buffer3 = Buffer.alloc(5);
console.log('alloc():', buffer3);
3. 버퍼 방식의 단점
서버를 몇 명이 이용할지 모르는 상황에서 메모리 문제가 발생할 수 있다.
모든 데이터를 버퍼에 다 쓴 후에야 다음 동작으로 넘어간다. 그래서 버퍼의 크기를 작게 만들어 여러번 나눠 보내는 방식인 스트림이 등장했다.
4. Stream
// createReadStream.js
const fs = require('fs');
const createReadStream = fs.createReadStream('./readme3.txt', {
highWaterMark: 16
});
const data = [];
createReadStream.on('data', (chunk) => { // data listener : 파일 읽기가 시작되면 data이벤트 발생
data.push(chunk);
console.log('data:', chunk, chunk.length);
})
createReadStream.on('end', () => { // end listener : 파일 읽기가 시작되면 end이벤트 발생
console.log('end:', Buffer.concat(data).toString());
})
createReadStream.on('error', (err) => { // error listener : 파일 읽기가 시작되면 error이벤트 발생
console.log('error:', err);
})
다음은 버퍼의 크기를 작게 만들어서 여러번에 나눠 보내는 방식의 코드이다.
createReadStream()으로 읽기 스트림을 만들어 highWaterMark 옵션을 이용하여 버퍼의 크기를 정할 수 있다.
createReadStream.on 메소드에 이벤트 리스너 data/ end/ error 를 붙여 이벤트를 발생시킨다.
아래 stream event에 대한 자세한 설명이 나와있다.
https://nodejs.org/api/stream.html#stream_class_stream_writable
Stream | Node.js v12.11.0 Documentation
A stream is an abstract interface for working with streaming data in Node.js. The stream module provides an API for implementing the stream interface. There are many stream objects provided by Node.js. For instance, a request to an HTTP server and process.
nodejs.org
// createWriteStream.js
const fs = require('fs');
const writeStream = fs.createWriteStream('./writeme2.txt');
writeStream.on('finish', () => {
console.log('파일 쓰기 완료');
})
writeStream.write('이 글을 씁니다\n');
writeStream.write('한번 더 씁니다.');
writeStream.end();
다음은 스트림 방식으로 파일을 쓰는 코드이다.
5. pipe
// createWriteStream.js
const fs = require('fs');
const writeStream = fs.createWriteStream('./writeme2.txt');
writeStream.on('finish', () => {
console.log('파일 쓰기 완료');
})
writeStream.write('이 글을 씁니다\n');
writeStream.write('한번 더 씁니다.');
writeStream.end();
pipe method로 연결하여 writeStream으로 데이터가 넘어간다. 노드 8.5 버전이 나오기 전까지 이 방식을 이용했지만 새로운 방식이 나와 이 방법을 이용할 필요는 없다. 다음장에 자세히 설명하겠다.
'Node.js' 카테고리의 다른 글
Node.js: 04. 동기 & 비동기 방식 (0) | 2019.09.28 |
---|---|
Node.js: 02. 양방향 암호화 (0) | 2019.09.28 |
Node.js: 01. 단방향 암호화 (0) | 2019.09.27 |
댓글