본문 바로가기
사이드 프로젝트/개발몰입과정[2021_SUMMER]

1주차 개념 스터디 - node.js란 무엇인가

by 의정부핵꿀밤 2021. 7. 31.
728x90

1. Node.js란?

- 서버사이드 자바스크립트이며 구글의 자바스크립트 엔진인 V8을 기반으로 구성된 일종의 소프트웨어 시스템

(서버사이드란 네트워크의 한 방식인 클라이언트-서버 구조의 서버 쪽에서 행해지는 처리)

(V8 : 웹 브라우저를 만드는데 기반을 제공하는 오픈 소스 자바스크립트 엔진)

- 이벤트 기반으로 개발이 가능하며 Non-Blocking I/O를 지원하기 때문에 비동기식 프로그래밍이 가능하다.

- 따라서 I/O 부하가 심한 대규모 서비스를 개발하기 적합하며, 자바스크립트의 표준 라이브러리 프로젝트인 CommonJs의 스펙을 따른다

 

2. Node.js의 등장 배경

- JSP나 PHP와 같은 언어로 웹 개발을 하면 이는 아파치같은 웹서버에서 동작하게 된다. 이는 비용, 트래픽, 데이터 동기화 등의 여러가지 문제가 발생한다.

- 하지만 노드는 서버에서 클라이언트로부터의 요청, 즉 연결을 처리하는 방법을 변경하여 위의 문제를 해결한다.

- 기존에는 각 연결에 대해 새로운 쓰레드를 생성하고 그에 따른 메모리를 할당하여 사용자 요청을 처리했지만, Node는 각 연결이 하나의 이벤트로서 노드 엔진에서 처리된다.

 

3. 이벤트 기반 비동기 방식

- 대부분의 어플리케이션은 Blocking I/O를 사용하였고, 이 때문에 멀티 쓰레드를 사용했다. 이는 네트워크에서 동시에 대규모 요청을 동시에 처리하는 데에는 부적절하다.

 

3-1. Blocking I/O

- 하나의 프로세스가 어떤 자원을 사용하고자 할 때 그 자원을 다른 프로세스가 점유하고 있다면, 그 프로세스가 그 자원의 사용을 끝마칠 때까지 기다려야 한다는 것이다.

- 위의 그림처럼 어플리케이션이 커널에 파일 읽기를 요청하면 커널은 요청을 수행하고 그동안 어플리케이션은 기다려야 한다. 이를 Blocked 상태라고 하며 이 시간 동안 실제로 어플리케이션은 아무것도 하지 않는 상태가 된다.

 

3-2. 멀티 쓰레드

- 일반적으로 하나의 프로세스가 하나의 요청에 대해 대응하고 그 일을 처리하게 된다.

- 멀티 쓰레드는 쓰레드 여러개가 동시에 실행되어 요청을 처리한다는 개념이다.

- 이를 사용하면 한꺼번에 여러 개 들어오는 요청으로 인해 발생하는 공유 문제는 해결이 가능하다. 

- 하지만 이는 근복적인 문제인 I/O 요청을 하고 응답이 올 때까지 아무것도 하지 않고 시간을 낭비한다는 것을 해결할 수 없다. 또한 스케줄링을 위한 처리 시간과 문맥 전환 비용이 발생한다.

 

3-3. 싱글 쓰레드와 이벤트 기반의 비동기 I/O 처리

- 노드는 위의 문제드릉ㄹ 싱글 쓰레드와 이벤트 기반의 비동기 I/o 처리로 해결하고 성능을 높일 수 있는 모델을 제공한다.

- 싱글 쓰레드를 가진 노드는 I/O 작업이 시작되면 I/O 작업 처리에 대한 응답을 기다리지 않고, 바로 다음 작업을 실행한다. 그 후 I/O 작업이 종료되면 이벤트를 발생시키고, 이 이벤트는 해당 프로세스의 이벤트 큐에 등록된다. 노드로 개발된 프로세스는 이 이벤트 큐에 등록된 새로운 이벤트를 감지하여 해당 이벤트 시 수행할 작업을 실행하게 된다.

 

3-4. 이벤트 루프

- 이벤트 루프(Event Loop)란 작업을 요청하면서 그 작업이 완료되었을 떄 어떤 작업을 진행할지에 대한 콜백 함수를 지정하여 동작이 완료되었을 때 해당 콜백 함수를 실행되는 방식의 동작 방식이다.

- 만약 클라이언트가 웹 서버에 HTTP 형식으로 요청하게 되면 서버에서는 이벤트 루프가 계속 돌고 있다가 이를 감지하여 알맞은 작업을 워크 쓰레드를 생성해 실행한다. 이 때 이벤트 루프는 해당 워커 쓰레드가 작업을 마친 뒤 그 결과와 함께 응답할 때까지 기다리는게 아니라 바로 루프로 복귀하여 다른 요청을 기다린다.

- 이벤트 루프는 어떤 요청이 발생하면 그 작업에 대해 쓰레드 실행만을 일으키는 것이다. 이 후 작업을 할당받았던 해당 쓰레드가 모든 작업을 마치면 미리 전달받은 콜백 함수를 실행하도록 이벤트 루프로 응답하며, 이벤트 루프는 이를 실행하여 클라이언트에게 결과를 응답한다.

 4. Node.js 의 특징

- 노드는 자바스크립트 기반으로 하고 있어 백엔드도 자바스크립트를 통해 개발할 수 있다. 즉, 프론트와 백이 자바스크립트로 통일이 되어 코드 통합이 쉬워진다.

- 노드는 NPM이라는 설치 관리자를 통해 확장 모듈을 쉽게 설치할 수 있다.

 

 

 

 

출처) https://edu.goorm.io/learn/lecture/557/%ED%95%9C-%EB%88%88%EC%97%90-%EB%81%9D%EB%82%B4%EB%8A%94-node-js/lesson/21764/node-js-%EC%9D%98-%ED%8A%B9%EC%A7%95

728x90

댓글