Data house
생활코딩 node.js_28강(1~3) 본문
# Node.js에서 동기와 비동기
동기 synchronous = 순서대로 일을 처리하는 것
비동기 asynchronous = 동시에 일을 처리하는 것
쉽게 예를 들어보면, 우리가 시험기간인 상황이고 pdf파일을 프린트해서 공부해야한다
인쇄소에 pdf파일을 복사를 맡긴 상황이라고 가정하자
여기서 동기는 인쇄소에 맡긴 인쇄물이 다 만들어질 때까지 기다렸다가 그 다음 인쇄물을 찾고 시험 공부를 하는 것이고 비동기는 인쇄소에 맡긴 인쇄물을 기다리는 동안에 집에가서 해야할 다른 일을 하고 인쇄가 끝났다면 찾아가서 그 다음으로 해야할 것을 하는 상황으로 생각하면 된다.
동시에 일을 처리한다는 점에서 비동기는 효율적이지만 매우 복잡하다!
그렇다면 동기, 비동기가 code level에서 어떤 차이를 갖는가?
폴더 syntax에 새로운 폴더 sync.js와 sample.js를 만들어서 다음과 같이 코딩한다.
sync.js의 코딩을 보면 readFileSync를 사용하고 있다
이는 동기적인 readFile을 실행하겠다는 의미인데 이 코드를 실행시켰을 때 다음과 같다
음.. 그렇다면 비동기적인 readFile을 실행했을 땐 어떻게 출력이 될까
그것을 알기 위해 readFileSync를 readFile로 고치고 call-back을 넣어주었다
readFileSync(동기)는 return값을 주는데 readFile(비동기)은 그렇지않다 그렇기 때문에 함수를 3번째 인자로 주어야한다
node.js가 'syntax/sample.txt'를 읽는 작업이 끝나면 3번째 인자로 준 함수를 실행시킨다
readFile의 3번째 인자인 function()은 만약 첫번째 인자에 error가 있다면 err를 인자로 제공하고 두번째 parameter에는 파일의 내용을 인자로써 공급해주도록 약속되어있다
cmd로 코드를 실행한 결과는 다음과 같다
console.log('A');가 실행되고 fs.readFile()이 실행될것인데 그 결과를 가져오기 전에 console.log('C')가 실행되고 fs.readFile()의 실행이 완료되면 3번째 인자인 함수가 호출되면서 함수 안에서의 console.log(result);가 나중에 실행된 것이다
node.js의 성능을 제대로 끌어올리기위해서는 반드시 비동기적인 방식으로 처리해야한다
그런데 만약 코드가 복잡하고 성능이 우선시되지 않는다면 간단한 동기적인 방식으로 처리해도 된다
# JavaScript - callback
readFile은 node.js에게 'syntax/sample.txt'을 읽어오고 작업이 끝난 다음 3번째 인자인 function()을 실행시키라는 말이다. 그렇다면 node.js는 파일을 읽고 작업이 끝나면 function()을 내부적으로 호출할 것이다. 작업이 끝난 다음에 처리해야할 일을 console.log(result);가 있는 자리에 배치해두면 처리가 될 것이다 이것이 callback이다
callback은 "node.js한테 파일을 읽은 다음 나중에 함수를 호출하는 것을 통해 나를 불러줘~"이런 느낌이다
나중에 전화해주세요~ 이런 말이랑 비슷하다!
주석이 달린 코드를 보면 우리가 함수를 만들때 흔히 사용했던 방식이다 그 아래 주석이 달리지 않은 부분을 보면 변수에 익명함수를 담고 있는 모습을 볼 수 있을 것이다 여기서 익명함수란 이름이 없는 함수를 말한다
보다시피 JavaScript에서는 함수를 값으로 취급하고 있다는 걸 알 수 있다
변수 a 뒤에 함수를 호출하는 기호 '()'를 통해서 a라는 변수가 담고있는 값인 함수를 실행할 수 있다
두 함수의 실행 결과는 예상했다시피 A로 동일하다
새롭게 만든 slowfunc()라는 함수는 엄청나게 시간이 오래걸리는 기능이라고 생각해 보자
slowfunc()가 기능에 대한 실행이 끝난 다음에 기능을 실행한 쪽에게 함수가 실행이 끝났으니 다음 일을 하세요라고 하고싶다면, 함수가 인자로 callback을 받으면 된다. 그리고 callback을 실행해주면된다
오랜 시간을 거쳐 동작하는 함수 slowfunc()가 실행이되고 callback이라는 parameter은 a가 가리키는 함수를 갖게 된다
여튼 callback()이라는 함수를 호출하면 console.log('A')가 실행될 것이다.
예상했다시피 실행 결과는 A가 나온다
지금까지 callback의 형식에 대해서 살펴보았다✍
'WEB > node.js' 카테고리의 다른 글
생활코딩 node.js _ 31강부터 32강까지 (0) | 2020.09.19 |
---|---|
생활코딩 node.js _ 29강부터 30강까지 (0) | 2020.09.15 |
생활코딩 node.js_26강부터 27강까지 (0) | 2020.09.12 |
생활코딩 node.js_25강(1~3) (0) | 2020.09.10 |
생활코딩 node.js_23강부터 24강까지 (0) | 2020.09.10 |