파일 시스템 적용

장민우·2020년 11월 27일
0

부족했던 파일시스템에 대해 알아보자.

readFile

readfile.js

const fs = require('fs');

fs.readFile('./readme.txt', (err, data)=>{
    if(err){
        throw err
    }
    console.log(data);  // <Buffer ea b8 80 ec 9d b4 20 ec 9e 85 eb a0 a5 20 ec 99 84 eb a3 8c 2e>
    console.log(data.toString()); // readme.txt에 저장된 값(저를 읽어주세요!)
})

readme.txt

저를 읽어주세요!

data의 값이 buffer로 나오기 때문에 toString()을 이용해 값을 변경해줘야 한다.

buffer : 2진법을 16진법으로 바꾼 data, 컴퓨터가 다루는 data구나 라고 생각.
(아직 buffer를 모르겠으나 여기서는 이정도까지만 알아도 충분)

위 코드의 문제점

코드가 길어졌을 때 콜백 헬 발생.

해결방법

promise를 이용한 파일 시스템

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

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

promises를 붙여주면 알아서 promise를 지원하게 바꿔준다

writeFile

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

fs.writeFile('./writefile.txt', '글 입력 완료.')
    .then(()=>{
        return fs.readFile('./writefile.txt')
    })
    .then((data)=>{
        console.log(data);
        console.log(data.toString());
    })
    .catch((err)=>{
        console.log(err);
    })

해당 폴더에 writefile.txt 파일 생성

writefile.txt

글 입력 완료

비동기 함수

const fs = require('fs');

fs.readFile('./readme.txt', (err,data)=>{
    if(err){
        throw err
    }
    console.log('1번', data.toString());
})
fs.readFile('./readme.txt', (err,data)=>{
    if(err){
        throw err
    }
    console.log('2번', data.toString());
})
fs.readFile('./readme.txt', (err,data)=>{
    if(err){
        throw err
    }
    console.log('3번', data.toString());
})
fs.readFile('./readme.txt', (err,data)=>{
    if(err){
        throw err
    }
    console.log('4번', data.toString());
})

문제점과 실행 순서

4개의 fs함수 모두 백그라운드로 넘어가서 동기에 실행 ->
운영체제에서 먼져 끝난 함수를 task queue에 넣어줌 ->
매번 순서가 다르게 출력(문제점)

해결책

1번째 : promise를 이용

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

fs.readFile('./readme.txt')
    .then((data)=>{
        console.log('1번', data.toString());
        return fs.readFile('./readme.txt');
    })
    .then((data)=>{
        console.log('2번', data.toString());
        return fs.readFile('./readme.txt');
    })
    .then((data)=>{
        console.log('3번', data.toString());
        return fs.readFile('./readme.txt');
    })
    .then((data)=>{
        console.log('4번', data.toString());
        return fs.readFile('./readme.txt');
    })
    .catch((err)=>{
        console.log(err)
    })

2번째 : await 이용

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

async function main(){
    let data = await fs.readFile('./readme.txt');
    console.log('1번', data.toString());
    data = await fs.readFile('./readme.txt');
    console.log('2번', data.toString())
    data = await fs.readFile('./readme.txt');
    console.log('3번', data.toString())
    data = await fs.readFile('./readme.txt');
    console.log('4번', data.toString())
}
main();

0개의 댓글