개발 이야기/Node

노드 NodeJS - 1

석구석구 2022. 1. 9. 23:42

개인적으로, 업무적으로 Node를 활용하는 일이 잦아지고 있다.

 

때문에 이번 기회에 NodeJS에 관해 깊이 있는 학습과 정리를 하고자 한다.

 

아주 오래전에 나온 책이지만, 프로페셔널 NodeJS를 활용할 계획이다. (절판된걸로 보인다.)

 

I/O 블로킹

 

전통적인 프로그래밍은 I/O 작업을 블로킹 모델로 처리한다. 블로킹 모델은 각각의 사용자를 완벽하게 분리할 수 있지만, 너무 느리고 부담스럽다. 멀티스레딩은 이런 블로킹 모델의 대안 중 하나다. 스레드는 경량 프로세스로서 같은 프로세스 내의 다른 스레드와 메모리를 공유한다. 동시 스레드 실행을 통해, 하나의 스레드가 I/O 작업을 기다리는 동안 다른 스레드가 CPU를 사용할 수 있게 되었다. 늘 그렇듯 완벽한 대안은 없고, 멀티 스레딩도 마찬가지다. 특정 시점에 어떤 스레드가 실행 중인지 알지 못한다는 점과 다함께 사용하는 공유 메모리는 런타임 버그를 만들기 쉽다.

 

이벤트 주도 프로그래밍

 

이벤트 주도 프로그래밍은 실행 흐름을 이벤트를 통해 판단하는 프로그래밍 방식이다. 쉽게 말해 이벤트가 일어나면 콜백이 실행되는 형태다. 이런 비동기적 프로그래밍은 이벤트 루프가 있기에 가능하다. 이벤트 루프는 어떤 이벤트가 일어났는지 감지하고 지정된 콜백을 실행한다. 이벤트 루프는 한 프로세스 내에서 실행 중인 단 하나의 스레드이다. 즉 특정 시점에 실행 중인 이벤트 핸들러는 단 하나뿐이며, 모든 핸들러는 방해 없이 실행을 끝낼 수 있다. 이런 단순화를 통해 동기화등의 복잡한 문제를 없앨 수 있다.

물론 Node는 처음부터 논블로킹 I/O 플랫폼으로 개발되었다.

 

Javascript

 

 Node의 개발자 라이언 달은 c, 루아 기반에서 Node를 만들다가 js로 만들게 되었다. 일급 함수와 클로저와 같은 js의 특징이 이벤트 주도 프로그래밍에 적합하기 때문이다. 

 

클로저

 

클로저를 깊이 있게 이해하려면 js의 구조에 대한 이해가 필요하지만, 가장 단순화하면 '자신을 감싼 환경을 기억하는 함수' 다. 이러한 특성으로 콜백이 실행되는 순간 함수는 자신이 선언된 컨텍스트를 기억하고 그 부모 컨텍스트에서 사용할 수 있는 변수를 모두 기억해 낸다.

 

일급 객체

 

자바스크립트에서는 함수도 값이므로 파라미터로 넘기고, 할당하고 리턴할 수 있다. 이러한 특징은 당연하게도 비동기에 적합하다.

 

 

'개발 이야기 > Node' 카테고리의 다른 글

이벤트 구독 패턴 EventEmitter - 4  (0) 2022.01.10
버퍼 Buffer - 3  (0) 2022.01.10
모듈 Module - 2  (0) 2022.01.10
NodeJS + Typescript + Mongoose  (0) 2020.02.25