Node.js-1 (22/12/05)

nazzzo·2022년 12월 5일
0

Node.js 입문



노드는 브라우저 안에서만 구동되던 자바스크립트 코드를
브라우저 밖(OS 환경)에서도 쓸 수 있도록 하기 위해 제작된 런타임입니다

노드의 핵심적인 특징을 먼저 요약하자면 다음과 같습니다

  • 이벤트 기반의 자바스크립트 런타임
  • 싱글 스레드와 논 블로킹 I/O

그러면 각각의 용어가 지닌 의미에 대해 살펴보겠습니다



1. 런타임


Node.js의 공식 사이트에는 노드를 이렇게 소개하고 있습니다

Node.js는 크롬 V8 자바스크립트 엔진으로 빌드된 런타임입니다


그런데 대체 런타임이란 것이 뭘까요?

런타임의 용어적 정의를 살펴보면 특정 언어로 만든 프로그램들을
실행할 수 있는 환경을 뜻한다고 하는데...
개인적으로 이 정의만 읽어서는 잘 와닿지가 않았습니다

좀 더 구체적인 예를 들어보겠습니다
컴퓨터는 0 과 1로 이루어진 기계어만을 이해합니다

자바스크립트와 같은 프로그래밍 언어로 만든 기능을
컴퓨터 안에서 작동시키려면 그 기능이 담긴 코드를
컴퓨터가 이해할 수 있는 기계어로 번역해야 하는데
이러한 역할을 수행하는 프로그램을 일컫어 '런타임'이라고 합니다

자바스크립트가 브라우저와 노드상에서 서로 런타임 환경이
다르다고 말할 수 있는 것도 이러한 이유 때문이라 봐야겠습니다



2. 싱글 스레드


노드는 대표적인 싱글스레드 프로그램이라고 이야기합니다

스레드의 개념을 이해하려면 우선 스레드와 프로세스의 관계성에 대해
파악해야 할 필요가 있습니다


먼저 프로세스는 정적인 상태인 프로그램(윈도우의 exe파일 등)이 동적으로 실행되고 있는 상태를 의미합니다.

그리고 스레드는 작업을 처리하는 일손으로 비유하는 경우가 많은데,
하나의 프로세스에는 최소 하나 이상의 스레드가 반드시 포함됩니다

그리고 이때 스레드가 하나뿐인 프로세스를 싱글 스레드라고 합니다
(정확히는 사용자가 컨트롤할 수 있는 스레드가 한 개입니다)
싱글 스레드에서는 아무리 많은 요청이 들어와도
한 번에 하나씩만 작업을 처리합니다

반면 스레드가 여러개인 프로세스가 멀티 스레드이며,
멀티스레드 프로세스에서는 여러가지 동시작업이 가능합니다

그리고 스레드끼리는 같은 메모리 주소에 접근하며
서로의 데이터를 공유할 수 있는 반면에,
각각의 프로세스는 별도의 메모리 공간을 차지하면서 실행되기에
기본적으로 데이터의 공유가 불가능합니다
(통신, 네트워크가 필요)

우리 몸의 기관들(스레드)이 감각정보를 공유하는 반면
개개인이 하나의 프로세스라고 이해한다면 납득이 빠를 것 같네요


그런데 위의 설명만 보아서는
노드가 싱글 스레드여서 가질 수 있는 장점이
전혀 없는 듯이 보이지만 그렇지만은 않습니다



3. 논 블로킹 I/O


먼저 I/O은 입력(Input)과 출력(Output)을 의미합니다

그리고 노드는 논 블로킹 방식을 채용하고 있는데,
논 블로킹이란 이전 작업이 모두 끝날 때까지 대기하지 않고
다음 작업을 수행할 수 있는 것을 뜻합니다

반면 블로킹 방식에서는 이전 작업이 모두 끝나야지만
다음 작업에 진입할 수 있습니다

각각의 방식의 효율성을 그림으로 나타내자면 다음과 같습니다


노드는 싱글 스레드임에도 논 블로킹 방식을 채용했기 때문에
비교적 간단한 코드 작성(Input) + 효율적인 출력(Output) 처리가
가능하다는 두 가지 장점을 지녔습니다

+) 싱글스레드에서 논블로킹 방식의 처리가 가능한 이유는
긴 시간이 걸리는 작업을 백그라운드로 넘겨보낼 수 있기 때문입니다
(setTimeout을 떠올려 봅시다. 동기와 비동기)



4. 모듈


하나의 파일에 모든 코드를 담으면 불편함이 생길 때가 많습니다
(특히 코드 오류 추적이 어렵습니다)
편의성을 위해서라도 코드가 담긴 파일을 쪼개는 것이 좋은데

모듈은 우리가 구현하려는 프로그램의 코드들을
일정한 기준에 따라(기능별로) 묶어서 단위로 잘게 나눈 것을 뜻합니다
보통은 파일 하나가 하나의 모듈이 됩니다

두 개 이상의 파일로 쪼갠 모듈을 연결시키려면
모든 파일을 동시에 실행시키고 또 그 결과물을 받아올 수 있어야 합니다

노드의 내장객체인 require()을 사용하면
두 파일(모듈)을 연결할 수 있습니다


[view.js]

// view.js 파일을 실행하면 해당 경로의 list.js 파일도 같이 실행합니다
require('./list.js')

  • 노드의 내장객체는 따로 선언하지 않아도 사용할 수 있습니다
  • 여러 파일에 걸쳐 사용되는 함수나 코드를 모듈로 만들어두면 편리합니다




5. Node.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
// 노드 설치 상태를 확인합니다



6. Node.js 실행방법


6-1. repl 모드로 실행하기


  • R : Read
  • E : Evaluate
  • P : Print
  • L : Loop

repl 모드는 브라우저의 개발자도구 콘솔탭과 유사한 기능을 합니다
주로 간단한 코드 확인을 위한 용도로 사용합니다

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만의 메서드들이 들어있습니다)



6-2. javascript 파일로 실행하기


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)가 각각 다릅니다

0개의 댓글