노드 file system

2597 단어 node.jsnode.js

fs

파일 시스템 접근 모듈로 파일이나 폴더 생성, 삭제, 읽기, 쓰기시 사용.

아래는 readme.txt파일을 읽는 코드

const fs = require('fs');

fs.readFile('./readme.txt', (err, data)=>{		//콜백 함수 형태로 (err,data)=>{} 형식
												//따라서 util.promisify로 감싸서 promise로 바꿀 수 있음
	if(err){
    	throw err;
    }
    console.log(data);					//바이너리로 리턴
    console.log(data.toString());		//사람이 읽기 위해 toString() 사용
})

fs를 프로미스로 만들어 달라는 요청이 많았기 때문에 아래와 같이 프로미스로 만들 수 있음

const fs = require('fs').promises;			//require뒤에 promises 붙여서 프로미스로 바꿈

fs.readFile('./readme.txt')
	.then(() => {
    	console.log(data);					//바이너리로 리턴
    	console.log(data.toString());		//사람이 읽기 위해 toString 사용 
    })
    .catch((err)=>{
    	throw err;
    });

아래는 파일에 작성하고 해당 파일을 읽어서 콘솔로 출력하는 코드

const fs = require('fs').promises;		

fs.writeFile('./writeme.txt', 'hello node')
	.then(() => {
		return fs.readFile('./writeme.txt')
    })
    .then((data) => {
    	console.log(data.toString())
    })
    .catch((err)=>{
    	throw err;
    });

버퍼와 스트림

버퍼: 일정한 크기로 모아두는 데이터. 한꺼번에 데이터를 보냄.
스트림: 데이터의 흐름. 데이터를 쪼개서 여러번에 걸쳐 데이터를 보냄.

스트림 방식이 서버의 메모리를 적게 차지하면서 효율적으로 데이터를 전송할 수 있어서 스트림 방식을 많이 사용함.

아래 코드는 스트림 방식으로 파일의 데이터를 읽는 코드

const fs = require('fs');
const readStream = fs.createReadStream('./readme.txt');

const data = [];
readStream.on('data', (chunk)=>{
	data.push(chunk);
    console.log('data', chunk, chunk.length);
});
readStream.on('end', ()=>{
	console.log('end', Buffer.concat(data).toString());
});
readStream.on('error', (err)=>{
	console.log('error', err);
});

그러나 createReadStream이 한번에 읽는 데이터의 크기가 64KB이기 때문에 그 이하의 데이터는 한번에 읽히게 된다. 한번에 읽는 데이터 크기를 설정하기 위해서 아래와 같이 highWaterMark를 설정해준다.

const fs = require('fs');
const readStream = fs.createReadStream('./readme.txt', {highWaterMark: 16});			//16바이트 씩 읽는다

const data = [];
readStream.on('data', (chunk)=>{
	data.push(chunk);
    console.log('data', chunk, chunk.length);
});
readStream.on('end', ()=>{
	console.log('end', Buffer.concat(data).toString());
});
readStream.on('error', (err)=>{
	console.log('error', err);
});

대용량 데이터 서버에서는 스트림 방식이 필수. 만약 100GB의 동영상을 저장하는데 버퍼 방식을 사용한다면 서버의 메모리가 100GB가 되어야 해서 발생하는 비용이 너무 크다. 따라서 스트림 방식을 사용해서 대용량의 데이터를 쪼개서 전송하는 것이 메모리 관리에 있어서 매우 효율적이다.

좋은 웹페이지 즐겨찾기