노드란 무엇인지, 어떤 특징을 갖고 있는지 왜 사용하는지 알아봅시다!
Node.js는 Chrome V8 JavaScript 엔진으로 빌드 된 JavaScript 런타임입니다.
JavaScript를 서버에서도 사용할 수 있도록 만든 프로그램
구글 V8 자바스크립트 엔진으로 빌드된 자바스크립트 런타임 환경
런타임 : 특정 언어로 만든 프로그램을 실행할 수 있는 환경
서버사이트 스크립트 언어가 아님!!!!!
Node.js는 브라우저의 자바스크립트 엔진에서만 동작하던 자바스크립트를
브라우저 이외의 환경에서도 동작할 수 있도록 자바스크립트 엔진을 브라우저에서 독립시킨 자바스크립트 실행 환경
V8과 더불어 libuv라는 라이브러리를 사용
V8과 libuy는 C와 C++로 구현되어 있다.
libuv 라이브러리는 노드의 특성인 이벤트 기반, 논 블로킹 I/O 모델을 구현하고 있다.
Non-blocking I/O와 단일 스레드 이벤트 루프를 통한 높은 Request 처리 성능을 갖고 있다.
모든 API가 비동기 방식으로 동작
단일 스레드 이벤트 루프 모델을 사용함으로써 보다 가벼운 환경에서도 높은 요청 처리 성능을 보여줌
데이터를 실시간 처리하는 SPA에 적합
단, CPU 사용률이 높은 어플리케이션에는 권장하지 않음
Socket.io라는 실시간 통신 라이브러리를 사용하여 대량의 데이터 처리와 실시간 통신 모두 구현 가능
JavaScript는 C/C++, Java 와 같은 프로그래밍 언어지만 독립적인 언어가 아닌 스크립트 언어이다.
스크립트 언어는 특정한 프로그램 안에서 동작하기 때문에 웹 브라우저 프로그램 안에서만 동작함
node.js를 설치하게 되면 터미널프로그램에서 node.js를 입력해 브라우저 없이 바로 실행할 수 있다. => 자바스크립트 실행기
이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식. (클릭이나 네트워크 요청 등이 이벤트에 해당)
이벤트 기반 시스템에서는 특정 이벤트가 발생할 때 무엇을 할지 미리 등록하는데, 이것을 이벤트 리스너에 콜백 함수를 등록한다고 표현함.
여러 이벤트가 동시에 발생했을 때 어떤 순서로 콜백함수를 호출할 지 이벤트 루프가 판단함.
이벤트가 종료될 때까지 이벤트 처리를 위한 작업을 반복해 루프라고 부름.
논 블로킹으로 수행하기 위해서는 모두 동시에 처리될 수 있는 작업이어야 한다.
이벤트 루프를 활용하면 작업 시간이 긴 것도 효율적으로 처리가 가능하다.
기본적으로 JavaScript상에서 돌아가는 것은 동시에 실행될 수 없지만 I/O 작업은 동시에 처리 가능하다.
싱글 스레드란 스레드가 하나뿐이라는 것.
프로세스는 스레드를 여러개 생성해 여러 작업을 동시에 처리할 수 있다.
프로세스 : 운영체제에서 할당하는 작업 단위
노드 or 웹 브라우저 같은 프로그램은 개별적인 프로세스.
프로세스 간에는 메모리 등의 자원을 공유하지 않음.
스레드 : 프로세스 내에서 실행되는 흐름의 단위
(작업을 처리하는 일손으로 보면 됨)
스레드는 부모 프로세스의 자원을 공유하고 같은 주소의 메모리에 접근이 가능! = 데이터를 공유할 수 있다.
노드를 실행하면 프로세스가 하나 생성되고, 그 프로세스에서 스레드를 생성할 때 내부적으로는 스레드를 여러개 생성함.
하지만 직접 제어가 가능한 것은 스레드 한 개라서 노드를 싱글 스레드라고 하는 것!
하나의 스레드만 제어가 가능하므로 많은 요청이 오면 하나씩 처리하고
논 블로킹 방식을 이용하여 대기 시간을 줄이는 것이다!
블로킹이 심하게 일어나는 작업이 아니면 스레드 하나로도 충분함.
블로킹이 발생할 것 같은 경우에는 논블로킹 방법으로 대기 시간을 최대한 줄임.
기본적으로 싱글 스레드, 논 블로킹 모델을 채용하므로 I/O 요청이 많이 발생하면 노드를 서버로 사용하는 것이 좋고, CPU 부하가 큰 작업에는 적합하지 않다.
(작성한 코드가 모두 스레드 하나에서 처리되기 때문)
개수가 많고 크기가 작은 데이터를 실시간으로 주고받는데 적합함!
네트워크, 데이터베이스, 디스크 작업 같은 I/O 에 특화되어 있다.
(실시간 채팅 애플리케이션, 주식 차트)
node.js를 이용해 웹 애플리케이션을 만들기 위한 틀(Frame)을 제공하는 라이브러리의 집합(프레임워크)이다.
프레임워크 : 어떤 작업을 쉽게 완성하기 위한 라이브러리의 집합. 개발에 바탕이 되는 템플릿 및 클래스와 인터페이스의 집합체.
파이썬의 Django, 자바의 spring처럼 JS의 웹 프레임워크이다.
어플리케이션을 구성하는 개별적 요소
CommonJS는 브라우저뿐만 아니라 서버사이드 어플리케이션이나 데스크톱 어플리케이션에서도 사용하려고 조직한 자발적 워킹 그룹이다.
node.js는 100% 동일하지는 않지만 기본적으로 CommonJS 방식을 따름.
require, import
(routes : 어떤 경로에 따른 http 메서드에 따라 어떤 컨트롤러 코드를 실행할지 정의 )
기본개념, 모듈, npm
https://velog.io/@hanblueblue/Node.js-Basic
express
https://velog.io/@riceintheramen/express%EA%B0%80-%EB%AD%90%EC%98%88%EC%9A%94
node.js 교과서