Hello World/BN

NodeJS - 동기/비동기

Young's Today 2022. 11. 25. 13:24

1. 동기 / 비동기

(1) 동기(Sync) : 먼저 실행된 코드의 결과가 나올때까지 대기

(2) 비동기(Async) : 실행된 순서와 관계 없이 결과가 나오는것

 

2. 블로킹 모델 / 논블로킹 모델

(1) 블로킹 모델 : 코드의 실행이 끝나기 전까지 실행 제어권을 다른 곳에 넘기지 않아 다른 작업을 하지 못하고 대기하는 것, 비동기 처리 불가능

(2) 논블로킹 모델 : 코드의 실행이 끝나지 않아도 실행 제어권을 다른 곳에 넘겨 다음 코드가 실행될 수 있는 것, 비동기처리 가능

 

3. 자바스크립트

- Async + Non-Blocking Model 사용

- 현재 실행중인 코드의 실행이 끝나지 않아도 다음 코드를 호출

- 각 명령들이 순서대로 실행될 수 있게 구현되어 있지만

- 논블로킹 모델에 의해 동기적 명령이 아닌 모든 함수는 비동기적으로 실행

 

4. 예시

function first() {
  console.log('First');
}

setTimeout(first, 1000); // 1000ms(1초) 뒤에 first 함수를 실행해준다.

console.log('Middle');
console.log('Last');

// 출력 순서
// 1. Middle 출력
// 2. Last 출력
// 3. 1초 후 First 출력

- 자바스크립트는 논블로킹 모델이기 때문에 이러한 순서로 출력

- 블로킹 모델이었다면 First > Middle > Last 순서로 출력

 

5. 비동기 함수 (Async Function)

(1) 비동기 함수 특징

- 비동기 함수는 일반 함수나 화살표 함수와 비슷하지만 다른 특징을 가짐

- 비동기 함수의 결과값은 항상 promise 객체로 resolve 됨

- 비동기 함수 안에서만 await 연산자를 사용할 수 있음

// 비동기 + 일반함수
async function 함수이름() {
	명령문
}

// 비동기 + 익명함수
async function () {
	명령문
}

// 비동기 + 화살표함수
async () => {
	명령문
}
function 함수이름() {
	return Promise.resolve('값');  // 출력 : Promise {'값'}
    
async function 함수이름() {
	return '값';                   // 출력 : Promise {'값'}
    
// 두 가지 함수는 같은 동작을 보여줌

(2) 비동기 함수 사용 이유

- await 연산자를 비동기 함수 안에서만 사용할 수 있음

- new Promise(executor) 코드로 Promise를 직접 생성하면 executor가 바로 실행되는 것과 달리

- 비동기 함수는 함수가 실행되기 전까지 Promise를 생성하지 않음