일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 배열 분해 할당
- 핵심만 골라 배우는 SwiftUI 기반의 iOS 프로그래밍
- max apache
- 한글입력 오류
- 생활코딩
- 맥 아파치
- 제이쿼리연결
- jquery 사용하기
- 자바스크립트 배열 할당
- 자바스크립트
- 제이펍 출판
- 비주얼스튜디오 코드
- 자바스크립트 객체
- 자바스크립트 class
- 자바스크립트 객체 만들기
- SwiftUI 기반의 iOS 프로그래밍
- 객체지향
- 한글입력 씹힘
- 한글입력 잘림
- 한글잘림
- 기획자랑 사이좋게 지내고 싶다
- 맥 mysql
- max MySQL
- python GUI 사용하기
- python tkinter 인터페이스
- 객체
- 한글입력 안됨
- 닐 스미스 지음
- 황반석 옮김
- 블록 스코프
- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 배열 분해 할당
- 핵심만 골라 배우는 SwiftUI 기반의 iOS 프로그래밍
- max apache
- 한글입력 오류
- 생활코딩
- 맥 아파치
- 제이쿼리연결
- jquery 사용하기
- 자바스크립트 배열 할당
- 자바스크립트
- 제이펍 출판
- 비주얼스튜디오 코드
- 자바스크립트 객체
- 자바스크립트 class
- 자바스크립트 객체 만들기
- SwiftUI 기반의 iOS 프로그래밍
- 객체지향
- 한글입력 씹힘
- 한글입력 잘림
- 한글잘림
- 기획자랑 사이좋게 지내고 싶다
- 맥 mysql
- max MySQL
- python GUI 사용하기
- python tkinter 인터페이스
- 객체
- 한글입력 안됨
- 닐 스미스 지음
- 황반석 옮김
- 블록 스코프
- Today
- Total
java,javascript,android,php,sql,공부용,메모용
Node.js / 런타임, 이벤트 기반, 논 블로킹 본문
Node.js
Node.js는 chrome V8 javascript 엔진으로 빌드된 javascript 런타임 이다
- 서버 애플리케이션을 실행함
서버를 실행할 수 있는 것
- 노드를 통해 다양한 자바스크립트 애플리케이션을 실행 할 수도 있다.
서버만을 실행하는 것은 아니며 자바스크립트 프로그램을 실행하는 런타임으로서 사용하는 방법을 배울 것
1) 런타임이란?
런타임은 프로그램이 실행되고 있는 때 존재하고 있는 곳을 말함
- 자바스크립트 런타임
노드는 자바스크립트 프로그램을 컴퓨터에서 실행할 수 있다.
노드는 자바스크림트의 실행기다.
(기존 자바스크립트는 웹 브라우저 위에서만 실행할 수 있었다 브라우저는 자바스크립트 런타임을 내장하고 있다 구글에서 v8엔진으로 크롬을 출시하고 노드 프로젝트를 시작했다…생략 )
노드는 V8과 libuv라는 라이브러리를 사용한다
V8과 libuv는 C와 C++언어로 구현되어있다 노드
자바스크립트 코드는 노드가 알아서 V8과 libuv에 연결해주기 때문에 C,C++을 몰라도 된다
Lib 라이브러리는 노드의 특성인 이벤트 기반, 논 블로킹 I/O 모델을 구현하고 있다
2) 이벤트 기반 event-driven
이벤트가 발생할 대 미리 지정해둔 작업을 수행하는 방식
이벤트로는 클릭이나 네트워크 요청 등이 있다.
이벤트 기반 시스템에서틑 특정 이벤트가 발생할 때 무엇을 할지 미리 등록해야한다
이를 이벤트 리스너(event listener)에 콜백(callback)함수를 등록한다고 표현한다.
이벤트 기반 모델에서는 이벤트 루프(event loop) 개념이 나온다
이벤트 루프는 여러 이벤트가 동시에 발생할때 어떤 순서로 콜백 함수를 호출할지를 이벤트 루프가 판단한다
- 이벤트 루프를 모른다면 자바스크립트를 다시 공부해야한다
function first () {
second();
console.log(‘첫 번째’);
}
function second () {
third();
console.log(‘두 번째’);
}
function third () {
console.log(‘세 번째’);
}
First() 실행을 햇으니 그 안의 second() 실행 second()안의 third() 실행
function first () {
function second () {
function third () {
console.log(‘세 번째’);
}
console.log(‘두 번째’);
}
console.log(‘첫 번째’);
}
대략 이런식으로 이해하면된다 순서대로 차근차근 실행됨
1000분의1초 이후에 코드를 실행하는 setTimeout을 사용한 코드
콘솔에 어떤 로그가 기록될지 예측하기 (답은 안써두겠음)
이 내용을 파악하려면 이벤트 루프, 태스크 큐(task queue), 백그라운드(background)를 알아야한다
functin run() {
console.log(‘3초 후 실행’);
}
console.log(‘시작’)
setTimeout(run, 3000);
console.log(‘끝’)
- 이벤트 루프 : 이벤트 발생 시 호출할 콜백 함수 관리, 호출된 콜백 함수 실행 순서 결정 역할, 노드 종료될 때까지 이벤트 처리를 위한 작업을 반복
- 백그라운드 : setTimeout 같은 타이머나 이벤트 리스너들이 대기하는 곳, 자바스크립트가 아닌 다른 언어로 작성된 프로그램이라고 봐도 됨, 여러 작업을 동시에 실행될 수 있다.
- 태스크 큐 : 이벤트 발생 후 백그라운드에서는 태스크 큐로 타이머나 이벤트 리스너의 콜백 함수를 보냄, 정해진 순서대로 콜백들이 줄을 서 있어 콜백 큐라고 부른다, 콜백들은 완료된 순서로 줄을 서 있지만 특정한 경우 순서가 바뀐다.
3) 논 블로킹 I/O
이벤트 루프를 활용하면 오래 걸리는 작업을 효율적으로 처리할 수 있다.
작업에는 두가지 종류가 있다 1.동시에 실행될 수 있는 작업 2. 동시에 실행될 수 없는 작업
우리가 작성하는 자바스크립트 코드는 동시에 실행될 수 없다
자바스크립트상에서 돌아가는 것이 아닌 I/O 작업 같은 것은 동시에 처리될 수 있다.
I(입력input)/O(출력Output)을 의미함
파일 시스템 접근 (파일 읽기, 파일 쓰기, 폴더 만들기 등) 이나 네트워크를 통한 요청 같은 작업이 I/O의 일종이다
- 논 블로킹이란 이전 작업이 완료될 때까지 대기하지 않고 다음 작업을 수행함을 뜻함
- 블로킹이란 이전 작업이 끝나야만 다음 작업을 수행함
- 블로킹 방식 코드
function longRunningTask() {
// 오래 걸리는 작업
console.log(‘작업 끝’)
}
console.log(‘시작’)
longRunningTask();
console.log(‘다음 작업’);
- 논 블로킹 방식 코드
function longRunningTask() {
// 오래 걸리는 작업
console.log(‘작업 끝’)
}
console.log(‘시작’)
setTimeout(longRunningTask, 0);
console.log(‘다음 작업’);
여기서 setTimeout(콜백, 0) 은 논 블로킹을 만들기 위한 사용 기법 중 하나이다.
노드에서의 블로킹은 동기와 유사하고 논 블로킹은 비동기와 유사하다
4) 싱글 스레드
싱글 스레드는 스레드가 하나뿐이라는 것을 의미함
스레드를 이해하려면 프로세스를 알아야한다
-프로세스와 스레드의 차이
* 프로세스 | * 스레드 |
프로세스는 운영체제에서 할당하는 작업의 단위 노드나 웹 브라우저 같은 프로그램은 개별 적인 프로세스다 프로세스 간에는 메모리 등 자원을 공유하지 않는다 |
스레드는 프로세스 내에서 실행되는 흐름의 단위 프로세스는 스레드를 여러개 생성해 여러 작업을 동시에 처리할 수 있다. 스레드들은 부모 프로세스의 자원을 공유한다. 같은 주소의 메모리에 접근 가능하므로 데이터를 공유할 수 있다. |
스레드풀, 워커 스레드
노드가 싱글 스레드로 동작하지 않는 두 가지 경우가 있다.
스레드풀 (Thread Pool) : 노드가 특정 동작을 수행할 때 스스로 멀티 스레드를 사용한다 (암호화, 파일 입출력, 압축 등)
워커 스레드(Worker Thread) : 노드 12 버전에서 안정화된 기능으로 이제 노드에서 멀티 스레드를 사용할 수 있게 되엇다 CPU 작업(연산이 많은 작업)이 많은 경우 워커 스레드를 사용하면 된다.
싱글 스레드와 멀티 스레드는 주방->점원->손님으로 이해하면 편하다 책 37p에서 확인
*싱글 스레드의 블로킹 점원이 고객1에게 주문을 받고 주방에 전달 후 서빙까지 다하고 고객2로 넘어간다면 |
*싱글 스레드의 논블로킹 점원이 고객1에게 주문을 받고 주방에 전달 고객2 주문받고 주방에 전달 고객3 주문 받고 주방에 전달 그사이사이 주문한 음식이 나오면 서빙 |
*멀티 스레드 블로킹 1:1로 점원 1명당 고객1명 주문 전달 서빙까지 노는시간이 있음 자원낭비 멀티 스레드 방식의 프로그래밍은 어려워서 멀티 프로세싱 방식을 대신 사용한다 I/O 요청에는 멀티 프로세싱이 효율적이다. |
멀티 스레딩과 멀티 프로세싱 비교
멀티 스레드 | 멀티 프로세싱 |
하나의 프로세스 안에서 여러 개의 스레드 사용 CPU 작업이 많을 때 사용 프로그래밍이 어려움 |
여러 개의 프로세스 사용 I/O 요청이 많을 때 사용 프로그래밍이 비교적 쉬움 |
서버에서의 노드
노드를 서버로 사용할 때의 특성과 장단점
노드는 싱글 스레드, 논 블로킹 모델을 사용하기에, 노드 서버 또한 동일한 모델일 수 밖에 없다.
노드 서버의 장단점은 싱글 스레드, 논 블로킹 모델의 장단점과 크게 다르지 않습니다.
서버에는 기본적으로 I/O 요청이 많이 발생한다.
노드는 (논 블로킹 방식 코드로 작성했다는 가정) libuv 라이브러리를 사용해 I/O 작업을 논 블로킹 방식으로 처리한다.
스레드 하나가 많은 수의 I/O를 혼자서도 감당 할 수 있다.
그러나, CPU 부하가 큰 작업에는 적합하지 않는다. 코드가 CPU연산을 많이 요구하면 힘듬
노드를 어디에 사용할까?
개수는 많지만 크기는 작은 데이터를 실시간으로 주고 받는 데 적합하다.
- 네트워크나 데이터베이스 -> 디스크 작업 같은 I/O 에 특화되어 있기 때문
- 실시간 채팅 애플리케이션
- 주식 차트
- JSON 데이터를 제공하는 API 서버
노드 12 버전에서는 워커 스레드 기능으로 멀티 스레드 작업이 가능 -> 프로그래밍이 어렵다.
** 싱글 스레드는 하나뿐인 스레드가 에러로 멈추지 않도록 잘 관리해야 한다.
하나뿐인 스레드가 죽어버려서 서버 전체가 멈추지 않도록....
서버의 규모가 커지면 nginx 등 웹 서버를 노드 서버와 연결해야 한다.
장 | 단 |
멀티 스레드 방식에 비해 적은 컴퓨터 자원 | 기본적으로 싱글 스레드라서 cpu 코어를 하나만 사용 |
i/o 작업이 많은 서버로 적합 | cpu 작업이 많은 서버로 부적합 |
멀티 스레드 방식보다 쉬움 | 하나뿐인 스레드가 멈추지 않도록 관리 |
웹 서버가 내장되어 있음 | 서버 규모가 커지면 서버 관리가 힘듬 |
자바스크립트 사용 | 어중간한 성능 |
JSON 형식과 쉽게 호환 |
++ 템플릿 엔진을 통해 다른 언어와 비슷하게 콘텐츠를 제공할 수 있다.
템플릿 엔진으로는 넌적스(Nunjucks), 퍼그(Pug), EJS 같은게 있다.
노드를 사용하는 결제서비스도 꽤 된다 페이팔, 월마트, 이베이 등
에어비앤비, 우버, 넷플릭스 등 그렇다고 한다.
서버 외의 노드
노드는 점점 웹, 모바일, 데스크톱 애플리케이션 개발에 사용되기 시작함
웹 프레임워크로 앵귤러, 리액트, 뷰 등이 있고
앵귤러는 구글 진영에서 프런트엔드 앱을 만들 떄 주로 사용 리액트는 페이스북 진영에서 주로 사용
모바일 개발 도구로 리액트 네이티브를 많이 사용함
페북,인스타,핀터레스트,월마트,테슬라 등이 리액트 네이티브 사용해 앱을 운영중
데스크톱 개발 도구로 일렉트론이 대표적이다 일렉트론으로 만들어진 프로그램 아톰, 스택, 디스코드, 비주얼 스튜디오 코드 등이 있다
책에서는 비주얼스튜디오로 한다고 함
'javascript, jQuery & Node.js > Node.js' 카테고리의 다른 글
타이머 setTimeout, setInterval, setImmediate - 노드기능 04 (0) | 2022.12.09 |
---|---|
global 노드 내장 객체 console - 노드기능 03 (0) | 2022.12.09 |
모듈, 모듈화하기, 노드 모듈 - 노드기능 02 (0) | 2022.12.09 |
REPL node 사용해보기 - 노드기능 01 (0) | 2022.12.09 |
Node.js 설치하기 (0) | 2022.01.02 |