본문 바로가기
Study/Express(node.js)

node.js ) 비동기 (asynchronous) 패턴

by JongIk 2022. 2. 5.
반응형

비동기 (asynchronous) 패턴

비동기 방식이란?

  • 메인 스레드가 존재하고 메인 스레드는 실제 코드를 실행합니다.
    메인 스레드는 실행시간이 오래 걸린다고 판단하면 내부에 처리하는 다른 스레드로 해당 작업을 넘기게 됩니다.
  • 하지만 메인 스레드에게 작업을 받은 스레드는 해당 작업이 끝나면 콜백함수를 메인 스레드에게 돌려줍니다.
  • 메인 스레드는 전달받은 콜백함수를 실행하지만 이 콜백함수를 실행할 때는 이미 다른 코드가 처리된 이후입니다.
  • 그리고 또 다른 작업을 스레드에게 전달하게 됩니다.

예시 : fs 를 이용해 파일을 읽고 결과를 출력하는 코드

  • index.js
const fs = require('fs');

fs.readFile('./test.txt', (err, data) => {
    console.log(data.toString());
});

console.log('test');
  • test.txt
async test 1
async test 2
async test 3
async test 4
  • 실행 결과

코드를 살펴보면 fs를 이용해 파일을 읽고 결과를 출력한 다음 console.log() 를 이용해 콘솔창에 'test' 라는 문자열을 출력하도록 했습니다. 하지만 'test' 라는 문자열이 먼저 출력된 다음 파일에서 읽은 데이터가 출력되고 있습니다.

그 이유는 메인 스레드가 오래 걸리는 작업을 다르 스레드에게 넘겼기 때문입니다. fs 와 같이 파일을 읽는 처리는 상당한 시간이 소요되기 때문에 메인 스레드는 이 작업을 직접 하지 않고 다른 스레드에게 넘기고 바로 다음 코드 ( console.log('test') ) 를 실행하게 됩니다.

그리고 메인 스레드에게 작업을 받은 스레드는 해당 작업이 끝나면 콜백함수를 메인 스레드에게 돌려주게 됩니다.

그럼 메인 스레드는 콜백함수를 실행하는데 이미 이때는 아래에 있는 코드가 실행이 끝난 상태입니다.

비동기 처리가 나열되어 있는 경우엔?

const fs = require('fs');

fs.readFile('./test.txt', (err, data) => {
    console.log(1)
    console.log(data.toString());
});

fs.readFile("./test.txt", (err, data) => {
  console.log(2);
  console.log(data.toString());
});

fs.readFile("./test.txt", (err, data) => {
  console.log(3);
  console.log(data.toString());
});

console.log('test');

이전과 같이 console.log('test') 가 가장 먼저 출력됩니다.

하지만 비동기 처리를 담당하는 코드는 실행할 때마다 매번 다른 순서로 출력됩니다.
그렇기에 이러한 형태의 코드를 작성하면 순서를 보장받지 못하는 코드가 되기 때문에 주의해야합니다.

주로 다음과 같은 순서로 코드를 작성합니다.

1.DB 데이터 조회

2.조회된 데이터에서 값 확인

3.값에 따라 조건 분기


참고도서 : 자바스크립트로 서버와 클라이언트 구축하기

반응형

댓글