아무것도 모른 채 처음 웹 개발을 하면서 접했던 것이 express.js였다.
그땐 그냥 서버만드는 뭐 그런 언어인가보다.. 하고 무지성으로 검색해서 코드를 짰었다.
그러다 너무 답답해서 책을 사서 Node.js를 공부하게 되었다.
이 책으로 공부하는데 되게 자세하고 실습코드도 있어서 좋은거같다.
Node.js는 Chrome V8 Javascript 엔진으로 빌드된 자바스크립트 런타임입니다.
이 문구를 보고 의문점이 생겼다.
바로 구글링에 들어갔다.
(책에 다 있는 내용이었지만 손이 저절로 키보드로..)
런타임은 특정 언어로 만든 프로그램들을 실행할 수 있는 환경을 뜻한다고 한다.
노드 = 자바스크립트 런타임 = 자바스크립트 프로그램을 컴퓨터에서 실행할 수 있는 환경이다.
그래서 노드는 서버 이외에도 자바스크립트 애플리케이션을 실행할 수 있다.
노드의 내부 구조를 보면 C와 C++로 구현된 V8과 libuv라는 라이브러리를 사용한다.
처음 브라우저 외의 환경에서 자바스크립트를 실행하기 위해 여러 시도를 하였으나, 실행 속도 문제로 인해 큰 호응을 얻지 못했지만 V8 엔진을 사용하여 속도 문제를 해결하고, 크롬을 출시하여 주목받기 시작했다고 한다.
libuv 라이브러리는 노드의 특성인 이벤트 기반, 논블로킹 I/O 모델을 구현하고 있다.
이 모델이 무엇인지는 알아보자.
이벤트 기반(event-driven)이란 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식
ex) 클릭, 네트워크 요청 등
호출 스택, 이벤트 루프, 백그라운드, 태스크 큐 얘네들을 통해서 코드를 관리하고 실행하는 과정을 이벤트 기반이라고 한다.
호출 스택 : 코드의 맨 위부터 한 줄씩 실행하면서 함수 호출 부분을 발견하면 호출한 함수를 넣는곳
이벤트 루프 : 이벤트 발생 시 호출할 콜백 함수들을 관리하고, 호출된 콜백 함수의 실행 순서를 결정하는 역할을 담당
백그라운드 : setTimeout 같은 타이머나 이벤트 리스너들이 대기하는 곳
태스크 큐 : 이벤트 발생 후, 백그라운드에서는 태스크 큐로 타이머나 이벤트 리스너의 콜백함수를 보낸다.
I/O는 많이 들어봤을 단어인 입력(Input)/출력(Ouput)을 의미한다.
노드는 입출력 작업을 할 때 논블로킹 방식으로 처리하는데,
논블로킹이란 이전 작업이 완료될 때까지 대기하지 않고 다음 작업을 수행하는 것을 의미한다.
위 그림에서 볼 수 있듯이 블로킹 방식보다 논블로킹 방식이 같은 작업을 더 짧은 시간에 처리한다는 것을 알 수 있다.
다시 돌아가서 왜 노드는 서버에서 많이 사용되는지 알아보자.
서버에는 기본적으로 I/O 요청이 많이 발생하므로, 논블로킹 방식을 사용하는 노드를 서버로 사용하면 굉장히 좋다. 하지만 노드는 싱글 스레드이기 때문에 CPU 부하가 큰 작업에는 적합하지 않다. 그래서 실시간 채팅 어플, 주식 차트, JSON 데이터를 제공하는 API 서버가 노드를 많이 사용한다고 한다.
노드 12 버전 이후부턴 멀티 스레드 작업을 할 수 있지만, 멀티 스레드 프로그래밍은 난이도가 싱글 스레드에 비해 높기 때문에 권장하지 않는다고 한다.
책에서 보기좋게 노드의 장단점을 표로 정리해 놓았다.
첫 블로그 게시물을 적으면서 느꼈는데, 책을 다시 읽어보면서 놓쳤던 부분들을 다시 볼 수 있고, 복습이되서 좋은거 같다. 앞으로 공부하는 모든 것을 포스팅하는 것을 목표로 하고, 공부하고 배운 것으로 개인 프로젝트 진행하며 진행 상태, 과정, 개선해야할 것 등 포스팅하고 완성하고 성장하는 것이 목표이다. 아자아자 ㅎㅇㅌ. 피드백 받습니다.