Node.js

Node.js 용어 정리 - 1주차

추운날_너를_기다리며 2024. 8. 29. 21:14

1. Node.js

  • Node.js는 Chrome V8 JavaScript 엔진으로 빌드된 JavaScript 런타임입니다.
  • Node.js는 Javascript를 브라우저가 아닌 컴퓨터에서 브라우저 없이 실행하게 도와주는 환경입니다.
  • Node.js는 논 블록킹(Non-blocking) I/O, 싱글 스레드(Single Thread), 이벤트 루프(Event Loop)의 특성이 있습니다.
  • 논 블록킹 I/O (Non-Blocking Input/Output)
    • 블로킹 I/O 논 블로킹 I/O는 프로그램의 실행 흐름을 제어하는 방식입니다.
    • 블로킹 방식은 프로그램이 특정 작업을 수행하는 동안 다른 작업을 중단시키는 방식
    • 논 블로킹 방식은 프로그램이 여러 작업을 동시에 처리할 수 있는 장점
  • 스레드 란 프로그램이 동작할 때, CPU 또는 프로세서사용하는 단위로, 여러 스레드를 사용하면 여러 작업을 동시에 처리할 수 있습니다.
  • Node.js는 싱글 스레드로 동작하지만, I/O 작업이 발생한 경우 이를 비동기적으로 처리하여 여러 작업을 동시에 처리할 수 있게 합니다.
  • Race condition란 여러 스레드가 공유하는 자원에 대한 동시접근 문제, ex) let a = 3;값을 3 -> 5 -> 7 이렇게 두번 2씩 늘려야하는데 Race condition에 의해서 여러 쓰레드가 a에 들어와 a = 3 => 5 => 7이 아닌 a = 3 => 5로 바뀐 a = 5 => 7이어야 하는걸 아직 5로 바뀐걸 모르고 a = 3 =>5라는게 두번 입력되어 a의 결과 값이 5로 나오는 문제 물론 저런 간단한 코드에서 발생하진 않습니다.
  • Node.js가 싱글 스레드를 고집하는 이유는?
    • 스레드 생성과 관리에 드는 부담을 줄여주며, 컴퓨터 리소스를 효율적으로 사용할 수 있게 합니다.
    • 또한, 한 번에 하나의 작업만 처리하기 때문에 동시성 문제, 즉 Race condition 문제를 방지 합니다.
    • Node.js의 싱글 스레드 + 이벤트 루프 방식을 사용하면, 동시에 많은 요청을 효율적으로 처리할 수 있습니다.
    • 위의 특징 덕분에 연결 요청에 따른 서버 확장이 매우 자유롭습니다.
  • 호출 스택(Call Stack)
    • 호출 스택은 함수의 실행 순서를 추적하는 자료구조입니다.
    • 자바스크립트 코드를 실행하면 호출 스택에 함수를 추가하고 함수가 완료되면 호출 스택에서 제거합니다.
    • 위의 내용은 비동기 작업에서 문제가 되는데, 특히 네트워크 요청과 같이 시간이 많이 걸리는 작업을 기다리는 동안
    • JavaScript는 다른 어떠한 작업도 처리할 수 없게 됩니다.
    • 위의 문제를 해결하기 위해서 JavaScript는 이벤트 루프와 이벤트 큐를 사용하게 됩니다.
  • 이벤트 루프(Event Loop)
    • 이벤트 루프는 여러 이벤트들과 같은 비동기 작업들을 모아서 관리하고, 어떤 순서대로 실행해야하는지 도와주는 도구입니다.
    • 이벤트 루프는 호출 스택과 이벤트 큐를 관찰하면서, 호출 스택이 비어있고, 이벤트 큐에 작업이 있다면, 이벤트 큐의 작업을 호출 스택으로 이동하는 역할을 담당합니다.
    • 이벤트 루프를 활용한다면, 자바스크립트는 시간이 오래 걸리는 작업을 이벤트 큐에 넣어 비동기적으로 처리하고, 그 동안 호출 스택에서 다른 작업들을 계솔 처리할 수 있습니다.

 

2. 개발 환경 설정하기

  • IDE란 통합 개발 환경(Integrated Development Environment)으로 여러가지의 개발자 툴을 결합하여 개발에 관련된 모든 작업을 하나의 프로그램 안에서 처리할 수있는 환경을 제공하는 소프트웨어 입니다.
  • REPL 환경이란? (Read Evaluate Print Loop)
    • 입력 받은 코드를 읽어들여 메모리에 저장하고, 평가된 값을 출력합니다.
      이때 특정 신호를 입력받기 전까지 위의 과정을 반복합니다.
    • 쉽게 말하자면, 사용자가 입력한 코드의 결과를 즉시 확인할 수 있기 때문에 간단한 코드 문법을 테스트하는데 아주 적합한 개발 환경을 REPL 환경이라고 합니다.
    • Node.js REPL 환경은 백엔드 서버(Server)의 코드를 테스트하거나 실험해보는 데에 더 적합하고, 웹 브라우저 콘솔은 클라이언트(Client)의 코드를 작성하거나 테스트 하는데에 더 적합합니다.
  • 깃(Git)은 프로그래밍 파일의 변경 사항을 추적하고, 여러 개발자들 간의 공동 작업을 조율하는 것을 도와주는 분산 버전 관리 시스템입니다.

3. Package Manager

  • Package 란? Node.js에서 코드의 재사용성을 높이기 위해 작성된 독립적인 코드 조각을 "모듈"이라고 부릅니다. 이러한 모듈을 npm이나 yarn과 같은 패키지 매니저를 통해 업로드하여 다른 개발자들과 공유할 때, 이를 패키지라고 합니다.
  • 즉, 모듈은 일반적인 프로젝트 내에서 사용되는 코드 조각을 의미하며, 패키지는 이러한 모듈을 포함하고 있거나 다른 패키지에 의존하고 있는 코드의 집합을 의미합니다.
  • Package Manager란 패키지를 손쉽게 다루는 작업을 안전하고 편리하게 사용하기 위한 툴입니다.
  • 패키지 매니저는 다른 개발자들이 작성한 코드를 쉽게 다운로드 받거나, 혹은 저희가 작성한 코드를 배포하여 다른 사람들에게 제공할 수 있게 됩니다.
  • Node.js에서 대표적으로 사용하는 패키지 매니저는 npm과 yarn이 존재합니다.

4. Express.js 프레임 워크

  • 웹 프레임워크(Web Framework)란 웹 서비스를 빠르게 구현할 수 있게 도와주는 도구입니다.
  • 웹 프레임워크는 이미 만들어진 툴을 사용해가지고 이미 만들어진 기능들을 재상요하고, 이를 재조립하여 웹 서비스를 만드는 것 입니다.
  • Express.js란 Node.js로 서버를 빠르고 간편하게 만들 수 있게 도와주는 가장 대표적인 웹 프레임워크입니다.
  • Express.js의 가장 큰 특징은 Middleware(미들웨어)를 지원하는 것입니다.
  • 미들웨어는 사용자의 요청과 응답 사이에 위치하며, 특정 기능을 수행하는 함수로 예를 들어 인증, 로깅, 에러 처리 핸들러 등을 담당하는 다양한 미들웨어를 사용할 수 있게 됩니다.

5. ES6 Module 시스템 알아보기

  • Module이란? Javascript를 파일 단위분리된 코드 조각 또는 덩어리를 일컫습니다.
  • 여기서 Javascript 파일특정한 기능을 가진 여러 개의 함수와 변수들의 집합체입니다.
  • 모듈은 하나의 모듈에서 다른 모듈을 호출하여 사용할 수 있습니다.
  • 모듈은 그 자체로도 하나의 프로그램이면서 다른 프로그램의 부품으로도 사용할 수 있습니다.
  • 보통 1개의 파일이 1개의 모듈이 됩니다.
  • 모듈은 왜 필요할까?
    • 코드 베이스를 분리할 수 있으며, 이를 통해 코드를 구조적으로 관리할 수 있습니다.
    • 코드를 재사용 가능하게 만들어줍니다. 즉, 모듈화 됩니다.
    • 코드의 함수와 변수중 일부만 외부에서 사용하도록 노출시킬 수 있습니다. (정보 은닉)
    • 해당 모듈이 참조하고 있는 다른 모듈에 대한 종속성을 관리하는 역할을 담당합니다.
  • CJS(CommonJS)는 다른 Node.js 환경에서 기본적으로 사용되는 모듈 시스템입니다.
    • 설정을 따로 추가하지 않는 이상, Node.js에서는 CommonJS를 기본으로 사용하게 됩니다.
    • require 함수를 사용하여 다른 모듈을 불러올 수 있습니다.
    • require 함수는 경로 혹은 문자열을 가지고 내부 알고리즘을 통해 모듈을 가져오고 종속성 처리르 합니다.
  • ESM(ECMA Script Module)은 최신 JavaScript에서 지원하는 모듈 시스템입니다.
    • 모든 Javascript 환경에서 통합적인 인터페이스를 제공하기 위해 시작된 체계입니다.
    • CJS와는 다르게 정적(Static)으로 모듈을 가져오며 비동기적 모듈 로딩과 순환 종속을 처리 합니다.
  • 정적 모듈 로딩 방식
    • 정적 모듈 로딩 방식은 모든 모듈을 한 번에 로딩하여 메모리에 올리는 방식입니다.
    • 일반적으로 스크립트가 실행되기 전에 모든 모듈이 미리 로딩되므로, 모듈 간의 의존성 관계를 파악하고 로딩 순서를 지정해야 합니다.
    • 정적 모듈 로딩 방식은 모든 모듈을 미리 로딩하기 때문에 초기 로딩 시간이 오래 걸릴 수 있지만, 실행 중에 모듈을 동적으로 로딩할 필요가 없어 일관된 동작을 보장할 수 있습니다.
import { moduleA, moduleB } from './modules';
// 모듈 A와 모듈 B를 로딩

// 이어서 모듈 A와 모듈 B를 사용하는 코드 작성

 

  • 동적 모듈 로딩 방식
    • 동적 모듈 로딩 방식은 필요한 모듈을 해당 모듈이 필요한 시점에 동적으로 로딩하는 방식입니다.
    • 이는 웹 페이지의 로딩 속도와 성능을 향상시킬 수 있는 장점을 가지고 있습니다.
    • 동적 모듈 로딩을 사용하기 위해서는 import() 함수를 사용합니다.
    • 이 함수를 통해 모듈을 비동기적으로 로딩하고, 로딩이 완료된 후에 해당 모듈을 사용할 수 있습니다.
    • 동적 모듈 로딩 방식은 필요한 모듈만 로딩하므로 초기 로딩 시간이 줄어들고, 모듈간의 의존성을 동적으로 관리할 수 있습니다.
import('./modules')
  .then((module) => {
    // 모듈 로딩이 완료된 후에 실행되는 코드
    const { moduleA, moduleB } = module;
    // 모듈 A와 모듈 B를 사용하는 코드 작성
  })
  .catch((error) => {
    // 모듈 로딩 중에 에러가 발생한 경우 처리하는 코드
    console.error(error);
  });

 

  • Module 정리하기
    • 모듈은 크게 보았을 때, JavaScript 코드를 논리적인 단위로 나누는 방법입니다.
    • 만약, 모듈을 도입하게 된다면, 코드의 재사용성을 높이고, 코드를 분리하여 관리할 수 있기 때문에 유지 보수가 수월해집니다.
    • 또한, 모듈은 코드의 네임스페이스(Name Space)를 분리하여, 같은 이름의 함수나 변수가 충돌하는 것을 방지하게 됩니다.

 

'Node.js' 카테고리의 다른 글

데이터 링크 계층에 관하여...  (1) 2024.09.03
물리 계층이란?  (1) 2024.09.03
Node.js 용어 정리 - 2주차  (0) 2024.08.30
TextRPG 만들기 - 1탄  (0) 2024.08.22
2024-08-12  (0) 2024.08.12