본문 바로가기

백엔드/Node.js

[Do it! Node.js 입문] 02. 동기 / 비동기 처리

js는 코드를 작성한 순서대로 처리(동기 처리)하는데, 백엔드 개발에서는 네트워크 상황이나 자료 크기에 따라 비동기 처리가 필요할 때가 있다.

 

비동기 프로그래밍 vs 비동기 처리

처음 이 부분을 공부했을 때 비동기 프로그래밍과 비동기 처리의 용어가 헷갈렸다.

 

function displayA() {
  console.log('A');
}
function displayB() {
  setTimeout(() => {
    console.log('B');
  }, 2000);
}
function displayC() {
  console.log('C');
}

displayA();
displayB();
displayC();

 

비동기 프로그래밍

먼저 끝낼 수 있는 코드를 먼저 끝내는 것이 비동기 프로그래밍 방식이다.

 

더보기
...이거 한 번만 정리하고 가자

 

setTimeout()을 활용한 비동기 처리 예제를 실행하던 중 자꾸 터미널에 결과가 안 떠서 왜일까 싶었는데

cd를 끝까지 안했었다.. 

내가 원하는 폴더까지 제대로 cd했는지 똑바로 확인하기!

 

function displayA() {
  console.log('A');
}
function displayB(callback) {
  setTimeout(() => {
    console.log('B');
    callback();
  }, 2000);
}
function displayC() {
  console.log('C');
}

displayA();
displayB(displayC);

위 결과의 코드이다.

setTimeout() 함수가 섞여있지만 함수들을 원하는 처리 순서게 맞게 프로그래밍 하는 것을 비동기 처리라고 한다.

다시 말해, 먼저 끝낼 수 있지만 먼저 끝내지 않는것을 비동기 처리라고 한다!

 

 

 


활용

비동기 처리는 다음과 같이 활용된다.

const getAllContacts = asyncHandler(async (req, res) => {
    const contacts = await Contact.find();
    res.render("index", { contacts: contacts })
});

 

이 코드는 Express프레임워크에서의 비동기 함수를 다룬다.

여기서 'asyncHandler'는 미들웨어 함수로 사용되며, 에러 핸들링을 담당한다. 이 함수는 비동기 작업에서 발생하는 에러를 캐치하여  Express의 내장된 에러 핸들링 미들웨어로 전달한다.

(express 프레임워크, 미들웨어 등은 후에 다루겠다.)

 

getAllContacts 는 비동기 함수로, async 키워드로 표시된다. 

Contact.find() 메서드를 사용하여 MongoDB의 'contacts' 컬렉션에서 모든 연락처를 찾는다.

await 키워드를 사용하여 데이터베이스에서 연락처를 가져올 때까지 기다린다. ( → 먼저 끝낼 수 있지만 먼저 끝내지 않는 비동기 처리). 이후, 가져온 연락처를 contacts 변수에 할당한다.