본문 바로가기

생각정리

Node.js 에 대한 나의 생각(feat.javascript) 1편

728x90

일단 Node.js에 대해 알기전에 근본인 Javascript를 알아야 이해하기가 쉬움으로 Javascript에 대해서

먼저 아주 간단히 알도록해보자 !!

 

자바스크립트란 위키백과에 의하면 

자바스크립트(영어: JavaScript)는 객체 기반 스크립트 프로그래밍 언어이다. 이 언어는 웹 브라우저 내에서 주로 사용하며, 다른 응용 프로그램의 내장 객체에도 접근할 수 있는 기능을 가지고 있다. 또한 Node.js와 같은 런타임 환경과 같이 서버 프로그래밍에도 사용되고 있다.

 

쉽게 말하면 Javascript 자체는 웹 브라우저 내에서 프론트엔드 한정의 언어라는 뜻이다 . 

 

특징으로는 

1. 한번에 하나의 작업만 수행할수있는 싱글 쓰레드

(다른 작업이 중간에 끼어들 수 없고 기존에 수행하던 작업이 끝나야만 다음 작업을 수행할 수 있음 .)

2. 비동기

3. 논블로킹 I/O

 

여기서 의문이 든다. 싱글쓰레드인데 어떻게 비동기, 논블로킹 I/O 가능한가?

 

이 의문에 앞서서 일단 Javascript의 동작원리와 구조에 대해서 간단하게 정리를 하겠다. 

 

 

먼저 구조 

위처럼 Javascript 엔진은 메모리힙과  콜스텍으로 이루어져있다. 

 

메모리힙이란?

정보 (ex. 변수, 함수 등)를 특정한 장소에 저장 하는 장소변수, 함수 저장, 호출 등의 작업이 발생하는

이 공간이 바로 메모리 힙

EX :한 컨테이너에 택배박스들안에 물건을 넣어 저장하는 곳 .그림으로 설명하면 아래처럼 생각하면 되겠다. 

콜스텍이란? 

메모리 힙에서 작업 수행에 필요한 것들을 찾아서 작업을 수행하는 공간

 

특징

스택에 쌓여져있는 함수들을 추적하여 함수를 실행한다. (쉽게말하면 LILO 방식)

콜스택은 메모리에 존재하는 공간 중의 하나로, 코드를 읽어내려가면서 수행할 작업들을 밑에서부터 하나씩 쌓고, 메모리 힙에서 작업 수행에 필요한 것들을 찾아서 작업을 수행하는 공간. 그림으로 설명하면 아래처럼 생각하면 되겠다. 

 

이렇게 두 개에 대해서 알게 되었음으로 정리를 해보자면 

메모리 힙에 객체, 함수 등 개발자가 설정한 변수들을 저장하고 호출하는 곳이고 콜스텍은 어떤 이벤트가 발생했을 때 메모리힙에 있는 저장된 이벤트를 꺼내서 쌓아놓고 LILO방식으로 실행이된다. 

 

 

LILO방식이란? 먼저들어온 이벤트가 가장 나중에 실행되는 방식 .밑에와 같이 생각을 하면 되겠다. 

또 웹에서의 LILO방식 콜스텍 확인 

 

 

① 자바스크립트 파일이 실행되면서 동시에 (anonymous)라는 함수가 콜스택의 가장 아래에 들어온다. 이를 Global Execution Context라고 하는데 나중에 자세히 살펴보자. 함수 이름이 (anonymous)인 이유는 자바스크립트 파일의 이름이 현재 없어서 그렇다.

② 가장 아래에 작성된 코드인 calculate() 함수를 읽음과 동시에 이 함수가 콜스택에서 두번째 밑으로 들어온다. 그리고 이를 수행하기 위해 calculate() 함수가 선언된 코드 안 쪽으로 들어가게 된다.

③ sumTotal을 계산해서 그 값을 얻어낸 후 다음 줄로 내려간다.

④ 이 코드를 실행하기 위해서는 subtractTwo() 함수를 알아야하기에 당장 calculate() 함수가 콜스택에서 제거되지 못하고, 대신 subtractTwo() 함수가 콜스택에 새롭게 쌓인다. 그리고 이 함수를 실행하기 위해 함수가 정의된 곳으로 간다.

 

⑤ subtractTwo() 함수의 값을 계산하여 값 7을 얻어냈다.

⑥ 계산된 값을 토대로 subtractTwo() 함수를 실행했으므로 이 함수는 콜스택에서 제거된다.

⑦ calculate() 함수 또한 실행에 필요한 모든 값을 얻었으므로, 실행되고 콜스택에서 제거된다.

⑧ 마지막으로 본 파일의 실행이 모두 끝났으므로 Global Execution Context인 (anonymous) 함수 또한 콜스택에서 제거되고, 모든 수행이 종료된다.

 

위 과정을 토대로, 콜스택을 통해 현재 코드가 어디에 위치해 있는지를 트래킹 할 수 있다는 점을 알 수 있다. stack frame(분홍색 조각들)을 통해 현재 코드의 어디에 위치해 있는지 알 수 있고, 메모리 힙을 참고하여(노란색 화살표) 코드 실행에 필요한 변수, 함수 등의 위치를 참조하면서 실행을 한다. 참고로 간단한 변수들은 콜 스택에 저장되고, 객체, 배열, 함수 등 복잡한 데이터 구조의 값들은 메모리 힙에 저장

 

다시 어떻게 비동기, 논블로킹, 동시성?

 

이것이 가능한 이유는 자바스크립트의 환경 때문이다 .

많은 개발자들이 자바스크립트 자체에서 비동기의 속성이 있다고 착각을 하지만 그것을 틀린 사실

 

자바스크립트가 위 의 속성을 가질 수 있는 이유는 바로 브라우저,Node.js 라는 환경이 있기 때문에 가능하게 된다 .

이 브라우저나 Node.js 환경에서 이벤트가 호출이 된다면 자바스크립트 엔진은 web apinode.js api에 작업을 위임하게되는데 여기서 LIFO방식이 FIFO방식으로 변환이 되고 이 api들 덕분에 Javascript 코드들이 실행될때 비동기 속성을 가지게 된다.

 

FILO방식이란? 먼저 들어온 이벤트가 먼저 실행이되는 방식 . 밑에와 같이 생각을 하면 되겠다. 

 

왜 LILO방식에서  FILO 방식으로 바뀌어야하는가?? 

왜냐하면 비동기를 쓰는 이유가 작업을 빨리 처리하기 위해서 인데 그렇게 작업을 하려면 들어온 순서대로 처리를 해야하기 때문이다. 

 

여기까지 이해를 하게 되었으면 Node.js를 이해하기 더 편해진다 .

다음에 이어서 설명을 하도록 하겠다.

 

참고 

https://medium.com/@vdongbin/node-js-%EB%8F%99%EC%9E%91%EC%9B%90%EB%A6%AC-single-thread-event-driven-non-blocking-i-o-event-loop-ce97e58a8e21

 

Node.js 동작원리 (Single thread, Event-driven, Non-Blocking I/O, Event loop)

Node.js는 어떻게 동작하는가

medium.com

 

https://soldonii.tistory.com/53

LIST