JX405기_비트/Node.js(Express.js)

Day40-1 NodeJS의 개념 & 서버로서의 노드

_하루살이_ 2023. 3. 14. 14:25

기본 개념

 

노드란?

  • Node.js는 Chrome V8 Javascript 엔진으로 빌드된 JavaScript 런타임 → 자바스크립트로 작성된 프로그램 (애플리케이션) 실행할 수 있는 환경
  • 기존에는 웹 브라우저에서만 자바스크립트 코드 실행

 

기존웹 애플리케이션 

Node.js

 

Node.js Architecure

  • Libuv : C, C++ 로 구현
  • 노드의 특성인 이벤트기반, 논 블로킹 I/O모델 구현

이벤트 기반 (event-driven)

이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식

특정 이벤트가 발생할 때 무엇을 할지 미리 등록해야 함 → 이벤트 리스터(event listener)에 콜백 (callback) 함수 등록

이벤트 루프(event loop)

여러 이벤트가 동시에 발생했을 때 어떤 순서로 콜백 함수를 호출할지를 이벤트 루프가 판단

function first(){
    second();
    console.log('첫번째')
}

function second(){
    third();
    console.log('두번째')
}

function third(){
    console.log('세번째')
}

first()

anonymous : 처음 실행 시의 전역 콘텍스트(global context) 

context: 함수가 호출되었을때 생성되는 환경

 

이벤트 기반 예제

이벤트 루프 : 이벤트 발생싱 호출할 콜백 함수들을 관리하고, 호출된 콜백 함수의 실행 순서를 결정

백그라운드 : 타이머나 이벤트 리스너들이 대기하는 곳

태스크 큐 : 이벤트 발생 후, 백그라운드에서는 태스크 큐로 타이머나 이벤트 리스너의 콜백함수를 보냄

function run(){
    console.log('3초 이후 실행')
}
console.log('시작')
//run()gkatnfmf 3000밀리초 후에 실행
setTimeout(run, 3000)
console.log('끝')

1. 호출 스택에 쌓임 → (이벤트 루프) → 2. setTimeout 실행시 콜백 run은 백그라운드로 보냄 → 3. 백그라운드에서 3초 후 태스크 큐로 보냄 → 4. 호출 스택 실행이 끝나고 비워지면 → 5. 이벤트 루프가 태스크 큐의 콜백을 호출스택으로 올림 → 6. run이 호출 스택에서 실행되고 제거됨 → 7.이벤트루프는 태스크 큐에 콜백이 들어올 때까지 대기

 

작업의 종류

  • 동시에 실행될 수 있는 작업
  • 동시에 실행될 수 없는 작업

 

노드는 I/O작업을 처리할 때 논블로킹 방식으로 처리하는 방법 제공

  • Blocking : 이전 작업이 끝나야 다음 작업을 수행
  • Non-Blocking : 이전 작업이 완료될 때까지 대기하지 않고 다음 작업을 수행

function longTask(){
    console.log('작업끝')
}

console.log('시작');
longTask();
console.log('다음작업')

시작

작업끝

다음작업 순서로 결과 발생

longTask()작업이 완료되기 전까지 console.log('다음작업') 호출되지 않음

function longTask(){
    console.log('작업끝')
}

console.log('시작');
setTimeout(longTask, 0);
console.log('다음작업')

시작

다음작업

작업끝 순서로 결과 발생

setTimeout의 콜백 함수인 longTask()가 테스크 큐로 보내진 후 실행

시간 지연을 0밀리초로 설정했지만 브라우저와 노드에서는 기본적인 지연시간이 있으므로 바로 실행되지 않음

 

프로세스 vs 쓰레드(Thread)

  • 프로세스 : 운영체제에서 할당하는 작업의 단위. 프로세스 간에는 메모리 등의 자원을 공유하지 않음
  • 쓰레드 : 프로세스 내에서 실행되는 흐름의 단위.

싱글 쓰레드(Single Thread)

노드를 실행하면 프로세스는 하나 생성.

프로세스에서는 내부적으로 쓰레드를 여러개 생성

직접 제어할 수 있는 쓰레드는 하나

 

쓰레드 풀(Thread Pool)과 워커쓰레드(Worker Thread)

노드가 특정 동작을 수행할 때 스스로 멀티 쓰레드 사용 ex. 암호화, 파일입출력, 압축

직접 여러 개의 쓰레드 처리가 필요한 경우 워커 쓰레드 사용

 

멀티 쓰레딩 멀티프로세싱
하나의 프로세스 안에서 여러개의 쓰레드 사용 여러개의 프로세스 사용
CPU 작업이 많이 사용될때 사용  I/O 요청이 많을 때 사용
프로그래밍 어려움 비교적 쉬움

서버로서의 노드

 

서버란 

  • 네트워크를 통해 클라이언트에 정보나 서비스를 제공하는 컴퓨터 또는 프로그램
  • 노드에는 웹 서버가 내장되어있음 → 서버 규모가 커지면 nginx 등의 웹 서버를 노드 서버와 연결해야함

 

기본적으로 싱글 쓰레드, 논블로킹 모델을 사용

  • I/O 처리를 잘함
  • 개수는 많지만 크기가 작은 데이터를 실시간으로 주고 받는데 적합함
  • 실시간 채팅, 주식차트, JSON 데이터를 제공하는 API 서버

웹, 모바일, 데스크톱 애플리케이션 개발에도 사용

 

노드기반 웹 프레임 워크

  • 앵귤러, 리액트, 뷰

모바일 개발 도구인 리액트 네이티브

  • ex) 페이스북, 인스타그램, 핀터레스트, 월마트, 테슬라 등

데스크톱 개발 도구

  • 일렉트론 → atom, slack, discord, visual studio code