Node.js의 핵심개념인 '비동기 통신'에 대해 알아보겠습니다.
1. 동기 vs 비동기
작업을 처리하는 방식에는 동기실행과 비동기 실행이 있습니다. Node.js의 경우 대부분 비동기 실행이 권장되는데요. 먼저 이 둘이 어떤 차이가 있는지 알아보겠습니다. 쉽게 이해하기 위해 예를 들어볼게요.
'동기' 식당이 있습니다. 동기 식당은 손님 한명 한명을 소중히 여깁니다. 그래서 A손님의 주문을 받으면 A음식이 나올때까지 다른 손님의 주문을 받지 않습니다. 그리고 비로소 A손님의 주문이 끝난 후에야 B손님의 주문을 받고, B손님의 음식이 나오고 나서야 다음 C손님의 주문을 받습니다. 어떤가요? 손님 한명한명 대하는 건 좋지만.. C손님 입장에선 기다리는게 불만일 수 있겠네요.
반면에 '비동기' 식당은 빠른 처리를 중요하게 생각합니다. 그래서 A손님의 주문을 받으면 A손님의 음식을 만드는 사이 B와 C손님의 주문을 처리합니다. 그리고 A음식이 나오면 A손님에게 서빙을 하고, D손님의 주문을 받죠. 일반적으로 우리가 다니는 식당과 처리가 비슷하네요.
이번에는 동기 실행과 비동기 실행을 코드를 통해 알아보겠습니다.
Node.js의 코어모듈 FileSystem을 이용해서 볼껀데요. FileSystem에는 동기로 파일을 읽는 readFileSync함수와 비동기로 파일을 읽는 readFile함수가 있습니다. 같은 기능을 하는 함수인데 이름만 다른 함수입니다. 잠깐 팁을 드리자면 readFileSync는 뒤에 synchronized(동기화)의 'Sync'가 붙어있는걸 볼 수 있습니다. 이름만봐도 동기 작업인걸 알 수 있겠죠?
1) 동기 실행
: main.js 파일을 만들고 아래 코드를 적은 다음, 터미널에서 'node main'을 쳐서 main.js 파일을 실행시켜보겠습니다.
const fs = require('fs')
console.log("====<동기>====")
var text = fs.readFileSync('./test.txt', 'utf-8')
console.log(text)
console.log("================")
처리과정을 살펴보겠습니다. ① 처음에는 '====<동기>===='를 출력하고, ②fs.readFileSync 함수가 파일을 읽을 때까지 기다렸다가 text를 출력하고(test.txt파일에는 "Hello, Node.js"가 적혀져있씁니다.), ③ 마지막으로 '================'를 출력하겠네요.
콘솔에서 순서대로 출력된 걸 볼 수 있네요.
2) 비동기 실행
: 이번에는 비동기 함수인 readFile을 사용해보겠습니다. readFile은 마지막인자로 콜백 함수를 넣어줍니다. 특정 작업이 완료된 후에 실행되는 함수를 콜백함수라고 부르는데요. 비동기 함수에는 일반적으로 마지막인자로 콜백함수를 넣어줘요. 그 이유는 readFile함수는 비동기라서 일단 읽어야하는 파일을 등록만해주고, 다음 작업을 하러 가기때문이예요.
const fs = require('fs')
console.log("====<비동기>====")
fs.readFile('./test.txt', 'utf-8', function(error, data){
console.log(data)
})
console.log("================")
그래서 동기와는 처리과정이 다릅니다. 일단 ① 처음에는 '====<동기>===='를 출력합니다. 그리고 fs.readFile 함수가 파일 읽을 거 있대~ 이거 읽어! 하고 작업대에 던져주고 자기 할일을 하러 갑니다. ② 그리고는 다음손님인 콘솔 '================'을 출력합니다. ③ 이 작업이 완료되고 나서야 다시 readFile 함수로 돌아와서 콜백함수를 실행합니다. 이때 콘솔에 data가 출력되겠네요
어떠신가요? 비동기로 작업하는게 코드가 순차적으로 실행되지 않아 코드의 실행 순서를 예측하기가 조금 어려울 수도 있겠죠? 하지만 처리하는 입장에선 시간을 단축하고 일을 효율적으로 할 수 있어서 더 좋겠죠?
Node.js를 이용하면 비동기 실행 프로그램을 손쉽게 만들 수 있습니다
'지금, 개발하기 > Node.js' 카테고리의 다른 글
node.js] 개발 용도로만 필요한 패키지들 관리? (0) | 2022.08.02 |
---|---|
node.js] url 모듈 사용하기 (0) | 2022.04.19 |
Node.js] 이벤트 처리 - EventEmitter (0) | 2022.02.04 |
node.js] npm 명령어 퀴즈 (0) | 2022.01.13 |