CS와 Node.js 9. 맛좀 봐라 Emitter! 생산자-소비자 패턴, JS 비동기, Promise, async/await, Event Emitter

박재하·2023년 11월 3일
0

CS와 Node.js

목록 보기
9/12

생산자-소비자 패턴

생산자(Producer) 소비자(Consumer) 패턴

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2023-07-24_%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE_10 16 11

  • 생산자(Producer)-소비자(Consumer) 패턴은 작업 목록을 가운데에 두고 작업을 생산해내는 주체작업을 처리하는 주체를 분리시키는 설계 방법입니다.
  • 각 객체의 부하를 조절할 수 있다는 장점이 있습니다.
  • 그림처럼 Producer는 작업을 큐에 쌓아두고, Consumer는 작업을 가져다 처리합니다.

비동기 처리

  • Event Emitter나 Promise는 실행 방식은 다르지만, 결국 순차적으로 실행되지 않는다는 공통점이 있습니다.
  • 이 공통점은 결국 코드 가독성을 떨어뜨리고, 디버깅이 어렵다는 결론으로 이어지게 됩니다.

Promise, async/await와 EventEmitter의 차이점

Node.js | EventEmitter란? (feat. Promise와의 차이점)

Promise

  • Promise는 비동기 작업이 완료될 때 실행할 콜백 함수를 등록하는 기존의 방식보다 깔끔하게 비공기 작업을 처리할 수 있도록 하는 객체입니다.
  • 비동기 작업을 수행하는 함수가 반환하는 객체로, 성공하면 결과 값을, 실패하면 에러를 반환합니다.
  • 이를 통해 Promise는 비동기의 성공 또는 실패를 쉽고 간결하게 처리할 수 있습니다.
  • 정확히는 3가지 상태가 존재합니다.
    • Pending(대기)
    • Fulfilled(이행)
    • Rejected(실패)

async/await

Promise와 async/await 차이점

  • async/await는 가장 최근에 나온 비동기 처리 문법으로, callback이나 Promise의 단점을 해소하고자 만들어졌습니다.
    • 그 단점은 보통 콜백 지옥, then() 지옥이라고 불리는, 꼬리에 꼬리를 무는 가독성이 나쁜 chain 구조로, 이런 코딩을 방지하기 위함입니다.
  • Promise와의 차이점
    • Promise는 .catch()로 에러 핸들링이 가능하지만, async await은 그것이 불가능해 try-catch()를 사용해야 합니다.
    • 대신 async/await가 가독성이 보통 더 좋다고 평가됩니다.

EventEmitter

  • EventEmitter는 이벤트 기반 프로그래밍에서 사용됩니다. 이벤트 기반은 비동기랑 다릅니다!
  • 이벤트를 발생시키고, 이벤트가 발생했을 때 처리할 콜백 함수를 등록합니다.
  • 이벤트는 이름과 함께 발생하며, 발생한 이벤트를 처리할 수 있는 모든 리스너에게 알립니다.
  • 이를 통해 여러개의 콜백 함수를 동시에 처리할 수 있습니다.

비동기 디버깅

  • 비동기는 동작 방식이 복잡해 디버깅이 까다로우며 특히 쓰레드 처리의 경우 자원 공유(동기화)의 문제 등이 자주 발생합니다.

Debugging asynchronous JavaScript with Chrome DevTools - Chrome Developers

  • 크롬 개발자 도구 등에서 비동기 디버깅을 위한 툴을 제공합니다!

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2023-07-24_%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE_10 48 37

퀴즈

  1. 객체지향 설계
  • 생산자(Producer)-소비자(Consumer) 패턴은 작업 목록을 가운데에 두고 작업을 생산해내는 주체와 작업을 처리하는 주체를 분리시키는 설계 방법이다.
  • 정답 : O

생산자(Producer) 소비자(Consumer) 패턴

  1. 비동기
  • EventEmitter로 생성된 이벤트는 setTimeout(), setInterval()과 같이 Node.js의 libuv 라이브러리에서 시스템 이벤트로 처리된다.
  • 정답 : X (EventEmitter는 libuv에서 처리되는 Event Loop와 관계없는 동기 방식의 api이다.

Nodejs에 대한 잘못된 상식 몇가지

참고 자료

profile
해커 출신 개발자

0개의 댓글