Node.js는 뭘까?

Lucid·2021년 3월 29일
1
post-thumbnail

나는 프론트 개발자를 희망하지만 node.js를 통해 백엔드를 구성하는 것을 완벽하게 구현하지 못하더라도 결코 놓치고 싶지 않다.
그래서 node.js가 뭔데? 라는 의문이 들었다.
그냥 javascript로 구현할 수 있는 백엔드라는 생각밖에 들지 않았다.
알고 있는 지식들을 좀 더 정형화해서 내것으로 만들고 싶다는 생각에 포스팅을 작성한다.

node.js란?

서버에 대한 개념도 몰랐던 내가 처음 node.js 접했을 때 간단하게 서버를 하루만에 구현해냈다.
나는 node.js는 자바스크립트 그 자체라고 생각한다.
브라우저 환경에서만 사용할 수 있었던 Javascript를 브라우저 밖에서 사용할 수 있게 꺼내온 것이다.

왜 브라우저 밖으로 꺼내왔을까?

왜 꺼내왔을까에 대한 물음이 생긴다. 왜 javascript로 백엔드를 구성해야할까? Spring, Django...등등 백엔드에 대해 짜임새있게 구성해본 적 없는 나도 백엔드를 가지고 구성할 수 있는 여러가지 언어를 알고 있다.
node.js는 이들과 뭐가 다를까?

Spring vs Node.js

대표적인 백엔드 프레임워크인 Spring과 비교해보자.
Spring은 Java를 가지고 백엔드를 구성한다. Node.js는 javascript를 가지고 백엔드를 구성한다.

Spring

Spring은 자유도가 낮고 정형화된 패턴이 있어서 안정적이다. 아직도 백엔드를 구성할 때 Java는 아직도 우세하다.
많은 백엔드 개발자들이 Java로 Spring을 사용했고, 나온지도 오래 되었기 때문에 버그와 보안 문제가 많이 잡혀있어서 우수하다.
하지만 설정이 정말 복잡하다. Spring Boot가 등장한 이유이기도 하다.
keyword : IoC, DI, AOP, MVC, Transaction ...

Node.js

node.js는 V8엔진을 사용하기 때문에 성능이 뛰어나다. 싱글 쓰레드이며 비동기 처리에 빠른 속도를 보인다. 싱글스레드 논블로킹 모델로 구성되어있다.
파일 I/O나 네트워크 처리를 이벤트 드리븐 방식으로 처리하기 때문에 빠른 처리가 가능하다.
CPU의 대기 시간을 최소화 할 수 있다.
CPU의 부하가 적고 많은 커넥션을 동시에 처리해야 하는 구조에 적합하다. 하지만 에러가 발생한다면 싱글 쓰레드의 특성상 프로세스 자체가 죽어버린다.
싱글 쓰레드의 특성상 하나의 작업시간이 오래 걸리면 시스템의 성능이 급격하게 떨어지고, 비동기의 제어가 까다롭다.
프로세스를 fork 하여 멀티 스레드인 것처럼 사용이 가능하다.
keyword :Asynchronous, Event-driven, Non-Blocking I/O, 확장성 ...

이벤트 드리븐 방식?(Event-Driven Architecture)
이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 의미한다.(이벤트 리스너에 등록해둔 콜백함수를 실행하는 방식으로 동작)
- 분산된 시스템 간에 이벤트를 생성, 발행하고 발행된 이벤트를 필요로하는 수신자에게 전송된다.
- 이벤트를 수신한 수신자가 이벤트를 처리하는 형태의 시스템 아키텍처
- 특정 행동이 자동으로/순서에 따라 발행하는 것이 아닌 어떤 일에 대한 반응으로 동작하는 디자인 패턴이다.
- Message Broker와 결합하여, Message Driven 시스템으로 구성된다.
아 이래서 Kafka와 같이 쓰면 좋구나..

node.js의 비동기처리는 아주 좋은 성능을 보인다.
node.js는 프로세스가 종료되어도 1~2초면 프로세스를 다시 실행시킬 수 있다.
이런 node.js의 장점을 알아보자

Node.js의 특징

Asynchronous

노드가 뛰어난 성능을 발휘할 수 있는 이유는 비동기 이벤트 기반 아키텍처V8 자바스크립트 엔진을 이용했기 때문이다.
Blocking I/O는 하나의 프로세스가 자원을 사용하고자 할 때 자원을 다른 프로세스가 점유하고 있다면 그 프로세스가 자원의 사용을 끝마칠 때까지 기다려야 한다.
Blocking I/O로 운영이 되었다면 애플리케이션은 파일을 읽을 때 시스템 콜이라는 형태로 요청을 보낼 것이다. 커널은 동작을 수행하고 애플리케이션은 파일이 다 읽을 때까지 아무것도 하지 않은 Blocked상태로 기다려야 한다.
멀티쓰레드 방식으로 운영이 되었다면 프로세스 스케줄링 처리를 위해 Context Switching 비용이 발생하게 된다. 이 또한 CPU의 연산이 필요한 작업이다.
싱글 쓰레드를 가진 노드는 I/O 작업이 시작되면 이에 대한 응답을 기다리지 않고 바로 다음 작업을 실행한다. 대신 I/O가 종료되면 이벤트를 발생시키고, 이 이벤트는 해당 프로세스의 이벤트 큐에 등록되어 후속처리된다.

자바스크립트 기반

노드는 자바스크립트를 기반으로 하고 있다. 자바스크립트는 현재 아주 훌륭한 프로그래밍 언어이다.
기존에 프론트엔드만 자바스크립트로 구현이 가능했다면 이제는 백엔드도 자바스크립트로 구현할 수 있다. 하나의 언어로 통일되어 프론트엔드와 백엔드가 좀 더 긴밀한 구조로 설계될 수 있고, 프로그래머가 프론트엔드와 백엔드를 모두 구성할 수 있다.
JSON과 같은 공통 데이터 포맷도 프론트와 백엔드 사이에서 쉽게 사용될 수 있다. (MongoDB와 궁합이 좋음)

마치며

사실 난 javascript를 브라우저 밖에서 사용할 수 있다는 점이 가장 큰 장점이라고 생각한다.
비동기 처리의 매력 때문에 javascript를 선택(?) 했고 이를 가지고 백엔드에서 간단한 api와 같은 처리들이 가능하고, 백엔드 개발자 없이도 웹을 하나 만들수 있다는 점이 가장 큰 이점이라 생각한다.
결국 node.js는 javascript이며 javascript는 ES6를 기준으로 계속해서 발전해오고 있으므로 백엔드 언어로 충분하다고 생각한다.


참고

profile
Find The Best Solution 😎

0개의 댓글