본문 바로가기
카테고리 없음

[새싹x코딩온] 웹 개발자 부트캠프 과정 5주차 회고 | Node.js 특징

by 새파란레몬 2023. 8. 17.

Node.js는 본래 웹브라우져에서만 작동하던 javascript를 그외의 환경에서도 사용할 수 있도록 하는 프로그램이다. 이를 다른 말로 'JavaScript 런타임'이라 한다. 

 

node.js는 아래에서 다운 받을 수 있다. 또한 NPM(node package manager)라는 세계에서 가장 큰 오픈 소스 라이브러리를 활용할 수 있다. 다운로드 링크는 아래와 같다. 

 

https://nodejs.org/ko/download

 


1. Node.js 의 4 가지 특징

 

1) Javascript 언어 사용

 

Node.js 는 javascript의 언어로 작동한다. 

 

2)  Single Thread

 

 

프로세스는 실행 중인 프로그램인데, 이 하나의 프로세스 내에서 실행되는 흐름, 작업의 단위를 스레드(Thread)라 한다. 하나의 프로세스에는 n 개의 스레드가 존재하고 동시에 작동할 수 있다.

 

Node.js는 싱글 스레드라는 특징을 갖는다. 이는 사용자가 직접 제어할 수 있는 스레드가 하나라는 말이다.

 

출처: 새싹 x 코딩온

 

사용자가 직접 제어하는 작업이 하나다

= 스레드는 하나다(single thread)

= 콜 스택(call stack)이 하나다

 

위의 세 문장은 모두 같은 의미를 지닌다. 

 

이는 다른 스레드를 고려할 필요가 없어 프로그래밍 난이도가 상대적으로 쉬운 특징을 가진다. 또한, cpu 등의 메모리 자원을 적게 사용하게 된다. 반면 하나의 작업의 흐름으로 제어하기 때문에, 에러가 발생하면 다른 스레드가 대신하여 어떤 처리를 해주지 못하기 때문에 멈춰선다. 따라서 Node.js는 에러의 처리, 즉 예외 처리가 중요하다.

 

콜 스택에 대해 이해하기 위한 두 개의 자료구조에 대해 알아보자. 

< 스택(Stack)과 큐(Queue) 자료구조 >

- Stack -

출처 : https://velog.io/@tiiranocode/%EC%9E%90%EB%A3%8C-%EA%B5%AC%EC%A1%B0-%EC%8A%A4%ED%83%9Dstack-%ED%81%90queue


stack은 바구니 같이 생긴 구조, 한쪽 끝에서 자료(데이터)를 넣고 빼는 작업이 이루어지는 자료 구조이다. 자료가 넣어지는 끝을 스택의 맨 위라 하여 top이라 한다. 입구가 한 곳이기에 LIFO(last in first out)의 특징을 갖는다. 자료를 넣는 것을 push, 가장 최근 삽입된 자료를 삭제하는 것을 pop이라 한다. 위의 그림에서 볼 수 있듯이, 가장 먼저 삽입된 1은 안쪽에 위치하여 3과 2를 pop하기 전까지는 접근할 수 없다. 또한 빈 스택(empty stack)에서 pop하는 것을 stack underflow, 가득 찬 stack 에 push 하는 것을 stack overflow라 한다.

(참고로 코드 리뷰에 관한 유명 커뮤니티 이름이 stack overflow이다.)


- Queue -



stack 과 비교되는 다른 자료 구조로 큐 queue 가 있다. 큐의 자료 구조는 자료가 출입하는 통로라 할 수 있는 곳이 두 곳이다. stack의 한쪽이 막힌 구조라면, 큐는 양쪽이 뚫린 구조로 한쪽에서는 자료의 추가가, 다른 쪽에서는 자료의 삭제가 이루어진다. 따라서 먼저 들어온 자료가 먼저 나가게 되는 FIFO(first in first out)의 특징을 갖는다. 각각 자료를 추가하는 것을 enqueue(인큐), 자료를 삭제하는 것을 dequeue(디큐)라 한다. 또한 각각 데이터가 추가되는 곳을 rear(리어), 데이터가 삭제되는 곳을 front(프론트)라 한다.

 

Node.js는 이렇듯 stack의 특징을 갖는 call stack의 방식으로, 현재의 동작 함수, 내부의 동작 함수, 순서등을 제어한다. 

 

3. Non-blocking I/O

 

블로킹과 논블로킹 (출처: 새싹 x 코딩온)

블로킹(Blocking)이란 어떤 전 작업이 끝나야 다음 작업이 수행되는 것을 말한다. 이와 반대의 개념으로 논 블로킹(non-blocking)이 있는데, 이는 작업이 완료될 때까지 대기하지 않고 다음 작업을 수행하는 것을 의미한다. 

 

I/O 란 단순히 input, output 즉, 입출력을 의미한다. 

 

Node.js는 non-blocking I/O 방식으로 입출력을 논블로킹 방식으로 처리하기 때문에 시간적인 이득을 획득할 수 있다. 이는 동시에 처리할 수 있는 작업을 백그라운드로 넘김으로서 가능하다. 

백그라운드(Background): 뒷 단에서 실행하고 있는 작업! == 특정 작업이 백그라운드로 실행되면 그 동안 다른 일이 가능.
포그라운드(Foreground): 내 앞에서 실행하고 있는 작업! == 해당 작업이 포그라운드로 실행되면 결과가 나올 때까지 기다림.

 

4. 이벤트 기반 아키텍쳐

 

Node.js는 이벤트가 발생할 때 미리 지정해둔 작업을 수행할 수 있다. 이 때의 이벤트는 클릭, 타이머, 네트워크 요청 등이 될 수 있다. 

 

발생 원리는 아래와 같다. 간단히 설명하자면 미리 이벤트 리스너에 콜백함수를 등록 해놓고, 이벤트 발생 시 등록해놓은 콜백함수를 호출하여 사용하는 것이다. 

이와 같이 '이벤트'를 사용하려면 두 가지 함수가 필요하다.

 

이벤트 리스너(Event Listener): 이벤트를 등록할 수 있게 해주는 함수

콜백 함수(Callback Function): 이벤트가 발생했을 때 실행되어야 할 함수

 

Node.js는 오래 걸리는 작업은 다음과 같이 이벤트 루프에 맡기게 된다.