[엘리스] TIL #14

nerry·2022년 5월 3일
0
post-thumbnail

Node.js

web 2.0으로의 발전으로 복잡한 JS가 되었고 이를 실행하는 엔진이 따로 필요

→ V8 엔진 등장

→ 자바스크립트를 브라우저 외부에서 사용하고 싶어 탄생

⭐️ 자바스크립트를 어느 환경에서나 실행할 수 있게 해주는 실행기이다.

vs 브라우저

  • 크로스 플랫폼에서 실행
  • 웹 내부 제한을 넘어 제한 없는 동작이 가능함
  • 다양한 어플리케이션 개발이 가능해져 모든 개발자의 언어가 됐다. 웹서비스부터 ios, android 동시 개발, 딥러닝까지 가능해짐

특징

싱글 스레드 - 비동기 - 이벤트 기반

싱글 스레드

스레드는 명령을 실행하는 단위로

싱글 스레드는 한 개의 스레드는 한 번에 한 가지 동작만 실행 가능

  • 장점 : 스레드 생성 비용이 없고, 리소스 관리에 효율적이다.
  • 단점 : 작업 효율이 떨어진다.

→ 그래서 Node.js 는 비동기 동작으로 스레드 기반의 작업을 최소화한다.

비동기

동작을 실행한 뒤 기다리지 않는 방식

동작 완료를 기다리지 않고 바로 다른 동작을 실행할 수 있음

→ Node.js 는 싱글스레드라 비동기 방식을 사용한다.

⚡️ 동기 vs 비동기

멀티스레드 동기 방식

  • 한번에 여러 개의 실행을 동시에 시작할 수 있음
  • 다만, 완료까지 기다려야 하기에 CPU 리소스가 낭비 된다.

싱글 스레드 비동기 방식

  • 한번에 여러 동작을 시작하지는 못함
  • 하지만 완료를 기다리지 않으므로 리소스가 낭비되지 않는다.

이벤트 기반

비동기 동작의 완료를 처리하는 방법

  • 동작을 실행하한 후 기다리지 않고 신경쓰지 않음
  • 그래서 완료될 경우 실행할 함수를 미리 등록!

→ “이벤트를 등록한다.”

Node.js는 싱글 스레드이기에 비동기 동작이 필요하고 이를 구현하기 위해 이벤트 기반으로 움직인다.

ES6

ECMAScript 버전 6을 통틀어 ES6이라고 부른다.

계속해서 발전 하는 JS의 표준 문법

→ 생산성 향상, 코드 간결!

하지만 Node.js에서는 모든 문법을 지원하지 않는다.

  1. let,const → 상수와 변수 구분 가능

  2. Template String → ${}

  3. Arrow Function → 변수에 할당 가능, const 에 할당하여 재선언 막을 수 있음

  4. class

    class Animal {
        constructor(name, sound) {
            /* constructor 완성하기 */
            this.name = name
            this.sound = sound
        }
        
        explain() {
            console.log(`${this.name} says ${this.sound}`)
        }
    }
    
    // "duck", "quack"
    const duck = new Animal("duck","quack");

    → 생성자 안에서 변수를 할당하면 내부 변수 생성된다.

  5. destructing → 변수에 객체나 배열을 하나씩 뽑아낼 수 있다.

    const duck = {
        name: "duck",
        sound: "quack",
    };
    const { sound, name } = duck // 순서가 틀려도 된다.
    const arr = ["good","bad"]
    const [ first, second ] = arr
  6. promsie / async-await → 비동기

비동기 코딩

세가지 방법이 있다.

  1. Callback
    • 비동기 동작을 수행
    • 이벤트 등록 / 실행 → 콜백함수를 등록 비동기 동작이 완료되면 등록됐던 콜백함수를 실행한다.
    • 매개변수로 에러와 결과를 받는다
    • 문제 : 순차적인 비동기로 짜면 콜백 지옥
  2. Promise
    • 완료시 then을 수행하고, 에러가 있다면 catch를 수행한다.
    • 같은 레벨로 비동기 동작을 동기적으로 실행할 수 있다.
    • then chaining이 가능해서 간결해진다.
    • arrow function을 통해 return과 매개변수의 ()을 생략할 수 있다.
    • Callback 기반 함수를 Promise 함수로 변경 하기
      function name(params){
      	return new Promise(resolve,reject)=>{
      		oldone(params,(err,users)=>{
      			if(err){
      				reject(err)
      				return
      			}
      			resolve(users)
      		}
      	}
      }
    • 문제 : 프로미스 지옥
  3. Async - Await
    • 순차적이지 않았던 것을 순차적으로 만든다.
    • async function ~const r1 = await promise();
    • await한 함수는 내부적으로 promise로 구성돼있다.
    • await한 것은 완료가 될 때까지 다음 라인으로 넘어가지 않는다.
    • 순차적 프로그래밍이 가능해진다.
    • 오류처리는 try - catch로 한다.
    • await Promise.all([~,~]) 로 Promise의 병렬 실행이 가능하다! → 동시에 실행 가능한 비동기 동작들을 병렬로 처리하는 것으로 효율성을 높임

→ 가독성이 좋은 async-awaitd을 지향하지만 특정 상황에 맞는 비동기 방법들을 구사할 줄 알아야함

이벤트 루프

이벤트를 처리하는 반복되는 동작

비동기 코딩이 어떤 순서로 수행되는지 이해할 수 있다.

비동기 동작의 실행 타이밍을 알아두자

구성요소

  1. Call Stack

    작성된 함수들이 등록되는 LIFO 스택

    이벤트 루프는 콜스택이 빌 때까지 스택의 함수를 실행한다.

  2. Message Queue

    setTimeout 같은 지연 실행 함수를 등록하는 FIFO 큐

    콜스택이 비어있을 경우 등록된 함수를 콜스택에 추가

  3. Job Queue

    Promise에 등록된 콜백을 등록해두는 FIFO 큐

    상위함수가 종료되기 전에 등록된 함수를 콜스택에 추가

profile
터벅터벅 개발(은좋은)자 로그

0개의 댓글

관련 채용 정보