node JS - 동기&비동기 + express

Jaa-van·2023년 4월 24일
0
post-thumbnail

Node.js 란

chrome V8 javascript 엔진으로 빌드 된 javascript 런타임이다

javascript 를 브라우저가 아닌 환경에서 사용할 수 있게 해주는 것이다

특징

  1. 논 블로킹 I/O

=> 함수가 실행되는 중에도 다른 작업을 동시에 진행할 수 있다
비동기 작업을 효율적으로 할 수 있는 특성이다

  1. 싱글 스레드

=> 스레드를 하나밖에 사용할 수 없다
연산 시간이 늘어나게 될 수 있지만, 병렬 프로그래밍이나 멀티 프로세싱에 대해 고민하지 않아도 된다는 장점도 있다

  1. 이벤트 루프

=> 싱글 스레드의 약점을 극복하기 위해서 효율적으로 작업을 처리할 수 있는 특성이다

REPL 환경

입력 받은 코드를 읽어 메모리에 저장하고 평가된 값을 바로 출력하는 환경이다

입력한 코드의 결과값을 바로 확인할 수 있다
( VS 코드에서 터미널에서 node 파일명 을 입력하면 결과가 바로 나오는 것이 REPL 이다)

동기 & 비동기

동기로 실행된다 -> 먼저 실행된 코드의 결과가 나올때까지 대기하는 것

비동기로 실행된다 -> 실행된 순서와 관계 없이 결과가 나오는

Blocking Model & Non- Blocking Model

  • Blocking Model
    코드의 실행이 끝나기 전까지 실행 제어권을 다른곳에 넘기지 않아 다른 작업이 되지 않는다
    => 제어권을 넘기지 않아 비동기 처리가 가능한 환경이어도 ~비동기 처리가 불가능하다~

  • Non-Blocking Model
    코드의 실행이 끝나지 않아도 실행 제어권을 다른곳에 넘겨 다음 코드가 실행된다
    => 제어권을 넘겨 다른 코드가 실행이 가능하기 때문에 ~비동기 처리~가 가능하다

JavaScript는 각 명령들이 순서대로 진행될 수 있게 구현되어 있지만,
~Non-Blocking Model 을 통해서 비동기적으로 처리가 된다~

async function main() {
function first() {
console.log("set Time Out 이 실행되었습니다");
}

console.log("코드가 실행되었습니다");
setTimeout(first, 1000); // 1초 뒤에 first 함수를 실행한다
console.log("코드가 종료되었습니다");
}

main();

Blocking Model 이라면
// 코드가 실행되었습니다
1초후
// set Time Out 이 실행되었습니다
// 코드가 종료되었습니다

가 되겠지만, Non-Blocking Model 이기 때문에 set Time out 이 실행되지 않아도 다음의 코드가 실행되게 되어

//코드가 실행되었습니다
// 코드가 종료되었습니다
1초후
// set Time Out 이 실행되었습니다

가 나오게 된다

Promise(프로미스)

JS에서 비동기 처리를 동기 처리로 할 수 있게 해주는 객체 유형

( 생성자 함수를 통해서 생성해준다 ) - 객체의 속성이기 때문에
new Promise(executor)

new Promise((resolve, reject) => {

}

(executor) 는 promise 가 만들어질 때 자동으로 실행되는 함수이고
무조건 resolve, reject 중 하나를 호출해야 한다

=> 성공적으로 실행이 되었다면 resolve 를,
실패라면 reject 를 실행한다

@Promise 의 상태
1. 대기(Pending) => 이행하거나 거부되지 않은 초기 상태
2. 이행(Fullfilled) => 연산이 성공적으로 완료됨
3. 거부(Rejected) => 연산이 실패함

@Promise.then
=> executor 가 resolve 함수를 호출할 경우에 실행되는 메서드

=> then 함수를 호출하는 시점에서는 resolve 가 호출되었기 때문에 Fullfilled Promise 가 된다

@Promise.catch
=> executor 가 reject 함수를 호출할 경우에 실행되는 메서드

%함수형 프로그래밍

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

firstPromise.then(console.log);
// 'First'

'First'의 값을 then 의 value 로 전달하게 되는데 일반적으로 사용하는 console.log() 가 아닌 ()를 빼서 바로 console.log 함수에 바로 전달할 수 있다

비동기 함수(async function )

  1. 비동기 함수의 결과 값은 항상 Promise 객체로 resolve 된다
  2. 비동기 함수 안에서만 await 연산자를 사용할 수 있다
    -> 이 두가지 특징을 제외하면 보통 함수와 같다

=> 비동기 함수는 언제 사용하는가?

  • await 연산자를 사용하면 문법이 훨씬 간결해진다
  • 데이터 베이스에서 데이터를 가져오는 것을 간결하게 관리할 수 있다
  • 코드를 원하는 순서로 작동하도록 만들어준다

await

await 연산자를 활용하면 fullfill 상태가 되거나 rejected 가 될 때까지 함수의 실행을 중단하고 기다릴 수 있다

=> promise 연산이 끝나면 함수에서 반환한 값을 얻을 수 있다

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

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

main();

의 결과는 일반적인 비동기 함수의 경우에는
// 시작 되었습니다
// 종료 되엇습니다
1초후
// 1000에 해당하는 시간이 지났습니다
가 나오게 된다
여기서

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

setTimeoutFunc 에 await 연산자를 사용하게 되면 setTimeoutFunc 가 resolve, or reject 함수를 반환하기 전까지 대기를 하게 되기 때문에

// 시작 되었습니다
1초후
// 1000에 해당하는 시간이 지났습니다
// 종료 되엇습니다

가 나오게 된다

Express.js

node.js 로 서버를 빠르고 간편하게 만들 수 있게 도와주는 웹 프레임 워크

node.js 에서 가장 많이 사용하는 프레임워크 이다
( nest.js 도 각광받고 있다 )

express.js 는 웹서버 자체가 아닌 웹 서버를 구현하기 위한 웹 프레임워크 이다

API Client

개발 단계에서 우리가 작성한 api 요청을 확인하거나 테스팅 할 때 도움을 주는 툴

굳이 프론트엔드와 연결하지 않아도 api client 를 통해 테스트를 진행하면서 코딩을 할 수 있다

thunder client 를 이용할 것이다

0개의 댓글

관련 채용 정보