섹션 0. 노드 Intro

1. 노드의 정의

Node.js는 자바스크립트 런타임이다.

런타임이란?

  • 런타임은 프로그래밍 언어가 구동되는 환경이다. 즉 어떤 프로그램이 동작할 때, 프로그램이 동작하는 장소이다.
  • 크롬, 사파리 같은 웹 브라우저가 바로 JavaScript 런타임이다.

노드는 서버가 아닌가요?

  • 서버의 역할도 수행할 수 있는 자바스크립트 런타임
  • 노드로 자바스크립트로 작성된 서버를 실행할 수 있음
  • 서버 실행을 위해 필요한 http/https/http2 모듈을 제공

➡️ 노드 자체는 서버가 아니다!

역할 정리

  • 자바스크립트: 언어
  • 노드: 런타임
  • 자바스크립트 엔진: V8

2. 노드의 특성

1. 이벤트 기반

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

  • 이벤트의 예: 클릭, 네트워크 요청, 타이머 등
  • 이벤트 리스너: 이벤트를 등록하는 함수
  • 콜백 함수: 이벤트가 발생했을 때 실행될 함수

이벤트 리스너에 콜백 함수 등록 -> 시스템에서 이벤트 발생 -> 등록된 콜백 함수 호출

2. 논블로킹 I/O

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

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

➡️ I/O 작업이 많을 때 노드 활용성 굳.

➡️ 노드는 블로킹이면서 동기, 비동기면서 논블로킹

동기 코드가 순서대로 실행, 비동기 코드가 순서대로 실행 ❌
블로킹 코드가 순서대로 실행, 논블로킹 코드가 순서대로 실행 ❌

3. 프로세스 vs 스레드

프로세스: 운영체제에서 할당하는 작업의 단위, 프로세스 간 자원 공유 없음
스레드: 프로세스 내에서 실행되는 작업의 단위, 부모 프로세스 자원 공유 가능

  • 노드 프로세스는 멀티 스레드이지만 직접 다룰 수 있는 스레드는 하나이기 때문에 싱글 스레드라고 표현한다.

  • 노드는 주로 멀티 스레드 대신 멀티 프로세스를 활용한다.

4. 싱글 스레드

싱글 스레드라 주어진 일을 하나밖에 처리하지 못함

  • 블로킹이 발생하는 경우 나머지 작업은 모두 대기 -> 비효율

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

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

5. 멀티 스레드 모델과의 비교

싱글 스레드 모델은 에러를 처리하지 못하는 경우 멈춘다.

  • 프로그래밍 난이도 쉽고, CPU, 메모리 자원 적게 사용

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

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

➡️ 멀티스레드를 사용하지 않기위해 노드를 하는 것!


3. 서버로서의 노드

서버: 네트워크를 통해 클라이언트에 정보나 서비스를 제공하는 컴퓨터 또는 프로그램
클라이언트: 서버에 요청을 보내는 주체(브라우저, 프로그램, 앱, 서버 등)

노드는 서버가 아니다!
그러나, 노드는 서버를 구성할 수 있게 하는 모듈을 제공한다.

서버 외의 노드

  • 자바스크립트 런타임이기 때문에 용도가 서버에만 한정되지 않음
  • 웹, 모바일, 데스크탑 애플리케이션에도 사용
    웹: React, Vue 등 / 모바일: React Native / 데스크탑 개발 도구: Electron

섹션 2. 노드 기본 기능 익히기

1. REPL와 js 파일 실행하기

REPL

자바스크립트는 스크립트의 언어라서 즉석에서 코드를 실행할 수 있다.

  • REPL이라는 콘솔 제공
  • R(Read), E(Evaluate), P(Print), L(Loop) 읽고 실행하고 출력하고 반복!
  • 터미널에 node 입력

2. Common JS 모듈 시스템

모듈?

특정한 기능을 수행하는 함수나 변수들의 집합이다.

  • 노드는 자바스크립트 코드를 모듈로 만들 수 있다.
  • 코드가 길면 잘게 잘게 여러 파일로 쪼갤 수 있다
    ➡️ 관리하기 쉬워짐!
    ➡️ 재사용!

var.js

const odd = '홀수입니다';
const even = '짝수입니다';

module.exports = {
    odd,
    even,

}; //객체임

func.js

const {odd, even} = require('./var');

function checkOddOrEven(number) {
    if (number % 2) {
        return odd;
    } else {
        return even;
    }
}

module.exports = checkOddOrEven;

index.js

const { odd, even } = require('./var');
const checkNumber = require('./func');

function checkStringOddEven(str) {
    if (str.length % 2) {
        return odd;
    } else {
        return even;
    }
}

console.log(checkNumber(10));
console.log(checkStringOddEven('hello'));

터미널

node index

실행 결과

profile
안녕하세요

0개의 댓글

Powered by GraphCDN, the GraphQL CDN