Javascript/Node.js

[Node.js] 개념

Frankie 2021. 7. 20. 22:18

Node.js - Chrome V8 Javascript 엔진으로 빌드된 Javscript 런타임

*런타임 - 특정 언어로 만든 프로그램을 실행할 수 있는 환경

 

즉, 노드를 통해 다양한 자바스크립트 애플리케이션을 실행할 수 있다.

 

- 확장성이 있는 네트워크 어플리케이션 개발에 사용되는 소프트웨어 플랫폼(특히 서버사이드로 많이 사용)

- V8이라는 JavaScript 엔진 위에서 동작하는 자바스크립트 런타임(환경)

- 서버 사이드 스크립트 언어가 아니라 프로그램(환경) -> 서버에서도 사용할 수 있도록 만든 프로그램

- 웹서버와 같이 확장성 있는 네트워크 프로그램을 제작하기 위해 만들어짐.

- Non-blocking I/O와 단일 스레드 이벤트 루프를 통한 높은 처리 성능을 가지고 있는 것이 특징

- 내장 HTTP 서버 라이브러리를 포함하고 있어 웹 서버에서 아파치 등의 별도 소프트웨어 없이 동작하는 것이 가능

 

사용 이유

- JavaScript는 독립적인 언어가 아닌 스크립트 언어이다.

- 스크립트 언어는 웹 브라우저 프로그램 안에서만 동작을 한다.(즉, 웹 브라우저가 없으면 사용할 수 없다)

- Node.js는 JavaScript를 웹 브라우저에서 독립시킨 것으로 Node.js를 설치하면 브라우저 없이 바로 실행할 수 있다.

- 즉, Node.js를 이용하여 서버를 만들 수 있다!

- 중요한 이뉴는 이전까지 Server-Client 웹 사이트를 만들 때, 웹에서 표시되는 부분은 JavaScript를 사용하여 만들어야만 했으면, 서버는 Ruby, Java 등 다른 언어를 써서 만들어야 했는데 마침내 한 가지 언어로 전체 웹 페이지를 만들 수 있게 된 것이다.

 

장점

- 자바스크립트를 동일하게 사용해서 서버단 로직을 처리할 수 있다.

- 이벤트 기반 비동기방식이라서 서버에 무리가 적다.

- 패키지 관리자(npm, yarn)를 통한 다양한 모듈(패키지) 제공

- 작은 모듈을 디자인 -> 이해하고 사용하기 쉽다. 테스트 및 유지보수가 쉽다. 사이즈가 작아 브라우저에서 사용하기 완벽.

 

단점

- 단일 스레드이기 때문에 하나의 작업 자체가 많이 걸리는 웹서비스에는 어울리지 않는다.

- 비동기 처리 로직을 위해 콜백 함수를 연속해서 사용할 때 발생하는 문제인 Call Back Hell에 빠질 수 있다.

- 코드가 수행되어야 코드에 에러가 있는지 알 수 있으며, 에러가 날 경우 프로세스가 내려가기 때문에 테스트가 엄청 중요. 반드시 모든 케이스에 대해 소스코드를 검증해야 한다.

 

이벤트 기반 

- 이벤트가 발생할 때 무엇을 할 지 미리 등록해두고, 이를 이벤트 리스너에 콜백함수로 등록한다.

 

이벤트 루프

- 여러 이벤트가 동시에 발생했을 때 어떤 순서로 콜백함수를 호출할 지를 이벤트 루프가 판단

- 노드는 이벤트가 종료될 때까지 이벤트 처리를 위한 작업을 반복하므로 루프(loof)라고 부른다.

 

Non-blocking I/O

- 이벤트 루프를 잘 활용하면 오래 걸리는 작업을 효율적으로 처리 가능

- 작업에는 동시에 실행할 수 있는 작업, 동시에 실행될 수 없는 작업 두 가지 종류가 있다.

- 특히 파일 시스템 접근, 네트워크를 통한 요청 작업은 입력(Input)/출력(Output)의 일종이며,

- 이러한 작업을 할 때 노드는 비동기 방식으로 블로킹을 만들지 않게끔 처리(논 블로킹)한다.

- 비동기란 이전 작업이 완료될 때까지 대기하지 않고 동시에 작업을 수행하는 것이고,

- 동기란 이전 작업이 끝나야만 다음 작업을 수행하는 것이다. 

- 즉, 요약하면 함수 호출 시 당장 실행하는 것이 아니라(동기->블로킹) 일단 어느 곳에 쌓아 두고 동시에 요청을 처리하고(비동기->논 블로킹) 요청이 완료된 순서대로 처리(스택 이용)한다.

 

싱글 스레드

- JaaScript 코드는 동시에 실행될 수 없는데 그 이유는 노드가 싱글 스레드 기반이기 때문이다.

- 프로세스: 운영체제에서 할당하는 작업의 단위. 노드나 웹 브라우저 같은 프로그램은 개별적인 프로세스. 프로세스 간에는 메모리 등의 자원을 공유하지 않음.

- 스레드: 스레드는 프로세스 내에서 실행되는 흐름의 단위. 프로세스는 여러 개 생성해 여러 작업 동시에 처리 가능. 스레드들은 부모 프로세스의 자원을 공유. 같은 주소의 메모리에 접근 가능하므로 데이터 공유 가능.

 

결론

- Node.js는 싱글 스레드, 논 블로킹 모델을 채용하므로 I/O 요청이 많이 발생하면 Node.js를 서버로 사용하는 것이 좋다.

- 하지만, Node.js는 CPU 부하가 큰 작업에는 적합하지 않다.

- 작성하는 코드는 모두 스레드 하나에서 처리되기 때문에 코드가 CPU 연산을 많이 요구하면 스레드 하나가 혼자서 감당하기 어렵다.

- 즉, 개수는 많지만 크기는 작은 데이터를 실시간으로 주고 받는데 Node.js가 적합하다. 예를 들어, 네트워크나 데이터베이스, 디스크 작업 같은 I/O에 특화되어 있다. ex) 실시간 채팅 애플리케이션, 주식 차트 등

- 결론적으로 노드의 장점은

  - 멀티 스레드 방식에 비해 적은 컴퓨터 자원을 사용한다.

  - I/O 작업이 많은 서버로 적합.

  - 웹 서버가 내장되어 있어 별도의 웹서버를 설치할 필요가 없다.

  - 자바스크립트를 사용하기 때문에 JSON 형식과 쉽게 호환

 

Express

- Node.js의 프레임워크.

* 프레임워크 - 어떠한 작업을 쉽게 완성하기 위한 라이브러리의 집합

- 작업을 시작부터 끝까지 라이브러리로 지원한다는 점이 단순한 라이브러리와 차이가 나는 부분.

- Node.js를 이용하여 웹 애플리케이션을 만들기 위한 틀을 제공하는 라이브러리의 집합.

'Javascript > Node.js' 카테고리의 다른 글

[Objection.js] Eager Loading Method  (0) 2021.09.09
옵셔널 체이닝 - '?.'  (0) 2021.09.02
[Node.js] 자바스크립트 런타임  (0) 2021.07.19
[JavaScript] 자바스크립트  (0) 2021.07.19
Postman  (0) 2021.04.16