본문 바로가기

기타/node js

nodejs readFile과 readFileSync의 차이(비동기와 동기의 차이)

728x90

fs는 nodejs가 기본적으로 제공하는 filesystem이다.

파일을 불러오는 등의 기능을 제공한다.

readFile과 readFileSync의 차이

reaFile로 파일을 다음과 같이 불러오면 어떤 결과가 나올까?

test.json은 아래와 같다.

{
    "id":123,
    "name":"lim"
}
const fs = require('fs');
fs.readFile('./test/test.json','utf-8',(err,data)=>{
    if (err) return console.log(err);

    console.log(data);
})
console.log('1111111111111');

1번 data->11111111111

2번 11111111111-> data

 

정답은 2번이다.

프로그램에 대한 기본적인 생각은 코드 순서대로 진행된다는 것이다.

하지만 비동기는 처리는 그렇지 않다.

순서대로 들어가는 것은 맞지만 파일을 읽기 위해 test안의 test.json에 접근해

data를 가져오는 동안 main.js는 멈추지 않고 다음으로 넘어간다.

이것이 비동기 처리이다.

data를 가져오면 그때서야 {} 안에 있는 코드들이 실행된다.

이를 콜백 함수라고 부른다.

한 갈래로 가던 것이 두 갈래로 갈라지는 것이다.

더 정확히 말하면 fs프로세스에 파일을 가져오는 것을 넘기고 나머지 코드를 실행한다.

비동기 처리는 데이터를 가져올 때 프로그램이 진행을 멈추는 비효율성을 비동기 처리로 보완한다.

 

동기 처리를 하고 싶다면(파일을 꼭 읽고 와서 그 후에 실행해야 하는 경우) readFileSync을 사용하면 된다.

let data2 = fs.readFileSync('test.json','utf-8');
util.log('data2 : ',data2)
util.log("222222222222222")

해당 코드는 파일을 읽어오는 동안 전체 프로세스가 멈추고 데이터를 가져온 후 진행된다.

때문에 data2가 나온 후 222222.. 가 나온다.

사실 파일을 꼭 읽고 와서 실행해야 하는 코드의 경우 콜백 함수에 넣는 것이 전체 프로세스를 효율적으로 하는데 도움이 된다. 

사실 nodejs의 매력은 비동기처리에 있다 때문에 콜백함에 넣어서 처리하는 것을 추천한다.

하지만 경우에 따라 그렇게 처리하면 코드가 복잡해지는 경우도 있다. 

때문에 동기 처리가 필요한 경우를 잘 구분해 사용하면 된다.

728x90