JavaScript란 뭘까?
JavaScript는 브라우저 전용 프로그래밍 언어이다. 브라우저는 우리가 사용하는 인터넷 소프트웨어를 말한다.
ex ) Ms Edge, google Chrome, Mozila Firefox.. etc
즉, 인터넷 서비스 위에서만 작동을 하는 프로그래밍 언어라고 할 수 있다.
예를 들어 JS로 작성한 파일을 임베디드 프로그래밍을 위한 보드 ( PCB, FPGA ) 에 입힌다고 가정하자.
보드 개발을 위해 열심히 회로도 그리고 ( 트랜지스터, MCU, 저항 같은 소자들을 어떤 식으로 배치하고 연결할 것인지 구상 뜨는 것 ) PCB 아트웍을 거친 후 PCB 외주 제작을 완료해서 받아온 보드에 JS로 작성한 파일을 업로드하면 보드는 어떻게 될까?
( 보드 개발을 위해서는 보통 VHDL 혹은 C를 이용한다 )
생각만 해도 아찔하다.
이렇듯 JavaScript는 웹을 통해 데이터를 주고 받을 때 사용한다.
그렇다면 JS는 어떤 엔진을 사용할까?
우리는 컴퓨터가 데이터를 입력받았을 때 기계어만 인식할 수 있음을 알고 있다.
즉, 우리가 타인의 컴퓨터로 JS 파일을 전송하거나 아니면 전송받았을 때 그 파일을 컴퓨터가 해석할 수 있게끔 컴파일 ( 고급언어를 기계어로 변환해주는 ) 해주는 엔진이 무엇일까?
답은 V8 엔진이다.
V8 엔진은 구글의 크롬에서 지원한다.
요약하면 JavaScript는 V8 엔진을 이용하여 브라우저 환경에서 실행되는 프로그래밍 언어라고 할 수 있다.
( HTML, CSS와 함께 사용된다. JS는 웹 페이지의 구매하기, 카트에 담기 등의 기능을 동작시키고 HTML은 기본 구조, CSS는 구조에 스타일링을 입힌다 )


위의 사진은 JavaScript를 처리하는 브라우저 작동방식이다.
요청 받은 데이터가 들어오면 바로 처리할 수 있는 데이터는 힙 또는 스택에서 바로 처리하지만 Setimeout 같이 일정 시간을 기다려야 하는 작업이라면 WEB API에 던져놓고 다른 작업을 진행한다.
Setimeout의 요청된 시간이 지나면 WEB Api에서 QUEUE로 이동시켜 다른 스택이 모두 처리되어 스택이 빌 때까지 대기한 후 옮겨서 처리한다.
Node.js 는 뭐야?
기존의 JS가 브라우저 환경에서만 사용가능했다면 브라우저 밖에서도 JS를 사용할 수 있게 만들어준 라이브러리이다. 즉, html 파일, 혹은 다른 JS 파일에만 접근 가능했었다면 mysql 같은 DB, 로컬 파일 ( ex ---- .txt 파일 ) 도 접근이 가능하게 된 것이다.
Node.js는 Chrome의 V8엔진을 이용하여 javascript로 브라우저가 아니라 서버를 구축하고, 서버에서 JavaScript가 작동되도록 해주는 런타임 환경(플랫폼)이다.
JavaScript를 쓰면 브라우저에 종속적인데, Node.js를 쓰게 되면 컴퓨터 내부에 있는 File System등 System Call도 가능해진다.
이러한 부분을 Node.js는 libuv를 통해 처리한다.
특징으로는 다음과 같이 3가지가 있다
Event Driven
이벤트 기반(event-driven)이란 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 의미합니다. 즉, 이벤트 기반 시스템에서는 특정 이벤트가 발생할 때 무엇을 할지 미리 등록해두고, 이를 이벤트 리스너에 콜백 함수를 등록 합니다. 이후 이벤트가 발생하면 리스너에 등록해둔 콜백 함수를 호출하며 이벤트가 끝난 후 노드는 다음 이벤트가 발생할 때까지 대기합니다.
이벤트 루프는 가능하다면 언제나 시스템 커널에 작업을 떠넘겨서 Node.js가 논블로킹 I/O 작업을 수행하기 용이하게 만들어줍니다
Single Thread
자바스크립트 코드는 여러 개가 동시에 실행될 수 없는데 그 이유는 노드가 싱글 스레드 기반이기 때문입니다.
프로세스 : 운영체제에서 할당하는 작업의 단위입니다. 노드나 웹 브라우저 같은 프로그램은 개별적인 프로세스입니다. 프로세스 간에는 메모리 등의 자원을 공유하지 않습니다.
스레드 : 스레드는 프로세스 내에서 실행되는 흐름의 단위입니다. 프로세스는 스레드를 여러 개 생성해 여러 작업을 동시에 처리할 수 있습니다. 스레드들은 부모 프로세스의 자원을 공유합니다. 같은 주소의 메모리에 접근 가능하므로 데이터를 공유할 수 있습니다.
노드는 싱글스레드, 논 블로킹 모델로, 싱글 스레드가 혼자서 일을 처리하지만 들어온 요청 순서가 아닌 논블로킹 방식으로 이전 작업이 완료될 때까지 대기하지 않고 다음 작업을 수행합니다.
** 주의할 점은 Event Loop는 싱글스레드이지만 Node.js의 IO콜을 처리하는 하부 구조는 멀티쓰레드입니다. 그래서 꼭 단일 스레드라고만 하기에는 애매하다고 생각됩니다

링크텍스트 --- 참고 자료
링크텍스트 --- 참고 자료 2
링크텍스트 --- 참고자료 3
파일 시스템 접근, 네트워크를 통한 요청 작업은 I/O의 일종이며 이러한 작업을 할 때 노드는 논 브로킹 방식으로 처리합니다. 논 블로킹이란 이전 작업이 완료될 때까지 대기하지 않고 다음 작업을 수행하는 것을 의미합니다. 반대로 블로킹은 이전 작업이 끝나야만 다음 작업을 수행합니다.
blocking은 동기 방식, Non-blocking은 비동기 방식을 의미합니다.

적합한 곳:
간단한 로직(알림 등)
대용량(동시에 여러 request를 처리)
빠른 응답시간 요구(알림, 실시간 대화 등)
빠른 개발을 요구
비동기방식에 어울리는 서비스(네트워크 스트리밍 서비스, 채팅 서비스 등)
단일 처리가 오래 걸리는 경우 -> 싱글 쓰레드이기 때문
서버 체크로직이 많은 경우 -> 비동기방식이기 때문에 CallBack Hell에 빠지지 않기 위해
업무 복잡도/난이도가 높은 경우 -> 에러가 나면 서버가 죽기 때문에 코드 품질 중요
**복잡한 데이터 처리를 하기 위한 목적으로는 Django가 더 적합함
Express란? ( Node.js express )
프레임워크와 라이브러리는 무슨 차이인가? 사실 말장난 같은 느낌이 있다. 두 요소 다 개발자들이 보다 편리한 개발을 위해 제공되는 기능들인데 약간의 차이가 있다고 한다.
차이는 프레임워크는 사용시 지켜야 하는 규약들이 있고 라이브러리는 사용자가 자유롭게 이용할 수 있다.
예를 들어보자.
Express는 프레임워크이기 때문에 지켜야 하는 조건들이 있다

사진에 나와있듯 미들웨어 함수를 로드하려면 app.use()를 호출해야 한다. 그리고 로드되는 변수에 next()가 없다면 함수 호출이 끝나면 다음 함수 호출이 일어나지 않기 때문에 next()를 작성해줘야 한다.
Express가 라이브러리가 되기 위해서는 next()라는 함수 기입 없이도 자유롭게 위의 구문들이 순차적으로 호출되어 실행되었어야 할 것이다. 어떤 사용 규칙이 있는 것, 그것이 FrameWork이다.
다음은 대표적인 라이브러리인 제이쿼리를 살펴보자

이것 외에도 다양한 메서드들이 존재하는데 사용자는 규칙 같은 것을 준수할 필요 없이 각자의 취향에 맞게 필요한 메서드들을 선택해서 사용할 수 있다.
즉, 컴포넌트나 모듈처럼 분리되어 사용할 수 있다면 라이브러리라고 할 수 있다.
아무튼 돌아와서 Express는 미들웨어를 특징으로 갖는 확장 기능이고 Node.js의 내장 메서드인 http를 활용한 코드 작성을 보다 적고 단순화시킬 수 있다.
Express에 대한 자세한 설명은 작성해논 아래 포스트를 참고하면 되겠다