동기적 처리란 파일에 쓰여 있는대로, 순서대로 처리하겠다는 뜻이다.
중간에 아~~~주 시간을 많이 잡아먹는 코드가 있어도,
아무리 시간이 오래 걸려도,
무조건!
앞 코드 실행이 끝났을 때 다음 코드가 실행될 수 있다.
그렇다면, 비동기적 처리는?
시간이 오래 걸리는 작업은 하게 내버려두고,
다른 코드를 우선적으로 실행한 뒤
오래 걸리는 그 작업이 끝났을 때 다시 그곳으로 되돌아갈 수 있다.
코드를 함께 보자
// readFileSync
console.log('A');
let result = fs.readFileSync('syntax/sample.txt', 'utf8');
console.log(result);
console.log('C');
// A -> result -> C 순서로 출력
NodeJS 에서는 메소드명에 Sync 가 붙은 것이 동기적 처리 방식의 메소드라는 것을 뜻한다.
readFileSync는 주어진 경로로 찾아가서 파일을 읽어오고, 읽어오기가 종료되면 그제서야 result 라는 변수에 결과를 할당해준다.
2번 라인이 끝나야 3, 4번 라인을 차례로 수행할 수 있으므로
A
result
C
이 순서로 출력된다.
만약 sample.txt 의 내용이 어마어마어마하게 커서 시간이 1000000년 걸린다해도,
sample.txt 의 내용을 다 읽어야만 result와 C를 출력할 수 있다.
// readFile 비동기적 처리 - NodeJS가 더 선호하는 방식!
console.log('A');
readFile('syntax/sample.txt', 'utf8', function(err, result) {
console.log(result);
});
// 파일을 읽어오는데, 시간이 좀 걸릴 수 있으니 파일 다 읽으면 function을 네가 알아서 호출하거라.
// function 은 콜백(나중에 호출)함수라고 부른다.
console.log('C');
// A -> C -> result 순서로 출력
비동기적 처리 방식의 메소드에는 Sync가 붙어 있지 않다. 그말인즉슨 비동기 처리 방식이 NodeJS에서 더 선호되는 방식이라는 뜻.
동기 방식의 메소드와 비동기 방식 메소드의 중요한 차이는 매개변수로 주어지는 function()의 유무, 메소드 리턴값의 유무이다.
동기 방식 메소드는 작업을 모두 수행한 뒤 그 결과를 리턴해주었기 때문에 변수에 할당해줄 수 있었다.
그러나 비동기방식 메소드는 따로 결과를 리턴해주지 않는다. (변수로 할당해서 출력해보면 undefind가 나온다.)
대신 익명함수를 매개변수로 가지는데, 이것을 콜백함수(callback function) 이라고 부른다.
메소드가 호출되고 작업을 모두 수행하고 나면, 메소드 내부에서 자체적으로 호출되는 함수가 바로 콜백함수이다. 이 콜백함수를 어떻게 작성하느냐에 따라 메소드 수행 결과 실행할 작업을 제어할 수 있다.
A를 출력한 후 readFile 이 실행되고, 주어진 경로에 가서 파일을 읽기 시작한다. 파일 읽기를 모두 마치면 콜백함수를 자체적으로 호출하도록 되어 있으므로, 파일 읽기가 아직 끝나지 않았지만 아랫줄로 넘어가서 C를 출력한다. 그리고 마침내 파일을 다 읽어 오면, 콜백 함수에 정의된 대로 파일의 내용을 출력한다.
동기 처리 방식의 메소드는 해야할 일을 하나하나 적어줘야 하는 FM 스타일이라면,
비동기 처리 방식의 메소드는 자기 할일이 끝나면 알아서 다음 할일을 찾아서 하는 스타일 같달까..
비동기 처리 방식은 이해하기 어렵지만, 익숙해지면 폭발적인 효율을 낼 수 있는 방식이다.
당장은 이해되지 않더라도 익숙해지는 것을 우선으로 하자!