본문으로 바로가기

writed at : 2020.05.03


(이해를 돕기 위해 메서드랑 함수는 그냥 같은 개념으로 생각하겠다.)

비록 nodeJS를 배운 지는 얼마 되지 않았지만, 미약한 지식으로 이 글을 써본다.


nodeJS에 대해 공부하려고 공식 홈페이지에 들어가 보면 아래와 같은 문구로 소개가 되어있다.

nodeJS는 Chrome V8 JavaScript 엔진으로 빌드된 JavaScript 런타임이다.

복잡하게 나와있지만 다르게 설명하면 이거다.

nodeJS는 javascript를 웹 브라우저 바깥에서도 사용할 수 있게 해주는 프레임워크이다.

그럼 이제 nodeJS의 핵심 3가지 요소에 대해서 알아보자.

  • 논 블록킹 I/O 모델 (non-blocking I/O model)
  • 싱글 쓰레드 (single thread)
  • 이벤트 기반 (event-driven)

논 블록킹

논 블록킹이라는 것은 프로그램이 멈추지 않고 실행된다는 것을 의미한다.

보통 코드가 실행될 때 한 코드가 실행되고, 그 코드가 실행을 마칠 때까지 해당 프로그램은 멈춰있다. 하지만 nodeJS는 한 코드가 실행되고 시간이 걸린다면, 다음 함수를 실행한다.

이 개념이 왜 중요하냐 하면, 보통의 코드는 실행 중에 멈춰도 괜찮지만 서버는 서비스를 계속 제공해줘야 하기 때문에 이 개념이 중요하다.

싱글 쓰레드

싱글 스레드라는 것은 말 그대로 스레드를 하나만 사용한다는 것이다.

그 대신 nodeJS는 멀티 프로세싱을 통해서 싱글 스레드의 단점을 보완한다.

이벤트 기반

마지막으로 이벤트 기반.

이것을 알기 전에 JS의 기본적인 개념인 이벤트 루프 먼저 살펴본다.

JS의 구조는 위와 같다. 보통은 모두 호출 스택에서 처리한다.

하지만 특정 상황에서 함수가 테스크 큐로 보내진다.

function run() { console.log('3 minutes later..'); } console.log('start'); setTimeout(run, 3000); console.log('end');

우선 위 코드의 실행 결과를 예측해보자. (setTimeout은 일정 시간 후에 함수를 실행한다.)

실행결과: start end 3 munutes later..

보면은 start 이후에 setTimeout이 있지만 end가 먼저 출력되는 걸 알 수 있다.

이처럼 JS는 중간에 시간이 걸리는 함수가 나오면 '논 블록킹'으로 작동한다.

이렇게 작동할 수 있는 이유가 태스크 큐와 이벤트 루프이다.

위 코드의 흐름을 아래 적어보겠다.

  1. setTimeout과 같은 논 블록킹 함수가 실행되면, 이 함수는 호출 스택을 거친 후 태스크 큐로 해당 함수가 들어간다.
  2. 그리고 이벤트 루프는 이 태스크 큐에서 지금 나갈 태스크가 있는지 반복적으로 체크한다.
  3. 3000이라는 시간이 흐르면, 이벤트 루프가 setTimeout을 꺼내서 실행한다.

이제 이벤트 루프의 역할에 대해 알게 됐을 것이다.

태스크 큐로 들어가는 경우가 정해져 있는데, 그중 하나가 eventListener를 다룰 때이다.

여기서 우린 다시 '이벤트 기반'이라는 것이 무엇인지 생각해봐야 한다.

nodeJS에서는 event라는 것이 있는데, event가 감지되면 eventListener를 통해 동작을 수행한다.

event에는 여러 가지가 있을 수 있지만 웹을 예시로 들자면,

사용자가 웹페이지를 방문한다, 게시글을 작성한다.

이런 event들이 있을 것이다.

그러면 nodeJS는 eventListener에 미리 정의되어 있는 event에 따른 동작을 수행하게 된다.

event(사용자의 웹 페이지 방문) ---eventListener(웹 페이지 방문 -> html 파일)을 참조---> html 파일 띄우기

결국 웹 페이지의 작동 방식은 아래와 같다.

  1. 서버는 eventListener를 통해 event에 따른 동작을 모두 정해놓는다.
  2. event가 들어오면 eventListener를 통해 동작을 수행한다.
  3. 다시 대기 상태로 돌아온다.

이런 점 때문에 nodeJS에서는 위 3가지 핵심 요소가 필수적이라고 할 수 있다.

3줄 요약

nodeJS로 서버를 운용할 수 있는 이유

  1. eventListener와 event를 활용해서 클라이언트의 요청을 기다리는 서버처럼 작동함
  2. 논 블록킹을 사용함으로써, 웹 서비스가 중단 없이 원활히 운영될 수 있음

뭔가 쓰다 보니 글이 엄청나게 두서없이 되어버렸습니다. 그리고 모르는 사람이 읽으면 뭔 소리를 하는지 모를 것 같습니다.

ppt를 만들어서 말로 설명하면 더 쉬울 것 같은데, 필력이 부족합니다...

그래도 이 글이 nodeJS를 공부하려는 사람에게 도움이 됐으면 좋겠습니다.

피드백 환영합니다..

'개발 공부 > Web (웹)' 카테고리의 다른 글

Docker [3/3] - NodeJS + PostgreSQL 연결  (0) 2021.01.22
Docker [2/3] - NodeJS 환경 구축  (0) 2021.01.22
Docker [1/3] - 기초부터 이미지 생성까지  (0) 2021.01.20
반복문 병렬 처리  (0) 2021.01.08
livereload 사용법  (0) 2019.01.25