01 노드 시작하기
1.1 핵심 개념 이해하기
Node.js는 Chrome V8 Javascript 엔진으로 빌드된 자바스크립트 런타임이다.
1.1.1 서버
노드는 서버 애플리케이션을 실행하는데 제일 많이 사용
서버 : 네트워크를 통해 클라이언트에 정보나 서비스를 제공하는 컴퓨터 또는 프로그램을 말한다.
클라이언트 : 요청을 보내는 주체로 브라우저, 데스크톱 프로그램 ,모바일 앱 등등
주소창에 네이버 입력하면 네이버 주소에 해당하는 위치 파악후에 네이버의 웹 사이트 페이지를 받아와서 요청자의 브라우저(클라이언트)에 띄운다.
웹이나 앱을 사용할 때는 데이터(id,password)와 서비스의 데이터가 생성된다.
이 데이터를 어딘가에 저장하고 , 그 어딘가에서 클라이언트로 데이터를 받아와야 하는데
이러한 일을 진행하는것이 서버이다 .
서버는 응답만 하는것이 아니라 요청을 보낼수도 있다. 서버가 요청을 보낼때에는 서버가 (클라이언트) 가 되는것이다 . 즉 서버는 클라이언트의 요청에 대해 응답을 한다.
1.1.2 자바스크립트 런타임
Node.js 는 Chrome V8 javascript 엔진으로 빌드된 자바스크립트 런타임이다 .
런타임 : 특정 언어로 만든 프로그램을 실행할수 있는 환경
노드는 자바스크립트 프로그램을 컴퓨터에서 실행할수 있다.
노드의 내부 구조는 V8 과 libuv 두 라이브러리를 사용
libuv 라이브러리는 노드의 특성인 이벤트 기반 ,논블로킹 I/O 모델을 구현하고 있다 .
1.1.3 이벤트 기반
이벤트 기반 : 이벤트가 발생할때 미리 지정해둔 작업을 수행하는 방식을 의미한다.
이벤트로는 click, 네트워크 요청이 있을수 있다.
이벤트 기반 시스템에서는 특정 이벤트가 발생할 때 무엇을 할지 미리 등록해야 한다.
이를 이벤트 리스너에 콜백 함수를 등록한다고 표현한다.
예를들어 클릭 이벤트 리스너에 경고창을 띄우는 콜백함수를 등록하는것
노드도 이벤트 기반 방식을 동작하므로 , 이벤트가 발생하면 이벤트 리스너에 등록해둔 콜백 함수를 호출한다. 발생한 이벤트가 없거나 발생했던 이벤트를 다 처리하면 , 노드는 다음 이벤트가 발생할때까지 대기한다 .
이벤트기반 모델에서는 이벤트 루프 개념 등장
이벤트 루프 : 실행 가능한 작업(task)들을 관리하고 실행하는 역할을 담당합니다. 이벤트 루프는 브라우저나 Node.js와 같은 환경에서 작동한다.
- 단일 스레드 방식 자바스크립트는 단일 스레드로 동작하기 때문에 한 번에 하나의 작업만 처리할 수 있습니다.
- 비동기 처리 방식 자바스크립트는 비동기 처리 방식을 채택하여 작업을 처리합니다. 이는 일부 작업을 백그라운드에서 처리하고, 그 작업이 완료될 때까지 기다리지 않고 다음 작업을 처리하는 방식입니다.
- 이벤트 기반 처리 방식 자바스크립트는 이벤트 기반 처리 방식을 사용합니다. 이는 이벤트가 발생하면 그에 해당하는 작업을 실행하는 방식입니다. 예를 들어, 클릭 이벤트가 발생하면 클릭 이벤트에 해당하는 함수를 실행합니다.
이벤트 루프는 콜 스택과 큐(queue)를 이용하여 작업을 관리합니다. 콜 스택은 현재 실행 중인 작업들을 보관하는 스택이고, 큐는 새로운 작업이 들어오면 그 작업을 보관하는 대기열입니다. 이벤트 루프는 콜 스택이 비어있으면 큐에서 작업을 가져와 콜 스택에 넣어 실행합니다. 이를 통해 비동기 작업도 순서대로 실행할 수 있게 됩니다.
백그라운드 :setTimeout 같은 타이머나 이벤트 리스너들이 대기하는 곳이다 .여러 작업이 동시에 실행될수 있다.
테스크 큐 : 이벤트 발생후 백그라운드에서는 태스크 큐로 이벤트 리스너의 콜백 함수를 보낸다 . 정해진 순서대로 콜백들 줄이 서 있으므로 콜백 큐라고도 한다 .
function run() {
console.log("3초후 실행 ");
}
console.log("시작 ");
setTimeout(run, 3000);
console.log("끝");
- 호출 스택에 setTimeout 쌓임
- setTimeout 실행시 콜백 run 은 background로 보냄
- 백그라운드에서 3초후 테스크 큐로 보냄
- 호출 스택 실행이 끝나 비워진다.
- 이벤트 루프가 태스크 큐의 콜백을 호출 스택으로 올림
- run 이 호출 스택에서 실행되고 제거됨
- 이벤트 루프는 태스크 큐에 콜백이 들어올때까지 대기
이벤트 루프는 호출 스택이 비어 있을때만 태스크 큐에 있는 run 함수를 호출 스택으로 가져온다.
1.1.4 논블로킹 I
자바스크립트 코드는 동시에 실행될수 없다. 하지만 자바스크립트 상에서 돌아가는 것이 아닌 I/O 작업 같은 것은 동시에 처리될수 있다. I/O : INPUT / OUTPUT 을 의미 ,파일 시스템 접근이나 네트워크를 통한 요청 같은 작업이 I/O의 일종
노드는 논블로킹 방식으로 처리하는 방법을 제공한다.
논블로킹(non-blocking) : 이전 작업이 완료될때까지 대기하지 않고 다음 작업을 수행하는것을 의미한다.
블로킹(blocking) : 이전 작업이 끝나야만 다음 작업을 수행하는 것을 의미
논블로킹이 블로킹 방식보다 저 짧은 시간안에 가능
블로킹 방식
function longRunningTask() {
console.log("작업 끝");
}
console.log("시작");
longRunningTask();
console.log("끝");
/*시작
작업 끝
끝*/
논 블로킹 방식
function longRunningTask() {
console.log("작업 끝");
}
console.log("시작");
setTimeout(longRunningTask, 0);
console.log("끝");
/*시작
끝
작업 끝*/
논블로킹 과 동시가 같은 의미가 아니라는 사실을 알아두어야한다.
동시성은 동시 처리가 가능한 작업을 논블로킹 처리해야 얻을수 있다.
setTimout(콜백,0) : 0으로 설정해서 바로 실행되는것이 아니냐 할수 있지만 브라우저와 노드에서 기본적인 지연 시간이 있다. 브라우저는 4ms 노드는 1ms
노드에서는 동기와 블로킹이 유사하고 비동기와 논블로킹이 유사하다.
1.1.5 싱글스레드
싱글스레드 : 스레드가 하나뿐이라서 동시에 실행될수 없음
프로세스 : 운영체제에서 할당하는 작업의 단위 .노드나 웹 브라우저 같은 프로그램은 개별적인 프로세스다 . 프로세스 간에는 메모리 등의 자원을 공유하지 않는다.
스레드 :프로세스 내에서 실행되는 흐름의 단위 . 프로세스는 스레드를 여러개 생성해 여러작업을 동시에 처리할수 있다. 스레드 들은 부모 프로세의 자원을 공유한다. 같은 주소의 메모리에 접근 가능하므로 데이터를 공유할수 있다.
노드를 실행하면 프로세스가 하나 생성된다. 그 프로세스에서 스레드들을 생성하는데, 내부적으로 스레드를 여러개 생성한다. 이 중에서 우리들이 직접 제어할수 있는 스레드는 하나 뿐이다.
스레드 풀 : 노드가 특정 동작을 수행할때 스스로 멀티 스레드를 사용한다.
워커 스레드 : 노드12버전에서 멀티스레드 사용 가능 직접 다수의 스레드를 다룰수 있고 CPU 직업이 많은 경우 워커 스레드를 사용하면 된다
싱글스레드 논블로킹 모델 : 음식점 직원이 주문을 먼저 다 받고 요리를 내주는것과 같음 요리의 시간에 따라 클라이언트가 받는 순서ㄴ
멀티스레드 모델: 음식점 직원이 클라이언트 한명 맨투맨 하는것 노드
노드는 멀티 스레등 방식 대신 멀티 프로세스 방식을 사용
멀티 스레드 멀티 프로세싱
하나의 프로세스 안에서 여러 개의 스레드 사용 | 여러 개의 프로세스 사용 |
CPU 작업이 많이 사용될때 사용 | I/O 요청이 많을 때 사용 |
프로그래밍이 어려움 | 비교적 쉬움 |
1.2 서버로서의 노드
노드는 기본적으로 싱글 스레드,논블로킹 모델을 사용한다.
노드는 libuv 라이브러리를 사용해 I/O 작업을 논블로킹 방식으로 처리한다.
노드는 CPU 부하가 큰 작업에는 적합하지 않다.
우리가 작성한 코드는 모두 스레드 하나에서 처리된다.
노드는 개수는 많지만 크기는 작은 데이터를 실시간으로 주고받는데 적합하다.
실시간 채팅 어플리케이션이나 주식차트, JSON 데이터를 제공하는 API서버가 노드를 많이 사용한다.
싱글 스레드 방식으로 서버를 운영할때는 하나뿐인 스레드가 에러로 인해 멈추지 않도록 잘 관리해야한다. 에러를 제대로 처리하지 못하면 하나뿐인 스레드가 죽게되어 서버 전체가 멈춘다 .
장점 | 단점 |
---|---|
멀티 스레드 방식에 비해 적은 컴퓨터 자원 사용 | 기본적으로 싱글 스레드라서 CPU 코어를 하나만 사용 |
I/O 작업이 많은 서버로 적합 | CPU 작업이 많은 서버로는 부적합 |
멀티 스레드 방식보다 쉬움 | 하나뿐인 스레드가 멈추지 않도록 관리 필요 |
웹 서버가 내장되어있음 | 서버 규모가 커졌을 때 서버에 관리하기 어려움 |
자바스크립트 사용 | 어중간한 성능 |
JSON 형식과 쉽게 호환됨 |
1.3 서버 외의 노드
웹 ,모바일,데스크톱 애플리케이션 개발에도 사용되기 시작
노드 기반으 웹 프레임워크 앵귤러,리액트 ,뷰 등이 있다.
대스크톱 개발 도구로는 일렉트론
1.4 개발 환경 설정
nvm 사용해서 설치
LTS 와 Current 버전 차이
LTS: 기업을 위해 3년간 지원하는 버전 , 짝수 버전만 LTS 버전이 될수 있다.서버를 안정적으로 운영할때 사용
Current: 최신기능을 담고있는버전 , 예기치 못한 에러가 발생할수 있다 .
1.5 함께보면 좋은 자료
노드 공식 사이트 :https://nodejs.org/ko
노드 공식 사이트의 가이드 : https://nodejs.org/ko/docs/guides
노드에 대한 전반적인 설명 : https://nodejs.dev/
이벤트루프에 대한 시각적 설명: http://latenflip.com