Node.js 특성

5576 단어 node.jsnode.js

Node.js의 특성

Node.js의 특성에 대해서 알아보자.

1. Node.js는 이벤트 기반이다.

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

이벤트의 예로는 클릭, 네트워크 요청, 타이머 등이 있다.

이벤트 리스너는 이벤트를 등록하는 함수를 말한다.

콜백 함수는 이벤트가 발생했을때 실행될 함수를 말한다.

거의 대부분의 서버가 이벤트 형식이다.

2. 논블로킹 I/O

논 블로킹이란?

  • 오래 걸리는 함수를 백그라운드로보내서 다음 코드가 먼저 실행되게 하고, 나중에 오래 걸리는 함수를 실행

node는 블로킹이면서 동기 그리고 비동기면서 논블로킹 이다.

여기서 비동기면서 논블로킹일때 노드가 동시에 돌아간다고 오해를 많이 하는데 노드에서 동시라는걸 구현하는건 매우 힘들기 때문에 동시에 돌아가는 일부만 외우면 된다.

논 블로킹 방식 하에서 일부 코드는 백그라운드에서 병렬로 실행됨
일부 코드: I/O 작업(파일 시스템 접근, 네트워크 요청), 압축, 암호화등

I/O작업이 많을때 노드 활용성이 극대화된다.

동기면 코드가 순서대로 실행되고 비동기면 코드가 순서대로 실행되지 않는다.
블로킹이면 코드가 순서대로 논블로킹이면 순서대로 실행되지 않을수도 있다.

실행 컨텍스트와 이벤트 루프만 배우면 논블로킹때 어떻게 돌아가는지 예측이 가능하다.

3. 프로세스 vs 스레드

프로세스란?

  • 운영체제에서 할당하는 직업의 단위, 프로세스 간 자원 공유 X

스레드란?

  • 프로세스 내에서 실행되는 작업의 단위, 부모 프로세스 자원 공유

노드 프로세스는 멀티 스레드이지만 직접 다룰 수 있는 스레드는 하나이기 때문에 싱글 스레드라고 표현한다. 확인 방법은 작업표시줄로 검사하면 스레드가 여러개로 뜬다. 그런데 스레드는 여러개가 뜨지만 하나만 컨트롤 할 수 있기 때문에 싱글 스레드라고도 한다.

싱글 스레드

  • 싱글 스레드라 주어진 일을 하나밖에 처리하지 못함
    블로킹이 발생하는 경우 나머지 작업은 모두 대기해야 함 -> 비효율 발생

대신 논 블로킹 모델을 채개하여 일부 코드 I/O를 백 그라운드(다른 프로세스)에서 실행 가능

  • 요청을 먼저 받고, 완료될 때 응답함
  • I/O 관련 코드가 아닌 경우 싱글 스레드, 블로킹 모델과 같아짐

멀티 스레드 모델와의 비교

  • 싱글 스레드 모델은 에러를 처리하지 못하는 경우 멈춤
    프로그래밍 난이도가 쉽고, CPU, 메모리 자원을 적게 사용

멀티 스레드 모델은 에러 발생 시 새로운 스레드를 생성하여 극복

  • 단, 새로운 스레드 생성이나 놀고 있는 스레드 처리에 비용 발생
  • 프로그래밍 난이도가 어려움
  • 스레드 수만큼 자원을 많이 사용함

4. 서버로서의 노드

서버란?

  • 네트워크를 통해 클라잉너트에 정보나 서비스를 제공하는 컴퓨터 또는 프로그램

클라이언트란?

  • 서버에 요청을 보내는 주체(브라우저, 데스크탑 프로그램, 모바일 앱, 다른 서버에 보내는 요청을 보내는 서버)

노드 != 서버, 그러나 노드는 서버를 구성할 수 있게 하는 모듈이다.

노드 서버의 장단점

장점단점
멀티 스레드 방식에 비해 컴퓨터 자원을 적게 사용함싱글 스레드라서 cpu 코어를 하나만 사용함
I/O 작업이 많은 서버로 적합CPU 작업이 많은 서버로는 부적합
멀티 스레드 방식보다 쉬움하나뿐인 스레드가 멈추지 않도록 관리해야 함
웹 서버가 내장되어 있음서버 규모가 커졌을 때 서버를 관리하기 어려움
자바스크립트를 사용함
JSON 형식과 호환하기 쉬움

CPU 작업을 위해 AWS Lambda나 Google Cloud Functions같은 별도 서비 사용

페이팔 , 넷플릭스, 나사, 월마트, 링크드인, 우버 등에서 메인 또는 서브 서버로 사용

5. 호출 스택

자바스크립트의 기본 동작 원리를 한번 알아보자.

function run() {
  console.log('3초후 실행')
}
console.log('시작')
setTimeout(run, 3000)
console.log('끝') 

예를 들어 위와 같은 코드가 있을때 결과값이 어떻게 출력이 되는지 생각해보자.

정답은 '시작' -> '끝' -> '3초후 실행' 순으로 실행이 된다.

이유는 setTimeout이라는 비동기 함수가 존재하기 때문이다.

여기서 비동기 함수인 setTimeout은 호출 되고 끝나는데 비동기 함수임으로 백그라운드에 예를들어 (타이머(run, 3초))와 같이 코드 보내게 된다. 그리고 나서 호출 스택이랑 백그라운드랑 동시에 실행이 된다. 백그라운드에서는 3초후에 task queue에 run함수를 보내주고 호출스택이 비어있을때 함수들 하나하나를 다시 호출스택에 보내준다. 그리고 실행이 된다. 그리고 호출 스택에서 사라진다. 그리고 자바스크립트 실행이 종료된다.

여기서 주의할 점은 백그라운드가 먼저 끝나더라도 호출 스택이 먼저 끝나야만 실행이 된다.

한가지만 더 보고 넘어가겠다.

task queue에서 Promise.then or .catch 그리고 process.nextTick 같은 경우는 setTimeout같은 함수보다 우선 순위가 높아서 먼저 실행된다.

이것이 자바스크립트의 기본 동작원리인데 이것이 node.js에서도 적용이 된다.

6. 기타 문법

노드에서 사용하는 여러가지 내장 객체에 대해서 알아보자.

1. __filename, __dirname

__filename

  • 현재 파일 경로

__ dirname

  • 현재 폴더(디렉터리) 경로

2. module, exports

module.export 외에도 exports로 모듈을 만들 수 있다.

예를 들어

const odd = "홀수";
const even = "짝수";

module.exports= { odd, even }; 

에서 module.exports 부분을 아래와 같이 바꿀수 있다.

exports.odd = odd;
exports.even = even;

기본적으로 module.exports === exports === {} 이다.

그런데 module.exports에 함수를 넣게 되면

module.exports !== exports === {} 같이 변한다

이유는 둘의 참조 관계가 끊겨버린다.

또 exports.odd = odd 이렇게 선언을 하고 module.exports = {}

위 와 같이 선언해도 도 참조 관계가 끊기기 때문에 조심해야한다.

this

javascript에서 console.log(this);를 찍으면 windosw가 출력된다.

그런데 node.js에서는 global이 출력이 된다.

그런데 또 여기서 조건이 있는게 그냥 console.log(this)를 찍으면 {}(빈 객체)가 출력되고

함수 안에 넣어서 선언을 해야지만 global이 출력된다.

그 외에는 javascript랑 비슷하다.

암호화

암호화는 멀티쓰레드로 돌아간다.

암호화란

  • 평문을 암호로 만듦

복호화란

  • 암호를 평문으로 해독

node에서 사용 가능한 암호화 알고리즘은 현재 pbkdf2와 scrypt, bcrypt가 있다.

좋은 웹페이지 즐겨찾기