노드의 핵심적인 특징을 먼저 요약하자면 다음과 같습니다
그러면 각각의 용어가 지닌 의미에 대해 살펴보겠습니다
Node.js
의 공식 사이트에는 노드를 이렇게 소개하고 있습니다
Node.js는 크롬 V8 자바스크립트 엔진으로 빌드된 런타임입니다
그런데 대체 런타임이란 것이 뭘까요?
런타임의 용어적 정의를 살펴보면 특정 언어로 만든 프로그램들을
실행할 수 있는 환경을 뜻한다고 하는데...
개인적으로 이 정의만 읽어서는 잘 와닿지가 않았습니다
좀 더 구체적인 예를 들어보겠습니다
컴퓨터는 0 과 1로 이루어진 기계어만을 이해합니다
자바스크립트와 같은 프로그래밍 언어로 만든 기능을
컴퓨터 안에서 작동시키려면 그 기능이 담긴 코드를
컴퓨터가 이해할 수 있는 기계어로 번역해야 하는데
이러한 역할을 수행하는 프로그램을 일컫어 '런타임'이라고 합니다
자바스크립트가 브라우저와 노드상에서 서로 런타임 환경이
다르다고 말할 수 있는 것도 이러한 이유 때문이라 봐야겠습니다
노드는 대표적인 싱글스레드 프로그램이라고 이야기합니다
스레드의 개념을 이해하려면 우선 스레드와 프로세스의 관계성에 대해
파악해야 할 필요가 있습니다
그리고 스레드는 작업을 처리하는 일손으로 비유하는 경우가 많은데,
하나의 프로세스에는 최소 하나 이상의 스레드가 반드시 포함됩니다
그리고 이때 스레드가 하나뿐인 프로세스를 싱글 스레드라고 합니다
(정확히는 사용자가 컨트롤할 수 있는 스레드가 한 개입니다)
싱글 스레드에서는 아무리 많은 요청이 들어와도
한 번에 하나씩만 작업을 처리합니다
반면 스레드가 여러개인 프로세스가 멀티 스레드이며,
멀티스레드 프로세스에서는 여러가지 동시작업이 가능합니다
그리고 스레드끼리는 같은 메모리 주소에 접근하며
서로의 데이터를 공유할 수 있는 반면에,
각각의 프로세스는 별도의 메모리 공간을 차지하면서 실행되기에
기본적으로 데이터의 공유가 불가능합니다
(통신, 네트워크가 필요)
우리 몸의 기관들(스레드)이 감각정보를 공유하는 반면
개개인이 하나의 프로세스라고 이해한다면 납득이 빠를 것 같네요
그런데 위의 설명만 보아서는
노드가 싱글 스레드여서 가질 수 있는 장점이
전혀 없는 듯이 보이지만 그렇지만은 않습니다
먼저 I/O은 입력(Input)과 출력(Output)을 의미합니다
그리고 노드는 논 블로킹 방식을 채용하고 있는데,
논 블로킹이란 이전 작업이 모두 끝날 때까지 대기하지 않고
다음 작업을 수행할 수 있는 것을 뜻합니다
반면 블로킹 방식에서는 이전 작업이 모두 끝나야지만
다음 작업에 진입할 수 있습니다
각각의 방식의 효율성을 그림으로 나타내자면 다음과 같습니다
노드는 싱글 스레드임에도 논 블로킹 방식을 채용했기 때문에
비교적 간단한 코드 작성(Input) + 효율적인 출력(Output) 처리가
가능하다는 두 가지 장점을 지녔습니다
+) 싱글스레드에서 논블로킹 방식의 처리가 가능한 이유는
긴 시간이 걸리는 작업을 백그라운드로 넘겨보낼 수 있기 때문입니다
(setTimeout
을 떠올려 봅시다. 동기와 비동기)
하나의 파일에 모든 코드를 담으면 불편함이 생길 때가 많습니다
(특히 코드 오류 추적이 어렵습니다)
편의성을 위해서라도 코드가 담긴 파일을 쪼개는 것이 좋은데
모듈은 우리가 구현하려는 프로그램의 코드들을
일정한 기준에 따라(기능별로) 묶어서 단위로 잘게 나눈 것을 뜻합니다
보통은 파일 하나가 하나의 모듈이 됩니다
두 개 이상의 파일로 쪼갠 모듈을 연결시키려면
모든 파일을 동시에 실행시키고 또 그 결과물을 받아올 수 있어야 합니다
노드의 내장객체인 require()
을 사용하면
두 파일(모듈)을 연결할 수 있습니다
[view.js]
// view.js 파일을 실행하면 해당 경로의 list.js 파일도 같이 실행합니다
require('./list.js')
linux
환경에서 설치합니다
1) NVM 설치
NVM
~ Node Version Manager
: 노드 설치를 돕고 버전을 관리하는 도구입니다
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash
2) 노드 설치
cd ~
ls -al
// 해당 디렉토리에서 .nvm이 생겨난 것을 확인합니다
source ~/.zshrc
// 설치된 코드가 껐다 켤 필요없이 실행됩니다
nvm --version
// > 0.39.2
// --version 명령어는 설치 상태를 확인할 때 유용합니다
nvm list
// nvm이 현재 설치할 수 있는 노드 리스트를 띄워줍니다
nvm istall --lts
// 노드 lts버전을 설치합니다
node --version
// > v18.12.1
// 노드 설치 상태를 확인합니다
R
: ReadE
: EvaluateP
: PrintL
: Looprepl 모드는 브라우저의 개발자도구 콘솔탭과 유사한 기능을 합니다
주로 간단한 코드 확인을 위한 용도로 사용합니다
node
// repl 모드로 진입합니다
// Ctrl+ C & Ctrl + C 혹은 Ctrl + D로 모드 종료
> console.log("hello world")
hello world
undefined
아래에 undefined가 뜨는 이유는 repl 모드에서
메서드의 리턴값(console.log()
)까지 출력했기 때문입니다
그리고 브라우저에서의 this는 윈도우 객체(브라우저)를 가리키는 반면
노드js는 global을 가리킵니다
(global은 브라우저에서의 window와 비슷한 의미를 가진
전역 객체이지만 node.js만의 메서드들이 들어있습니다)
vi hello.js
// # 입력모드 진입
console.log("hello world")
// # 저장후 종료
wq!
node ./hello.js
// or
// node hello.js, node hello로 생략 가능합니다
// 코드 내용이 실행됩니다
// 이는 프로세스가 생겨났다가 사라진 상태((pid로 확인)임을 의미합니다
loop를 실행시키기 위해 아래 코드도 입력해봅니다
setInterval (()=>{console.log("hello world")}, 1000)
새로운 터미널 탭을 연뒤 (맥OS : command + T
새 탭 열기)
ps -ef |grep node
// # 탭 닫기
Ctrl + C Ctrl + C
// or
Ctrl + D
iTerm2의 탭 관련 커맨드
새창 :Command + n
새 탭 :Command + t
탭 이동 :Command + 번호
,Command + 방향키
탭 닫기 :Command + w
실행중인 코드를 백그라운드 프로세스로 넘길 수도 있습니다
- Foreground Process
눈에 보이는 프로세스 ~ 엑셀, 브라우저 등- Background Process
보이지 않는 프로세스 ~ 백신
node ./loop.js &
// 실행중인 프로세스가 백그라운드로 이동합니다
// 백그라운드로 이동시킨(아직 구동중) 프로세스를 종료하려면
// 먼저 프로세스 아이디를 알아야 합니다
// 새로운 탭을 열고 명령어를 통해 프로세스의 pid를 확인합니다
ps
// or
ps -ef|grep node
// 프로세스를 종료시킵니다
kill [pid]
프론트엔드를 포함한 모든 자바스크립트 코드 작업은
노드JS에서부터 시작해야 합니다
노드JS는 서버를 만들기 위해 사용하는 것이 아니라
서버'도' 만들 수 있는 것으로 이해하는 것이 좋습니다
노드는 사용자의 컴퓨터를 조작할 수 있습니다
(브라우저는 사용자의 컴퓨터에 접근할 수 없도록 설계되었는데
이는 보안상의 이유가 가장 큽니다)
브라우저와 노드는 사용하는 내장객체(API)가 각각 다릅니다