Day40-1 NodeJS의 개념 & 서버로서의 노드
기본 개념
노드란?
- 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