본문 바로가기

WINK-(Web & App)/Express.js (Node.js) 스터디

[2024-2 Node.js 스터디] 류상우 #1주차

반응형

1. 핵심 개념 이해하기

 

1-1. 서버

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

  • 클라이언트: 요청을 보내는 주체(브라우저, 데스크탑 프로그램, 서버 등)

1-2. 자바스크립트 런타임

Node.js: Chrome V8 Javascript 엔진으로 빌드된 자바스크립트 런타임

  • 런타임: 특정 언어로 만든 프로그램들을 실행할 수 있는 환경
  • V8: 구글에서 개발한 크롬의 엔진, 기존 JS의 문제였던 속도를 보완
  • libuv: 노드에서 사용하는 라이브러리로 노드의 특성인 이벤트 기반, 논블로킹 I/O 모델을 구현

1-3. 이벤트 기반

이벤트 기반: 이벤트(클릭, 네트워크 요청 등) 가 발생할 때 미리 지정해둔 작업을 수행하는 방식

  • 특정 이벤트가 발생할 때 수행할 것을 미리 설정해야함. 이를 이벤트 리스너에 콜백 함수를 등록한다고 표현

  • 이벤트 루프: 이벤트 발생 시 호출할 콜백 함수들을 관리하고, 호출된 콜백 함수의 실행 순서를 결정
  • 호출 스택: 스택(후입선출) 구조로 실행된 순서대로 함수를 호출 스택에 넣음
  • 백그라운드:  setTimeout 같은 타이머나 이벤트 리스너들이 대기하는 곳, 여러 작업이 동시에 실행될 수 있음
  • 태스크 큐(콜백 큐): 이벤트 발생 후, 백그라운드에서는 태스크 큐로 타이머나 이벤트 리스너의 콜백 함수를 보냄. 콜백은 보통 완료된 순서대로 정렬되지만 특정한 경우 순서 변경도 가능


1-4. 논블로킹 I/O

블로킹: 이전 작업이 끝나야만 다음 작업을 수행

 

논블로킹: 이전 작업이 완료될 때까지 대기하지 않고 다음 작업을 수행. 

  • ex) I/O(input/output) 작업 - 파일 시스템 접근이나 네트워크를 통한 요청 등
  • setTimeout(콜백, 0) 으로 코드를 논블로킹으로 바꿀 수 있음
    • 노드에서는 setImmediate를 주로 사용
  • 코드를 논블로킹 방식으로 작성하더라도 전부 직접 작성한 코드라면 소요 시간이 짧아지지는 않지만 실행 순서를 바꾼다는 점에서 의의가 있음.

1-5. 싱글스레드

싱글스레드: 스레드가 하나 뿐이라는 것을 의미

  • 스레드: 프로세스 내에서 실행되는 흐름의 단위
    • 부모 프로세스의 자원을 공유
    • 같은 주소의 메모리에 접근 가능하므로 데이터를 공유할 수 있음
  • 프로세스: 운영체제에서 할당하는 작업의 단위
    • ex) 노드/웹 브라우저 같은 프로그램은 개별적인 프로세스
    • 스레드를 여러개 생성해 동시 작업 가능
    • 각 프로세스는 메모리 등의 자원을 공유하지 않음

  • 노드는 싱글스레드?
    • 노드의 프로세스에 여러 스레드가 있지만 그 중 하나만 제어 가능하기에 싱글스레드로 여김
    • 스레드 풀: 암호화, 파일 입출력, 압축 등의 동작을 수행할 때 노드 스스로 멀티 스레드를 사용
    • 워커 스레드: 직접 다수의 스레드를 다룰 수 있으며 CPU 작업이 많을 때 사용함
  • 멀티 프로세싱: 여러 개의 프로세스를 사용
    • I/O 요청이 많을 때 사용
    • 멀티 스레딩에 비해 프로그래밍이 쉬움

2. 서버로서의 노드

특성

  • libuv 라이브러리를 사용해 I/O 작업을 논블로킹 방식으로 처리
  • 작성한 코드는 모두 스레드 하나에서 처리되므로 많은 CPU 연산을 감당하기 힘듦
  • 개수는 많지만 크기는 작은 데이터를 실시간으로 주고 받는 데 적합
    • ex) 네트워크, 데이터베이스, 디스크 작업

장점

  • 멀티 스레드 방식에 비해 적은 컴퓨터 자원 사용
  • I/O 작업이 많은 서버로 적합
  • 멀티 스레드 방식보다 쉬움
  • 웹 서버가 내장되어 있음
  • 자바스크립트를 사용함
  • JSON 형식과 쉽게 호환됨

단점

  • 기본적으로 싱글 스레드라서 CPU 코어를 하나만 사용
  • CPU 작업이 많은 서버로는 부적합
  • 하나뿐인 스레드가 멈추지 않도록 관리 필요
  • 서버 규모가 커졌을 때 서버를 관리하기 어려움
  • 어중간한 성능

3. 서버 외의 노드

웹 프레임워크: 앵귤러(Google), 리액트(Facebook), 뷰

모바일 개발: 리액트 네이티브(Instagram, Pinterest)

데스크탑 개발: 일렉트론(VS Code, Discord)


4. 개발 환경 설정하기

노드 설치
npm 버전 업데이트
에디터 설치


5. 함께 보면 좋은 자료

 

반응형