저번에 페이지네이션 글을 올린 이후 한 달이 지났다.
그동안 아무것도 올리지 않은 이유에는 몇 가지 변명이 있다.
- 바쁨 ㅎㅎ;;
- 주말에는 안 함
이렇게다.
그렇다. 나는 평일에는 바쁘고 주말에는 코딩을 안 하다보니 기술 블로그를 쓸 시간이 없다.
주말에 왜 안 하냐고?
돈을 안 주잖아!!!!!!
프리캠프를 하면서 수강생들에게 Node.js를 설치해줬다.
그런데 막상 Node.js에 대한 개념을 배운지 오래돼서 까먹음ㅎㅎ;;
그래서 다시 정리해본다.
Node js란?
Node.js는 V8 자바스크립트 엔진으로 만들어진 Javascript 런타임
이다.
자 이 간단한 한 문장에도 알아봐야 할 단어들이 있다.
V8 & 런타임.
이 두 가지를 알아야지 Node.js에 대해 알아볼 수 있을 것 같다.
하지만 V8은 나중에 알아보도록 하자.
런타임
런타임이란 프로그램이 실행되고 있는 동작을 얘기하고,
더 정확하게 런타임 환경은 프로그래밍 언어가 실행되는 동안 소프트웨어 서비스를 제공하는 가상 머신이다.
우리가 VS Code로 자바스크립트 코드를 짜고 있지만, 실제로 내 컴퓨터는 그 코드를 이해할 수 없다.
멍청하기 때문이다.
우리가 쓰는 코드는 English지만, 컴퓨터는 0과 1로 이루어진 언어만 이해할 수 있기 떄문이다.
그래서 우리가 쓴 코드를 0과 1의 이세계로 보내줘야 한다.
그 역할을 런타임 환경인 브라우저가 해주고 있다.
즉, 우리가 쓴 코드를 0과 1로 변환시켜주는 환경이 런타임 환경이다.
그렇다면 Node.js 또한 런타임이라고 하니, 그 역할은 위와 같을 것이다.
Node.js
Node는 확장성 있는 네트워크 애플리케이션을 위해 설계되었다고 한다.
크롬에서 V8을 이용하여 자바스크립트 코드를 해석하듯,
서버에서도 자바스크립트 코드가 동작할 수 있도록 도와주는 환경이다.
예전에는 자바스크립트 런타임 환경이 브라우저 밖에 없었다.
이런 문제를 해결하고 브라우저가 아닌 다른 곳에서도 자바스크립트 코드를 사용할 수 있도록 만들어졌다.
또한 Node.js는 서버를 만들 수도 있고, 서버와의 연결도 도와주는 아주 좋은 친구이다.
Node.js의 특징
1. 단일 쓰레드 기반 비동기방식 Node.js는 단일 쓰레드 기반 비동기 방식이다.
쓰레드란, 프로세스 내에서 프로그램 명령을 실행하는 기본 단위이다.
하나의 제어 모델만 있는 것이 단일 스레드이고, 여러 개면 다중 스레드라고 한다.
단일 스레드이기 때문에 여러 코드를 한 번에 실행하지 않고,
코드를 위에서 한 줄 한 줄 실행한다.
그러다보니 한 줄의 코드마다 작업 시간에 관계 없이 한 줄이 끝나고 다음 줄의 코드가 실행이 된다.
이렇게 동기 방식으로 코드가 실행되면 전체 코드가 실행되는데 엄청난 시간이 걸린다.
그래서 한 줄의 코드가 실행되고 완성되기 전에 바로 다음 코드를 실행해서 시간을 단축할 수 있다.
자바스크립트는 단일 쓰레드이지만, 비동기식이라서 한 번에 여러 요청을 처리할 수 있다.
2. Non-Blocking I/O
Blocking I/O 블로킹은 호출 후 준비되어 있지 않은 프로세스는 응답 대기상태를 만들어 버린다. 그동안은 프로그램 처리를 할 수 없다.
Non-Blocking I/O 요건 호출 후 응답을 기다리지 않고 다음 처리로 넘어갈 수 있다.
Non-Blocking은 처리가 완료되징 않으면 에러로 응답한다.
비동기 I/O 비동기 방식은 처리가 완료된 타이밍으로 결과를 보내주는 것이다.
프로세스가 블록 상태가 되지 않은 점에서는 Non-Blocking과 같지만 비동기는 처리 완료 했을 때 알려주지만 Non-Blocking은 처리 가능한 상태를 오류로 판단한다고 한다.
3. 이벤트 기반, 이벤트 루프
이벤트 기반은 어떠한 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 것이다.
특정 이벤트가 발생할 때 해야할 특정 행동을 미리 등록해둔 것이다.
이벤트 루프는 여러 이벤트가 발생했을 때 어떤 순서로 함수를 호출할 지 판단해주는 것이다. 이벤트가 종료될 때까지 처리를 위한 작업 반복을 해서 루프라고 한다.
자바스크립트는 이벤트 루프가 Non-Blocking 방식이라 하나의 이벤트가 끝나는 것을 기다리지 않고 다음 이벤트를 실행한다. 그래서 빠르다.
이벤트 루프는 크게 3가지로 구성되어 있다.
Call Stack, Web APIS, Callback Queue.
우리가 일반적으로 실행하는 코드들은 모두 Call Stack에 쌓여서 나중에 실행된 순서로 하나씩 결과를 보여준다.
그러다가 SetTimeout과 같은 요청들은 Web APIs로 넘어가서 따로 실행을 한다.
그리고 나서 Web APIS에 갔던 요청의 결과가 오면
그 결과가 Call Stack으로 들어와서 결과를 보여주게 된다.
만약 엄청나게 많은 요청이 한 꺼번에 들어오게 되면
CallBack Queue라는 곳에 실행해야 할 요청들을 쌓아두고
바로 실행되는 코드는 Call Stack으로 가서 실행이 되고
다 끝난 경우 CallBack Queue에 쌓아뒀던 요청들을 하나 씩 Call Stack으로 옮기게 된다.
정리를 하다보니 하나하나 깊이가 장난이 아니었다.
그래서 일단 내 수준에서 알아야 할 정도만 정리를 해봤다.
역시 배워도 배워도 끝이 없는 언어의 세계.
나는 아직 부족하다 흑흑