포스트

노드 학습 6일차

오늘은 파일 시스템에 접근하는 fs 모듈과 버퍼/스트림 에 대해 공부했습니다.

fs 모듈이란

  • 파일 시스템에 접근하는 모듈
  • 파일/폴더 생성, 삭제, 읽기, 쓰기 가능
  • 콜백이 기본 형식이지만 프로미스 지원
  • 동기/비동기 각각 지원

파일 읽기 (비동기)

readFile() 함수를 사용합니다.

1
2
3
4
5
6
7
8
9
10
const fs = require('fs');

fs.readFile('./readme.txt',(err,data)=>{
    if(err){
        throw err;
    }
  
    console.log(data); // 버퍼퍼 데이터로 출력됨
    console.log(data.toString());
})

파일을 읽는 예시 입니다.
결과 값은 사람은 읽을 수 없는 데이터로 전달 되기 때문에 toSrring() 을 사용하여 읽을 수 있도록 변환하여 사용합니다.
콜백을 기반으로 하고 있으며 (err,data) 의 형식을 가지기 때문에 util 모듈에서 promisify 를 사용할 수 있습니다.
하지만 fs 에서도 자체적으로 프로미스를 지원하고 있습니다.
다음은 그 예시입니다.

1
2
3
4
5
6
7
8
9
10
const fs = require('fs').promises; // 프로미스를 지원함

fs.readFile('./readme.txt')
.then((data)=>{
    console.log(data);
    console.log(data.toString());
})
.catch((err)=>{
    throw err;
})

파일 쓰기 (비동기)

writeFile() 함수를 사용합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
const fs = require('fs').promises;

fs.writeFile('./writeme.txt','내용이 입력됩니다')
.then(()=>{
    return fs.readFile('./writeme.txt');
})
.then((data)=>{
    console.log(data);
    console.log(data.toString());
})
.catch((err)=>{
    throw err;
})

파일 읽기 (동기)

readFileSync() 함수를 사용합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const fs = require('fs');

const data1 = fs.readFileSync('./readme.txt');
console.log('1번',data1.toString());
  
const data2 = fs.readFileSync('./readme.txt');
console.log('2번',data2.toString());
  
const data3 = fs.readFileSync('./readme.txt');
console.log('3번',data3.toString());
  
const data4 = fs.readFileSync('./readme.txt');
console.log('4번',data4.toString());
  
const data5 = fs.readFileSync('./readme.txt');
console.log('5번',data5.toString());

파일 쓰기 (동기)

writeFileSync() 함수를 사용합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
 * writeFileSync 를 사용하여 동기적으로 파일을 생성하는 예시입니다.
 */
  
const fs = require('fs');
  
fs.writeFileSync('./writeme.txt','내용으로 사용될 인수 입니다');
  
const data = fs.readFileSync('./writeme.txt');
  
console.log(data.toString());
  
fs.rmSync('./writeme.txt');

버퍼와 스트림 이해하기

버퍼란?

  • 일정한 크기로 모아둔 데이터
  • 일정한 크기가 되면 한번에 처리

스트림이란?

  • 데이터의 흐름
  • 버퍼(또는 청크)의 크기를 작게 만들어서 주기적으로 데이터를 전달

버퍼 내장 객체 사용해보기

1
2
3
4
5
6
7
8
9
const buffer = Buffer.from('아임 버퍼에요');
console.log('from():',buffer);
console.log('length:',buffer.length);
console.log('toString():',buffer.toString());
  
const array = [Buffer.from('띄엄 '), Buffer.from('띄엄 '), Buffer.from('띄어쓰기')];
console.log(Buffer.concat(array).toString());

console.log(Buffer.alloc(5));

주요 함수

  • from() : 버퍼를 생성합니다
  • concat() : 버퍼를 합칩니다
  • alloc() : 빈 버퍼를 생성합니다

빈 버퍼는 주어진 크기만큼 00 값을 가지게 됩니다.

fs 모듈과 스트림

fs는 다음의 함수를 통해 읽고 쓰는 스트림을 사용할 수 있습니다.

  • createReadStream()
  • createWriteStream()

createReadStream

파일을 읽을 때 사용하는 스트림입니다.

예시 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const fs = require('fs');
/* 스트림을 지원하지만 기본 청크의 크기가 64kb라서 
highWaterMark 옵션을 통해 청크의 크기를 임의로 변경합니다.
*/
const readStream = fs.createReadStream('./readme.txt',{highWaterMark:16} );
const data = [];
  
readStream.on('data',(chunk)=>{
    data.push(chunk);
    console.log(chunk);
    console.log(chunk.length);
    console.log(chunk.toString());
})
  
readStream.on('end',()=>{ // close 이벤트도 존재합니다.
    console.log('end:',Buffer.concat(data).toString());
})
  
readStream.on('error',(err)=>{
    console.error(err);
});

createWriteStream

파일을 쓸때 사용하는 스트림입니다.

예시 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const fs = require('fs');

const writeStream = fs.createWriteStream('./writeme.txt');
  
writeStream.on('finish',()=>{
    console.log('파일 쓰기 종료');
})
  
writeStream.on('error',(err)=>{
    console.error(err);
})
  
writeStream.write('첫 번째 줄 내용입니다\n');
writeStream.write('두 번째 줄 내용입니다\n');
writeStream.write('세 번째 줄 내용입니다\n');
writeStream.end();

write() 함수를 통해 내용을 작성하고 end() 함수를 통해 스트림의 데이터 전송을 끝냅니다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.