노드 입문_1

·2022년 12월 12일
0

노드 입문

목록 보기
1/1

Node.js의 대표적인 특징 3가지

  1. 논 블로킹(non-blocking) I/O
    함수가 실행되는 중에도 다른 작업을 동시에 진행
    비동기 작업을 할 때 좀 더 효율적으로 사용할 수 있음
  2. 싱글 스레드(Single Thread)
    스레드 하나를 사용하는 것이며, 동시에 하나의 작업만을 처리할 수 있음
    병렬 프로그래밍 or 멀티 프로세싱 개념에 있어서 고민할 필요가 없음
  3. 이벤트 루프(Event Loop)
    자바스크립트가 가지고 있던 싱글 스레드의 약점을 극복하기 위해 효율적으로 작업을 처리할 수 있는 특성

동기(Sync) & 비동기(Async)

  1. 동기
    먼저 실행된 코드의 결과가 나올때까지 대기 ex) 놀이기구
  2. 비동기
    실행된 순서와 관계 없이 결과가 나오는 것 ex) 맛집

블로킹(Blocking) & 논블로킹(Non-blocking)

  1. 블로킹
    코드의 실행이 끝나기 전까지 실행 제어권을 다른 곳에 넘기지 않아 다른 작업을 하지 못하고 대기하는 것
  2. 논블로킹
    코드의 실행이 끝나지 않아도 실행 제어권을 다른 곳에 넘겨 다음 코드가 실행될 수 있는 것

    동기 & 비동기와 차이점
    제어권을 넘기면(논블로킹) 다른 코드도 실행될 수 있으므로 비동기 처리가 가능하지만,
    제어권을 넘기지 않으면(블로킹) 비동기 처리가 가능한 환경이어도 비동기 처리가 불가능

node = 논블로킹 모델

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)

자바스크립트에서 비동기 처리를 동기로 처리할 수 있게 돕는 빌트인 객체 유형

new Promise(executor);

// 예제
new Promise((resolve, reject) => {
	// 명령문
});

인자로 resolve, reject가 주입(둘 중 하나 무조건 호출)

  • promise의 상태
    1) 대기(pending): 이행하거나 거부되지 않은 초기 상태
    2) 이행(fulfilled): 연산이 성공적으로 완료됨
    3) 거부(rejected): 연산이 실패함

Promise.then
promise가 만들어 질 때 executor가 실행되며, executor에서 resolve 함수가 호출되기 전까지 firstPromise.then()안에 있는 코드를 실행하지 않음

const resolvePromise = new Promise((resolve, reject) => {
  setTimeout(() => {
    console.log('First');
    resolve('Resolve!'); // resolve를 실행할 때, 안에 데이터를 넣어줄 수 있습니다.
  }, 1000);
});

resolvePromise.then((data) => {
  console.log('Middle');
  console.log('Last');
  console.log(data);
})

// Print: First -> 1초 뒤에 출력됩니다.
// Middle
// Last
// Resolve!

Promise.catch
Promise 안에서 에러가 throw 되거나 reject가 실행되면 catch 메서드가 작성한 함수가 실행

const errorPromise = new Promise((resolve, reject) => {
  setTimeout(() => {
	  console.log('First');
		reject('Error!!'); // 직접 reject를 실행하면 프로미스에서 에러가 발생한것으로 간주됩니다.
	}, 1000);
});

errorPromise.then(() => {
	console.log('Middle');
	console.log('Last');
}).catch((error) => {
	console.log('에러 발생!', error);
});

// Print: '에러 발생! Error!!'
  • promise.then으로 함수형 프로그래밍 체험

1)

const firstPromise = Promise.resolve('First');

firstPromise.then(console.log);

// Print: 'First'

2)

const countPromise = Promise.resolve(0);

function increment(value) {
	return value + 1;
}

const resultPromise = countPromise.then(increment).then(increment).then(increment);
resultPromise.then(console.log);

// Print: 3

비동기 함수(Async Function)

  1. 비동기 함수의 결과 값은 항상 Promise 객체로 resolve 된다.
// 비동기 + 일반 함수
async function 함수이름() {
	// 명령문
}

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

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

=> 위 세가지 함수 모두 결과 값은 promise로 받는다.

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

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

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

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

함수이름2();
// Print: Promise { '값' }
  1. 비동기 함수 안에서만 await 연산자를 사용할 수 있다.

await 연산자

  1. await 연산자를 사용하면 promise가 fulfill 상태가 되거나 rejected 될 때까지 함수의 실행을 중단하고 기다릴 수 있다.
  2. await 연산자는 async 함수 안에서만 사용할 수 있다.
function setTimeFunc(time) {
	return new Promise((resolve, reject) => {
    	setTimeout(() => {
        	console.log(time, "에 해당하는 시간이 지났습니다.");
            resolve();
        time);
    })
}

async function main() {
	console.log("시작 되었습니다.");
    setTimeoutFunc(1000);
    console.log("종료 되었습니다.");
}
// 시작 되었습니다.
// 종료 되었습니다.
// 1000에 해당하는 시간이 지났습니다.
function setTimeFunc(time) {
	return new Promise((resolve, reject) => {
    	setTimeout(() => {
        	console.log(time, "에 해당하는 시간이 지났습니다.");
            resolve();
        time);
    })
}

async function main() {
	console.log("시작 되었습니다.");
    await setTimeoutFunc(1000);
    console.log("종료 되었습니다.");
}
// 시작 되었습니다.
// 1000에 해당하는 시간이 지났습니다.
// 종료 되었습니다.
profile
개발자가 되는 과정

0개의 댓글