node.js는 비동기적 처리를 사용하기 좋다
우리가 이전에 사용하였던 node.js의 모듈 FileSystem를 사용한다.
공식문서에서 fs.readFile 과 fs.readFileSync 함수를 비교해보면,
fs.readFile(path[,options],callback)
fs.readFileSync(path[,options])
둘의 눈에 띄는 차이점은 바로 callback의 유무이다.
코드를 통해 실행해보며 어떤 방식으로 다르게 실행되는지 확인해보자.
//readFileSync
console.log('A')
var result = fs.readFileSync('syntax/sample.txt', 'utf8');
console.log(result);
console.log('C');
sample.txt에는 'B'라는 문자 하나만 적혀있다.
그럼 output이
A
B
C
로 순차적으로 실행된다.
console.log('A');
fs.readFile('syntax/sample.txt', 'utf8', function(err, result){
console.log(result);
});
console.log('C');
비동기적 함수인 readFile을 쓸 때, callback 차리에는
function(err,result) {} 와 같은 함수가 들어간다.
발생한 에러가 인자로 들어가는 곳이 err, readFile이 경로에서 읽어낸 파일의 내용이 인자로 들어가는 곳이 result이다.
위의 readFileSync에서는 readFileSync 함수의 리턴값, 즉 해당 경로의 파일의 내용을 반환하여 변수 result
에 넣어주고, 이를 console.log로 출력했다.
그러나 readFile은 해당 경로의 파일의 내용을 읽은 뒤에 실행할 코드를 callback 자리에 작성해주어야 한다.
따라서 파일 내용을 출력하는 console.log(result)
가 callback 내부로 이동하게 되는 차이를 가진다.
output을 보면 동기와 비동기의 차이를 정확히 알 수 있다.
A
C
B
로 출력된다.
그 이유는,
위의 코드에서
fs.readFile('syntax/sample.txt', 'utf8', function(err, result){
console.log(result);
});
이 곳이 비동기적 처리가 구현된 곳이라고 하였다.
또 callback은 세번째 인자로 들어간 function이다.
callback을 구현한 것의 의미는,
"node.js에게 '파일읽기'(I/O작업으로서 시간이 조금 걸림)를 모두 마친 뒤에, callback 함수를 호출함으로써 나에게 작업이 마쳤음을 알려달라고 한 것" 이라고 할 수 있다.
쉽게 말해, readFile을 통해서 파일 내용을 읽은 뒤에 해야할 일, 실행시켜야할 함수를 callback 내부에 작성하는 것이다.
이름이 없는 함수 : 익명함수
function a() {
console.log('A');
}
와 같은 일을 하는 코드를 익명함수로 구현하려면
var a = function() {
console.log('A');
}
a(); //A라고 출력됨
와 같이 익명함수를 변수에 넣어줌으로써 이름을 붙여 사용할 수 있다.
이를 통해 알 수 있는 것은,
JavaScript에서의 함수는 값이다.