NodeJS - 동기/비동기
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를 생성하지 않음