Node.js 특징 및 동기 & 비동기

이정기·2022년 12월 12일
0

TIL

목록 보기
35/71
post-thumbnail

Node.js 입문

컴파일언어, 인터프리터 언어

싱글스레드, 멀티스레드

스레드(Thread) : 프로그램이 동작할 때, CPU 또는 프로세서를 사용하는 단위

싱글 스레드(Single Thread) : 스레드 하나를 사용하는 것이며, 동시에 하나의 작업만 처리할 수 있다.

멀티 스레드(Multi Thread): 여러가지 스레드를 동시에 사용하는 것이며, 동시에 여러가지 작업을 처리할 수 있다.

동기/비동기, 블로킹/논블로킹

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

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

블로킹 (Blocking) I/O : 프로그램 내부에서 호출하면 호출된 함수가 작업을 마칠 때 까지 대기하는 방식

논블로킹(Non-blocking) I/O : 함수가 실행되는 중에도 다른 작업을 동시에 진행할 수 있는 장점
cpu intensive task 처리 애로사항

동기/비동기, 블로킹/논블로킹 차이

논블로킹이면 비동기 처리 가능

제어권을 넘기면 다른 코드도 실행될 수 있으므로, 실행 순서 관계없이 결과가 나오는 것이 가능하다.

블로킹이면 비동기 처리가 가능한 환경이여도, 비동기 처리 불가능

제어권을 넘기지 않는다면, 결과가 나올 때까지 대기해야한다.

자바스크립트 특성

논 블로킹 + 비동기 = 코드의 실행이 끝나지 않아도 다음 코드를 호출

동기/비동기 비동기 함수 예제

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

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

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

// Print: Middle
// Last
// First

만약 동기였다면, First -> Middle -> Last 순으로 출력됌

프로미스(Promise)

javascript 관점에서 비동기 처리를 도익로 처리할 수 있게 돕는 객체 유형

Promise 생성자 인터페이스

인자로 resolve, reject 를 주입하며, 실행함수라 불리고, Promise가 만들어질 때 자동으로 실행된다.

두 인자는 executor 라 불리며, 둘 중 하나를 무조건 호출해야한다.

Promise 문법

new Promise((resolve, reject) => {})

Promise 예시

async function main() {
    function printFunc(){
        console.log("printFunc가 실행되었습니다")
    }
        const prom = new Promise(printFunc);
}

main()

Promise 는 반드시 3가지 상태를 지닌다.
대기 (Pending) 상태가 아니라면, 연상이 이미 끝난 상태이다.

Promise 상태

  • 대기(Pending): 이행하거나 거부되지 않은 초기 상태.
  • 이행(Fulfilled): 연산이 성공적으로 완료됨.
  • 거부(Rejected): 연산이 실패함.

생성자(Constructor)

Javascript 는 대부분 객체(Object)로 구성되어 있다.
객체를 생성하는 함수를 생성자 함수라고 부른다.
Promise 또한 객체로 구성돼 생성자 함수를 이용해 Promise를 선언하게 된다.

비동기 함수(Async Function)

비동기함수는 일반함수나 화살표 함수와 비슷하지만 딱 두가지만 다르다.

  1. 비동기 함수의 결과값은 항상 Promise 객체로 resolve 된다.
  2. 비동기 함수 안에서만 await 연산자를 사용할 수 있다.

비동기 함수 문법

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

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

// 비동기 + 화살표 함수
async () => {
	// 명령문
}

비동기 함수과 Promise의 같은 예시

function 함수이름() {
	return Promise.resolve('값');
}

// 위와 아래의 함수는 같은 동작을 보여준다.

async function 함수이름2() {
	return '값';
}

함수이름();
// Print: Promise { '값' }

함수이름2();
// Print: Promise { '값' }

비동기 함수를 쓰는 이유

  • await 연산자를 비동기 함수 안에서만 사용 가능
  • Promise 생성자 함수로 실행시 executor 가 바로 실행되지만, 비동기함 수는 함수가 실행되기 전까지 Promise를 생성하지 않는다.

자바스크립트가 비동기처럼 실행될 수 있는 원리

- MDN : Callback function

- MDN : Event loop

- NDN : Call stack

await 연산자

await 연산자를 사용하면 Promise 가 이행(fulfil) 상태 거나 거부(rejected) 될 때 까지 함수 실행을 중단 하고 기다릴 수 있다. Promise 연상이 끝나면 반환한 값을 얻을 수 있다.

await 문법

const result = await 값;

await 형태

async function 함수이름() {
	const result = await 'Test!';
	console.log(result);
}

함수이름();
// Print: 'Test!';

"값" 에는 Promise 가 아닌 값도 들어갈 수 있다. 단, Promise가 아니라면, 기다리지 않고 해당 값 자체를 그대로 반환한다.

await 로 비동기 함수 안의 예시

function setTimeoutFunc(time){

	return new Promise((resolve, reject) => {
    	setTimeout(() => {
			console.log("에 해당하는 시간이 지났습니다.")
            resolve();
		}, time);
    })

}

async function main(){
	
    console.log("시작 되었습니다.");
    await setTimeoutFunc(1000);
    console.log("종료 되었습니다.");

}

결과값
시작되었습니다.
1000에 해당하는 시간이 지났습니다.
종료되었습니다.

밑에 비동기 함수 안 await 함수에서 함수실행을 중단하고, 기다린다. 1초뒤 "종료되었습니다" 가 출려되며, 순차적으로 나오는 모습을 볼 수 있다.

이벤트 루프

싱글스레드의 약점을 보안하기 위해 효율적으로 작업을 처리할 수 있는 특성

Node.js 는 논 블로킹 I/O, 싱글스레드, 이벤트 루프 의 특성이 있다.
Non-blocking , Single Thread, Event Loop

REPL 이란

Read : 읽어 메모리에 저장
Evaluate : 평가 된 값
Print : 출력
Loop : 특정 신호 입력 받기 전까지 위 과정 반복

개발자 도구에서 console.log 로 출력 되는 것과 비슷

profile
Node.js 로 꿈을 꾸었다..

0개의 댓글