본문 바로가기

[부트캠프] IT 코딩 부트캠프 후기/[Let's TIL😶‍🌫️] Node.js

[Node.js] 노드를 사용하는 이유, 장점과 한계 처리

웹앱의 바탕 = JS 

웹앱의 바탕이 된 것이 '자바스크립트'이다. 

이를 이용해 처음에는 웹앱을 만들다가 이제는 리액트 네이티브 등을 통해 앱도 만들고 서버도 만든다.

(리액트나 뷰를 배우면) 한 언어로 풀스택이 가능해졌다.

 

but 실제 현업엔 다른 프레임워크를 쓸 수도 있고 그럼 그때 가서 새로 배워야한다.

다만, 서버 동작 원리 등은 불변하므로 한 언어 마스터하면 다른 언어 배우기는 쉽다!

 


발전된 JS를 통해 생긴 장점? 

코드의 재사용성이 극대화되며
서버사이드 렌더링 고급기술도 가능해졌다. 

 

node가 무엇을 위해 만들어졌나?



IO는 노드의 중요한 부분이다.

- Input Output = 입출력
- 싱글 스레드의 특징 중 하나 요청을 다 받아주는 것 (= 빠르다)

 


JS는 이벤트 루프의 비동기적인 성질을 이용했다.


-  즉, 요청을 다 받되 이벤트 루프를 통해 동시 실행이 가능하도록 한다.

- 싱글스레드이므로 결과의 동시성은 일어나지 않는다. 

 


고전처리방식에서는 한줄한줄 처리를 했다. (절차적 프로그래밍 언어)

클럭 = 처리속도  오버클럭 = 과부하(컴퓨터가 죽기 전까지만)
콜백을 사용하는 JS , 이 모양을 람다식이라 한다.

람다식과 콜백

=> (화살표)가 들어가면 람다식이라 한다. 

비동기 처리 방식 자체 == 콜백 

콜백처리 모양 중에 람다식이 있다. 

람다식 장점 : 이를 쓰면 코드 줄이 엄청 짧아진다. (개발자가 행복해한다)

 

 

따라서, 고전 처리방식을 JS 처리 방식으로 바꿔야한다.

 


브라우저에서 웹 API를 통해 요청을 보내면(Input)
그 결과를 가지고 무엇을 할지 콜백(함수)을 통해 넣어주는 것이 JS 처리 방식이며, 
이것이 노드의 가장 큰 특징이다.

 

고전적인 방식에서는 이전 것이 실행되기 전까지는 절대 다음줄로 넘어갈 수 없었으나,

JS식 방식에서는 응답이 오기 전에도 바로 다음줄로 넘어가 실행할 수 있었다. (동시에)
단, 이때 콜백을 이용해서 결과가 돌아오면 그 다음 처리가 이뤄진다.

 


즉 둘의 차이는


고전 : 한줄한줄 블락되면서 네트워크, IO 등을 기다리면서 처리 
JS : 일단 다 요청 보내버리고 돌아올 때마다 하나씩 대응하는 코드

1. 낭비되는 클락수가 없고, 
2. 브라우저, 노드가 무거운일 대신처리하므로
3. 메인 스레드는 자기 일만 처리하면 된다는 장점!

 

이를 오프로딩 방식이라 한다.

 

 

오프로딩 

노드가 복잡하고 오래걸리는 일을 하는 동안,
프로그래머가 중요한 코드만(작업처리) 짠다.

(이는 모든 프레임워크, 라이브러리의 필요성이자 장점이 동일하다.)

 

두 가지 역할로 분리된다.
네트워크 통신, 파일 읽기 == 노드가 해주므로
프로그래머 == 중요한 부분에 집중!


비동기에 있어서 무조건 싱글 스레드 이므로, 비동기에 의한 동시성 문제가 없다!

(실행은 다 동시에 되는데, 그럼에도 불구하고 먼저 들어온 일이 순서대로 처리된다.

이것이 싱글스레드의 장점이다 단점이다. 규모가 큰 프로젝트에서 단점)

 

 

얼마나 많은 요청이 들어오든, 메인스레드는 (계산하여) 맡기는 일만 하므로 확장성도 매우 높아지게 된다. 

(범용성이 높아진다)
= 기존의 프로그램들을 가지고 다른 프로그램을 또 추가하기 쉽다.

 


따라서, 구글의 V8엔진도 굉장히 빠른 엔진이므로

대부분의 경우 싱글스레드의 블락킹만 없다면  매우 빠른 퍼포먼스를 기대할 수 있다.

 



BUT 자바스크립트로만 짜는 것이므로 자바스크립트 자체만의 한계가 있다


저수준처리가 느리다. 
ex. 이미지 파일 전체를 돌면서 특정 픽셀 찾기 등등은 노드만 이용해서 하려면 너무 무겁고 오래 걸린다.
이는 기계어(cpu) 레벨로 컴파일 시키므로, 그 이상으로 빠를 수 없다.
즉 이미 있는 저수준 언어를 이용해 처리가 가능하다! == 바인딩

 

 바이트 단위 처리가 느린 이유(데이터 처리)
    
   - 불러올 때 바이트가 수많은 단위로 만들어진 것이 사진이므로 (출력과 달리) 처리가 느리다.

   - 따라서 GIF 파일을 PDF 로 바꾸는 방식으로 처리하기도 한다.  (파일 형식 변경)
    
   - 이는 이미지 하나하나 불러오기를 위한 한줄 한줄 처리가 오래 걸리기 때문이다.
    
   - cpu 는 중앙처리장치이므로 (컴퓨터의 뇌) 컴퓨터의 성능을 따라간다.
    
   - 따라서 기계어(cpu) 레벨로 컴파일 시키므로, 그 이상으로 빠를 수 없다.는 것이다.

 

 

 

바인딩이란?

프로그램에 사용된 구성 요소의 실제 값 또는 프로퍼티를 결정짓는 행위

 

예를 들어, 변수 선언을 하는 과정 자체를 바인딩이라 생각하면 된다.

(각각 자료형 이름, 변수 이름 지정 하는 것 = (선언)하는 과정이 바인딩이다.)


- 프로그래밍 언어의 기본 모습이 어셈블리어 (push, pop , 사칙연산 등 기본동작들)
- 그런 어셈블리 상태의 것들을 특정 함수나 메소드에 정의하는 과정(=바인딩 했다)을 거쳐 그 모듈을 사용할 수 있도록 제공한다.
- 어셈블리 모듈을 만드는 것 자체가 선언과 비슷하다 = 바인딩


이러한 어셈블리어(기본)를 입맛대로 변형한 것이 바인딩이며, 
이를 모듈로 쓸 수 있도록 노드에서 제공하는 것이다.


- C언어에서 처리하는 push pop 등을 바인딩해서 도구로 만들어 제공해준다.
- 사용 방법은 라이브러리의 도구들이며 그 도구들의 원리는 C언어와 웹 어셈블리 기반이다.

WebAssembly란?


: 브라우저를 위한 어셈블리

 

자바스크립트는 스크립트언어므로 아무리 잘해도 런타임에서 
예측하기 불가능한 부분이 생기는데,
완벽히 최적화가 어려우나,WebAssembly를 통해 최적화 효율을 올릴 수 있다.

이를 노드에서도 제공하므로 속도 이점을 누릴 수 있게 된다.

노드의 대표적 약점인 저수준 처리의 개선은 
즉 C와 WebAssembly를 통해 해결할 수 있다. 

 

 


또 다른 강점은 
npm
노드를 위한 패키지 매니저 (Node Package Manager)

 

오픈 소스 생태계로 많은 정보를 얻을 수 있고,


방대한 양을 보면 매우 빠르게 발전 중이므로 
다양한 task를 위한 패키지가 많으므로 가져다 쓰기 좋다!