[DAY21] Node.js 복습

m1njae·2022년 1월 23일
0

22 Basic Challenge

목록 보기
21/25
post-thumbnail

DAY21과 DAY22는 여태까지 공부했던 것에 대한 복습을 하는 미션이다. 오늘은 Node.js 관련해서 복습을 할 예정이다. DAY1에서 Node.js의 개념에 대해서 기록했었다. 그러나 막 시작하는 단계였던 터라 개념 정리를 해도 온전히 이해하지 못한 것이 대부분이었다. 20일동안 공부를 진행하면서 분명 이해하지 못했던 부분을 이제는 알게 되지 않았을까라는 생각을 가지고 복습을 시작하였다.

Node.js의 특징

Blocking I/O vs Non-Blocking I/O

  • Blocking I/O
    스레드(Thread)가 시스템 콜이 들어오면 입출력(I/O) 처리를 위해 기다리는 것을 말한다. I/O 작업이 완료되기 전에는 다른 작업을 수행하지 못한다.
  • NON-Blocking I/O
    시스템 콜이 들어오면, 입출력(I/O) 작업의 완료 여부와는 무관하게 즉시 응답을 해준다. I/O 가 완료 되기 전에도 다른 작업을 할 수 있다.

싱글 스레드 vs 멀티 스레드

  • 싱글 스레드
    하나의 프로세스에서 하나의 스레드 실행한다.

  • 멀티 스레드
    프로그램을 다수의 실행 단위로 나누어 실행한다.

이벤트 루프

이벤트 루프(Event Loop)는 작업을 요청하면서 그 작업이 완료되었을 때 어떤 작업을 진행할지에 대한 콜백 함수를 지정한다. 그리고 동작이 완료되었을 때 해당 콜백 함수를 실행되는 방식을 말한다. 이벤트 루프는 요청이 발생하면 그 작업에 대해 스레드 실행만을 일으킨다. 이후 작업을 할당받았던 스레드가 모든 작업을 마치면 미리 전달받은 콜백 함수를 실행하도록 이벤트 루프로 응답하게 되며 이벤트 루프는 이것을 실행하여 결과를 출력해준다.

정리

서버를 스레드 기반의 Blocking I/O 방식으로 구현한다고 하자. Blocking I/O는 I/O 작업이 진행되는동안 유저 프로세스는 자신의 작업을 중단한 채 대기해야 한다. 하지만 I/0 작업은 CPU를 거의 사용하지 않기 때문에 리소스 낭비가 심하다. 이러한 문제를 해결해줄 수 있는 것이 멀티 스레드이다. 멀티 스레드를 활용하면서 CPU의 활용성을 증가시키고, 사용자의 응답성을 향상시킬 수 있다.

그러나, Blocking I/O는 결국 I/O 을 하고 응답이 올 때까지 시간을 낭비한다는 문제가 존재한다. 뿐만 아니라, 스레드가 많아질수록
CPU의 컨텍스트 스위칭 횟수가 증가한다. 이때 사용되는 컨텍스트 스위칭 비용 때문에, 실제 작업하는 양에 비하여 훨씬 비효율적으로 동작하게 된다.

Node.js는 이러한 문제를 싱글 스레드이벤트 기반의 비동기식 처리로 해결해준다. Node.jsnon-blokcing I/O를 지원하기 때문에 비동기식 프로그래밍이 가능한 것이다. 작업이 시작되면 응답을 기다리지 않고 다음 작업을 실행한다. 대신 I/O 작업이 종료되면 이벤트를 발생시키고 이 이벤트는 프로세스의 이벤트 큐(Queue)에 등록하게 된다. 노드로 개발된 프로세스는 이 이벤트 큐에 등록된 새로운 이벤트를 감지하여, 해당 이벤트 시 수행하여야 할 작업을 실행하게 된다.

느낀 점

간단하게 아직 내가 이해할 수 있는 선에서 정리해보았다. 결국 Node.js의 특징 때문에 대용량의 적은 데이터 요청을 처리하는, 빠른 응답시간을 요구하는 프로젝트에 왜 Node.js가 활용되는지 감이 잡히게 되었다.

첨언을 하자면 Node.js가 싱글 스레드를 활용하기 때문에 복잡한 로직을 사용하기에는 어려워보이고, 스레드 자체에 문제가 발생할 시 프로그램 자체가 무너질 것 같다는 생각도 들었다.

각 서버 환경마다 주어진 장단점이 있으니, 그런 부분들을 알고 하고자 하는 프로젝트에 적절히 활용하는 것이 중요한 것 같다.

profile
할 수 있는 것부터 차근차근, 항해자의 공부 기록공간

0개의 댓글