학습목표
1. Node.js가 무엇인지 한 문장으로 설명할 수 있고, 무엇을 위해서 만들어진 기술인지 설명할 수 있습니다.
2. JavaScript, V8 엔진, Server-side, Runtime에 대해서 설명할 수 있습니다.
3. Node.js로 개발하면서 얻을 수 있는 장점과 사용하는 이유에 대해서 설명할 수 있습니다.
4. 운영체제별 Package managaer를 사용해서 Node.js를 설치할 수 있습니다.
5. REPL (Read Eval Print Loop)과 .js 파일을 사용해서 javascript 코드를 node.js(실행환경)에서 실행할 수 있습니다.
6. Node.js의 모듈 시스템에 대해서 설명할 수 있고, Custom 모듈을 직접 만들 수 있습니다.
7. Node.js에 내장되어 있는 모듈 중에 가장 중요한 file system 모듈을 사용할 수 있으며, 동기/비동기에 대한 개념에 대해서 이해할 수 있습니다.
Chrome 브라우저의 V8 Javascript 엔진을 탑재한 이벤트 기반의 Server Side 오픈소스 Javascript 실행환경(runtime)입니다. 동시요청 처리에 높은 성능을 갖는 HTTP Server를 구축 및 실행할 수 있습니다.
Javascript
: HTML 요소 생성 뿐만 아니 라 모든 페이지 및 기능을 동적으로 처리할 수 있도록 도와주는 브라우저에서 실행되는 프로그래밍 언어입니다.Chrome V8 Javascript 엔진
: Javascript로 작성된 코드를 컴퓨터가 해석하기 쉬운 바이트 코드로 변환하는 역할을 수행합니다.실행환경(runtime)
: Javascript가 브라우저 이외의 환경에서도 동작할 수 있도록 V8엔진을 브라우저에서 독립시킨 Javascript의 또 다른 runtime인 Node.js를 발표합니다. Node.js의 개발목적은 Network Server를 만드는 것이었습니다.Server side
: 백엔드 APIV8 엔진
은 JavaScript로 작성된 코드를 컴퓨터가 해석하기 쉬운 바이트 코드로 변환하는 JIT 컴파일 방식을 채택하고 있으며, V8의 최적화 기법으로 놀라운 속도로 작업을 수행합니다.libuv
라는 비동기 I/O에 중점을 둔(동시요청 병렬처리 가능) 오픈소스 라이브러리를 사용함으로써 이벤트 기반(Event Driven), Single Thread, non-blocking I/O 모델을 구현합니다. 덕분에 Node.js는 지연없이 동시요청을 빠르게 처리할 수 있습니다.MSA 구조 안에서는 기능이 추가될 때마다 기존 시스템에 더해지는 것이 아니라 가벼운 시스템을 새롭게 구축하는 방법으로 확장하게 됩니다. Node.js는 상대적으로 가벼운 런타임이기 때문에 MSA와 잘 조화되어 사용될 수 있습니다.
런타임이 가볍다 = 웹 환경에서 처리하기에 용이할 정도로 파일 크기가 크지 않다. Node.js는 기능이 비교적 적습니다.
Node.js 단점
1. 싱글 스레드 > 하나가 죽으면 여분이 없음
2. javascript 자체의 문제인데, 변수 타입이 지정되어 있지 않아서 안정성이 떨어진다 > typescript로 보완할 수 있다.
nvm이 필요한 이유. 실행환경(노드js 버전)이 다르기 때문이다.
JavaScript 코드 및 node.js에서 제공하는 다양한 표현식을 실시간으로 처리하는 대화형 쉘(Shell)을 의미합니다. 이 대화형 쉘은 사용자가 입력한 Javascript 코드를 읽고, 코드 행을 해석한 결과를 평가하고, 경과를 사용자에게 출력하고, 사용자가 종료 신호를 보낼 때까지 이 과정을 반복합니다.
쉽게 설명하면, REPL은 파일을 생성하지 않고도 Javascript 코드를 테스트하는 빠른 방법입니다.
(Step 1) Starting and Stopping the REPL
REPL을 시작
하기 위해서는, 터미널에 node라고 입력하면 됩니다.
>
기호는 사용자가 입력하는 Javascript 코드를 즉시 평가해서 실행시켜준다는 의미입니다.
$node
Welcome to Node.js v.16.3.0.
Type ".help" for more information.
>
REPL을 종료
하기 위해서는, .exit
을 입력하거나 CTRL + D
를 한 번 누르거나 CTRL + C
를 두 번 눌러서 기본 쉘 프로프트(zsh, bash)로 돌아갈 수 있습니다.
(Step 2) Executing Code in the Node.js REPL
REPL은 숫자와 문자열에 대한 작업을 처리할 수 있습니다.
다음을 입력하여 REPL에서 두 숫자의 나눗셈과 두 문자열을 연결해보도록 하겠습니다.
> 12 / 2
6
> "Hello " + "World"
'Hello World'
console.log("Hi")
// console.log는 문자열을 반환 아니고, stdout 스트림(화면)에 메세지를 인쇄(print)함
Hi
undefined // console.log()의 반환값
모듈화는 지속가능한 소프트웨어 개발에 중요한 개념입니다. 모듈화가 잘 된 코드는 재사용성과 확장성을 높여서 새로운 기능을 개발하거나 유지보수할 때 전체적인 비용을 감소시키고 개발팀의 생산성을 증대시킬 수 있습니다.
Node.js 모듈 시스템은 CommonJS라는 워킹그룹이 Module specification을 만든 것에서 시작되었습니다. 'Javascript를 사용해서 모듈화를 하려면 이러이러한 방식으로 해!' 라는 내용의 specification이죠. Node.js도 이러한 모듈화 작업 덕에 탄생할 수 있게 되었습니다.
모듈을 어떻게 정의하고, 어떻게 사용할 것인지에 대해 기술해 놓았습니다. 크게 세 가지로 나뉘어집니다.
모듈은 자신만의 독립적인 실행 영역이 있어야 합니다.
JS 파일마다 독립적인 파일 스코프 존재
파일 하나에 모듈 하나를 작성하는 방법으로 독립적인 실행영역 만듦 (파일:모듈 = 1:1)
모듈을 외부에서 사용할 수 있도록 공개합니다.
외부에 공개하려면 exports라는 전역 객체를 사용하면 됩니다.
모듈 호출
모듈을 사용하는 영역에서는 require() 함수를 이용해 모듈을 호출합니다.