[Node] Node 공부 시작하기

Happy_Nerd·2021년 3월 16일
0

Node

목록 보기
1/3
post-thumbnail

node.js를 사용하면서도 기초부터, 처음부터 이해하면서 공부한 적이 없었던 것 같아서..
하루에 1시간은 무조건 node에 대해 공부하기로 마음먹었다..!ㅠㅠ
일단 집에 있는 Node.js 교과서라는 책을 바탕으로 구글링도 해가며 공부해보는걸로!!!
(제발 이 다짐 오래가자!!!)

노드의 핵심 개념

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

서버

노드는 서버를 실행하는 데 제일 많이 사용된다.

서버란 네트워크를 통해 클라이언트에 정보나 서비스를 제공하는 컴퓨터 또는 프로그램을 말한다.

클라이언트는 요청을 보내는 주체

서버라고 해서 요청에 대한 응답만 하는 것이 아니라 다른 서버에 요청을 보낼 수도 있는데,
이때는 요청을 보낸 서버가 클라이언트 역할을 하는 것과 같다.

자바스크립트 런타임

노드는 자바스크립트 런타임이다.

런타임이란 특정 언어로 만든 프로그램들을 실행할 수 있는 환경을 말한다.

따라서 노드는 자바스크립트를 실행할 수 있게 해주는 환경이라고 할 수 있다.
기존에 자바스크립트는 브라우저 위에서만 실행시킬 수 있었는데 V8엔진으로 빌드된 node.js 덕분에 브라우저 외의 환경에서도 실행시킬 수 있게 되었다.

노드는 V8엔진libuv라는 라이브러리를 사용한다.

libuv 라이브러리는 노드의 특성인 이벤트 기반, 논블로킹 I/O 모델을 구현하고 있다.

자바스크립트 엔진?
V8은 구글이 제공하는 자바스크립트 엔진이다.
자바스크립트 엔진이란 자바스크립트 코드를 마이크로프로세서가 이해할 수 있는 낮은 수준의 언어
혹은 기계어로 변환해주는 역할을 해주는 것을 말한다.

자바스크립트 엔진은 Memory Heap과 Call Stack으로 이뤄져있다.
Memory Heap은 메모리 할당이 일어나는 곳이고 Call Stack은 코드 실행에 따라 호출 스택이 쌓이는 곳이다.

이벤트 기반

이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식

이벤트 기반 시스템에서는 특정 이벤트가 발생할 때 무엇을 할지 미리 등록해두어야 하는데,
이것을 이벤트 리스너콜백 함수를 등록한다고 표현한다.

노드이벤트 기반 방식으로 동작하므로 이벤트가 발생하면 이벤트 리스너에 등록해둔 콜백 함수를 호출한다. 발생한 이벤트가 없거나 발생했던 이벤트를 다 처리하면 노드는 다음 이벤트가 발생할 때까지 대기한다.

이벤트 기반 모델에서는 이벤트 루프라는 개념이 등장한다.

이벤트 루프

이벤트 발생 시 호출할 콜백 함수들을 관리하고, 호출된 콜백 함수의 실행 순서를 결정하는 역할을 담당한다.
노드가 종료될 때까지 이벤트 처리를 위한 작업을 반복하므로 루프라고 불린다.

노드는 자바스크립트 코드를 위에서부터 한줄씩 실행시킨다.
함수를 호출하는 부분을 만나면 호출 스택에 쌓아두고,
함수의 실행이 완료되면 스택에서 지워진다.

console.log()와 같이 바로 실행되는 함수의 경우는 언제 실행될 지
쉽게 예측이 가능하지만 setTimeout()같은 함수는 예측하기 어렵다.
이를 파악하기 위해서는 이벤트 루프 개념 뿐만 아니라 테스크 큐, 백그라운드를 알아야 한다.

  • 테스크 큐: 이벤트 발생 후 호출되어야 할 콜백 함수들이 기다리는 공간. 콜백들이 이벤트 루프가 정한 순서대로 있어서 콜백 큐라고도 한다.
  • 백그라운드: 타이머나 I/O작업 콜백 또는 이벤트 리스너들이 대기하는 곳

setTimeout 같은 함수는 실행되면서 호출 스택에서 제거되고 콜백 함수를 백그라운드로 보낸다.
백그라운드에서 지정한 시간이 지나면 태스크 큐로 보내고,
이벤트 루프는 호출 스택이 비워지는걸 기다렸다가 태스크 큐에 있는 함수를 호출 스택에 보내 실행시킨다.

만약 호출 스택에 함수가 많으면 내가 지정한 시간이 지난 후에도 콜백 함수가 실행되지 않을 수도 있다.
(setTimeout의 시간이 정확하지 않을 수 있는 이유)

논 블로킹 I/O

기본적으로 자바스크립트 코드는 동시에 실행될 수 없지만 I/O (input/output) 작업은 동시에 처리될 수 있다.
파일 시스템 접근이나 네트워크를 통한 요청 같은 작업이 I/O의 일종이다.
이러한 작업을 할 때 노드는 논 블로킹 방식으로 처리하는 방법을 제공한다.

논 블로킹이란 이전 작업이 완료될 때까지 대기하지 않고 다음 작업을 수행하는 것을 말한다.
블로킹은 반대로 이전 작업이 끝나야 다음 작업을 수행하는 것을 말한다.

노드는 I/O 작업을 백그라운드로 넘겨 동시에 처리하기 때문에 동시에 처리될 수 있는 작업은 최대한 묶어서 백그라운드로 넘겨야 처리 시간을 줄일 수 있다.

setTimeout(콜백함수, 0)은 코드를 논 블로킹 방식으로 만들기 위해 사용하는 기법 중 하나이다.
오래 걸리는 작업을 setTimeout(콜백,0) 에서 콜백으로 넘기면 호출 스택에서는 함수가 실행될 때 빠지기 때문에 그 다음 함수를 실행시킬 수 있다.
논 블로킹 방식으로 작성할 수 있을 뿐, 실제로 동시에 실행되는 것은 아니고 단순히 실행 순서만 바뀔 뿐이다.

논 블로킹동시가 같은 의미가 아니라는 것도 중요한데, 동시성동시 처리가 가능한 작업논 블로킹 처리해야 얻을 수 있다.

동기/비동기, 블로킹/논블로킹 개념 차이 잘 아는 것이 좋을 것 같음

싱글 스레드

프로세스와 스레드

프로세스

운영체제에서 할당하는 작업의 단위

노드나 웹 브라우저 같은 프로그램이 개별적인 프로세스. 프로세스 간에는 메모리 등의 자원을 공유하지 않는다.

스레드

프로세스 내에서 실행되는 작업의 단위

프로세스는 여러 스레드를 생성해 여러 작업을 동시에 처리할 수 있다.
그래서 스레드를 작업을 처리하는 일손으로 표현하기도 한다.

스레드들은 부모 프로세스의 자원을 공유한다.
같은 주소의 메모리에 접근 가능하므로 데이터 공유가 가능하다.

노드는 싱글 스레드?

정확하게 말하면 노드는 싱글 스레드는 아니고 노드도 여러 개의 스레드를 가지고 있지만,
(노드를 실행하면 프로세스 하나가 생성되고 그 프로세스에서 스레드를 여러개 생성)

자바스크립트를 실행하는 스레드가 하나라서 (우리가 제어할 수 있는 스레드가 하나라서)

노드를 싱글 스레드라고 하고, 그 싱글 스레드가 이벤트 루프이다.

노드가 싱글 스레드로 동작하지 않는 경우

1. 스레드 풀 (Thread Pool)
노드가 특정 동작을 수행할 때 스스로 멀티 스레드를 사용한다.
ex) 암호화, 파일 입출력, 압축 등이 있다.

2. 워커 스레드 (Worker Thread)
노드 12버전에서 안정화된 기능인데, 멀티 스레드를 사용할 수 있게 해준다.
CPU 작업이 많은 경우 워커 스레드를 사용하면 된다.

흠흠..
기본적으로 노드는 싱글 스레드, 논 블로킹 모델을 채택했지만 멀티 스레드를 다룰 수 있다..로 이해하면 될 것 같다..!

멀티 스레드 방식으로 프로그래밍하는 것이 조금 까다롭기 때문에 멀티 프로세싱 방식을 대신 사용하는데,
멀티 프로세싱이 I/O 요청 처리에 더 효율적이기도 해서 노드는 멀티 프로세싱을 많이 한다고 한다.

서버로서의 노드, 서버 외의 노드

서버로서의 노드

노드가 싱글 스레드, 논 블로킹 모델을 사용하므로 노드 서버 또한 마찬가지이다.

노드는 libuv 라이브러리를 사용해 I/O 작업을 논 블로킹 방식으로 처리하기 때문에 I/O 작업이 많은 작업에 적합하다.
하지만 싱글 스레드를 사용하기 때문에 CPU 부하가 큰 작업에는 적합하지 않다.

노드에는 웹 서버가 내장되어 있는데, 이러한 이유로 입문자가 쉽게 접근할 수 있다.

서버 외의 노드

노드를 대부분 서버로 사용하지만, 노드 자체는 자바스크립트 런타임이기 때문에 서버에만 한정되어있는 것은 아니다.
웹, 모바일, 데스크톱 애플리케이션 개발에도 사용될 수 있다.

노드 기반으로 돌아가는 대표적인 웹 프레임워크로는 앵귤러, 리액트, 뷰 등이 있다.
모바일 개발 도구로는 리액트 네이티브, 데스크톱 개발 도구로는 일렉트론이 대표적이다.

노드는 프레임워크?

프레임워크란 '일정한 틀을 갖고 있어서, 개발자가 특정 부분만 원하는 모습대로 채워 넣으면, 프로그램을 완성할 수 있게 해주는 준비된 코드 체계를 말한다.

위의 의미로 봤을 때 노드는 프레임워크는 아니다!
노드는 자바스크립트의 실행 환경일 뿐, 노드를 설치한다고 해서 일정한 틀이라는 것이 생기지 않기 때문이다.
node.js라는 실행 환경이 주어질 뿐, 프로그램의 전반적인 구조를 설계하고 구현하는 것은 개발자의 몫이 된다.

참고
- Node.js 교과서
- 인프런 강의

0개의 댓글