Node.js는 Chrome V8 JavaScript 엔진으로 빌드된 JavaScript런타입(특정언어로 만든 프로그램을 실행할 수 있는 환경을 뜻한다.)이다. 기존 환경에서는 js를 인터넷 브라우저 위에서만 해석이 가능했지만 V8엔진의 등장으로 다른 환경에서도 JS를 사용할 수 있게 되었다.
I/O처리에 있어서 성능과 서버 확장의 용이성 무엇보다 js라는 프론트엔드 필수 언어로 백엔드까지 작성할 수 있다는 이점으로 점유율이 점점 높아져 가고 있다고 한다.

최신 버전은 20.8.1 이지만 기능이 불안정하거나 일부 모듈(패키지)이 작동하지 않을 수 있기 때문에 안정성을 보장받고 싶으면 LTS버전 사용을 권장한다.

console.log("Start");
setTimeout(() => console.log("3초후 실행!"), 3000);
console.log("END")
blocking 방식이면 이전 작업이 종료가 되기까지 기다려야 해서 Start, 3초후 실행, END순으로 출력이 되어야 한다. 그러나 node.js는 Non-Blocking 방식이어서
-START
-END
-3초 후 실행이 입력된다.
--이 출력을 설명하자면, 클라이언트가 웹 서버에 HTTP요청을 하게되면 서버에서 이벤트 루프가 돌고 있다가 요청을 감지하고 알맞은 작업을(워커 스레드)를 생성하여 실행한다. . 이때 이벤트 루프는 해당 워커 스레드가 작업을 마친뒤 그 결과와 함께 응답할 때 까지 기다리는게 아닌 바로 루프로 복귀하여 다른 요청을 기다리게 된다.
--즉 이벤트 루프는 어떤 요청이 발생하면 그 작업에 대해 스레드 실행만을 일으킵니다. 이후 작업을 할당 받았던 해당 스레드가 모든 작업을 마치면, 이리 전달 받은 콜백함수를 실행하여 이벹느 루프로 응답, 이벤트 루프가 이를 실행하여 클라이어튼에게 결과를 보냅니다.
--Node.js로 개발된 프로세스는 이벤트 큐에 등록된 새로운 이벤트를 탐지합니다.
--동시에 request가 오더라도 처리가 완료될 때 까지 기다리지 않아도 되기에 서버 부하가 적습니다.
Node.js의 Tread Pool
node.js는 애플리케이션 자체는 단일 스레드로 실행하지만, Background에서 스레드 풀을 구성해 작업을 수행합니다. thread pool을 관리하는 것은 개발자가 아닌 플랫폼 이 합니다.
개발자는 스레드 하나를 관리하듯 프로그래밍하면 플랫폼이 여러 스레드를 효율적으로 운용합니다.
앞에서 설명한것과 같이 js 엔진은 비동기 처리를 할 수 없습니다.
비동기로 처리해야 하는 코드를 만날 경우 libuv 라이브러리를 통해 이벤트를 기반으로 비동기 처리를 한다.
이벤트 발생시 미리 지정해둔 작업을 수행하는 방식으로 처리되는데 이는 다르게 표현하면 이벤트 리스너에 콜백 함 수를 등록한다고 표현하기도 한다.
--코드가 실행되는 내부 과정을 보여준다.



-호출 스택에 들어간 순서와 반대로 실행되기 때문에 setTimeout()이 먼저 실행되고 타이머와 함께 run콜백을 백그라운데 잠시 이동된다. 이후 setTimeout, anonymous순으로 호출 스택에서 빠져나오고 3초후 run 함수를 태스크 큐로 보낸다. 호출 스택이 비면 태스크 큐에서 함술르 가져와 호출 스택에 넣고 실행하고 이벤트 루프는 태스크 큐에 콜백 함수가 돌아올 때까지 계속 대기한다.
복습을 하면서 보니 이해가 잘 되었다고 보기 어려웠다. node의 장점이 간단한 로직, 입출력이 많은 서비스에 좋고, 빠른 응답시간 요구를 하는 곳에 좋다고 하지만, js 코도가 싱글 스레드로 실행을 하는데 java처럼 멀티스레드가 가능하지 않으면 성능면에서 떨어지는게 아닌가 고민된다. 결구 성능을 계산하고 최적화에 대해 고민하는 단계에 가보면 더 깊이 있는 공부가 되지 않을까 싶다...아직은 뭐가 정확하게 돌아가는지 이해가 되지는 않지만 계속 깊이 있게 공부를 해봐야만 할 것 같습니다..