HANCOM AI ACAMEMY/수업 및 플젝

Node.js : 3월 31일

c'est sunny 2025. 3. 31.

▪️오늘 과제

CLI 메모장 만들기 

자바스크립트(Node.js)로 메모 입력받고 저장하여 RDS 데이터베이스에 업로드 되도록 하는 코드 작성

 

 

▪️CLI란? 

Command Line Interface : 명령줄 인터페이스(CLI)는 컴퓨터의 운영 체제와 상호 작용하는 명령을 입력할 수 있는 텍스트 기반 인터페이스

 

 

▪️FS란?

FS(File System)는 Node.js의 내장 모듈로, 파일 시스템과 상호작용할 수 있게 해줍니다.

 

이를 통해 파일을 읽거나 쓰고, 디렉터리를 생성하거나 삭제하는 등의 작업을 할 수 있습니다. 예를 들어, 파일을 비동기적으로 읽는 코드는 이렇게 작성할 수 있습니다:

const fs = require('fs');

fs.readFile('example.txt', 'utf8', (err, data) => {
  if (err) {
    console.error(err);
    return;
  }
  console.log(data);
});

fs 모듈은 동기적인 메서드와 비동기적인 메서드 둘 다 제공하므로 필요에 따라 선택해서 사용할 수 있어요!

 

 

▪️Node.js에서 스트림

const fs = require("fs");

console.log("before: ", process.memoryUsage().rss);
const readStream = fs.createReadStream("./big.txt");
const writeStream = fs.createWriteStream("./big2.txt");

readStream.pipe(writeStream);
readStream.on("end", () => {
  console.log("stream: ", process.memoryUsage().rss);
});

 

이 코드는 Node.js에서 스트림(stream)을 이용해 파일을 읽고 쓰는 방식으로, 메모리 사용량을 절약하면서 큰 파일을 복사하는 예제야.

 

코드 분석

const fs = require("fs");
  • Node.js의 fs(파일 시스템) 모듈을 불러옴.
console.log("before: ", process.memoryUsage().rss);
  • 현재 프로세스의 메모리 사용량을 출력 (rss: Resident Set Size, 실제 사용 중인 메모리)
const readStream = fs.createReadStream("./big.txt");
const writeStream = fs.createWriteStream("./big2.txt");
  • big.txt 파일을 읽는 읽기 스트림(readStream) 생성
  • big2.txt 파일을 쓰는 쓰기 스트림(writeStream) 생성
readStream.pipe(writeStream);
  • pipe()를 이용해 읽은 데이터를 바로 쓰기 스트림으로 전달
    • 즉, big.txt → big2.txt 복사
readStream.on("end", () => {
  console.log("stream: ", process.memoryUsage().rss);
});
  • 파일 복사가 끝나면, 최종 메모리 사용량을 출력

핵심 개념: 스트림(Stream)

  • 스트림을 사용하면 한 번에 파일 전체를 메모리에 올리지 않고 조각(chunk) 단위로 읽고 씀
  • 따라서 큰 파일도 적은 메모리 사용량으로 처리 가능
  • 반대로 fs.readFileSync() 같은 방식으로 파일을 한 번에 읽으면, 메모리를 많이 차지할 수 있음

실행 예제

예를 들어 big.txt가 1GB짜리 파일이라면,

  • fs.readFileSync()를 사용하면 1GB 메모리가 필요
  • 스트림(fs.createReadStream())을 사용하면 수십 MB 수준으로 처리 가능

이 코드 실행하면,

before:  25165824  # 실행 전 메모리 사용량 (약 25MB)
stream:  33554432  # 파일 복사 후 메모리 사용량 (약 33MB)

이런 식으로 스트림 덕분에 메모리 사용량이 급격히 증가하지 않음을 확인할 수 있어! 🚀

 

 

▪️운영체제에서 파일디스크립터

1. 파일 디스크립터(File Descriptor)란?

운영체제에서 파일을 다룰 때 사용하는 정수형 식별자로, 파일을 열면(OS가 파일을 추적할 수 있도록) 파일 디스크립터가 반환돼.

 

코드 분석

fs.open('./folder/file.js', 'w', (err, fd) => { ... });
  • fs.open()을 사용해 './folder/file.js' 파일을 쓰기 모드('w')로 엶.
  • 성공하면 파일 디스크립터 fd가 콜백으로 반환됨.
  • fd를 사용해 파일을 읽거나 쓸 수 있음.

fd 값 예시

빈 파일 만들기 성공 3

이처럼 fd는 일반적으로 양의 정수(예: 3, 4, 5 등)로 나타남. 파일을 열 때마다 새로운 숫자가 할당되고, 닫으면 해제돼.

 

 

2. 운영체제가 파일을 숫자(파일 디스크립터, fd)로 관리하는 이유

 

1️⃣ 숫자가 빠르고 가벼움

  • 파일을 다룰 때 경로 문자열("./folder/file.js") 대신 **정수(fd = 3)**를 사용하면
    → 메모리 절약 + 연산 속도 증가

문자열은 비교 연산이 복잡하지만, 숫자는 연산이 훨씬 빠름.

 

2️⃣ 운영체제(OS)의 시스템 콜 방식

운영체제는 모든 파일을 숫자로 식별하는 파일 디스크립터 테이블을 유지해.

파일 디스크립터(fd) 실제 파일 경로

0 stdin (표준 입력)
1 stdout (표준 출력)
2 stderr (표준 에러)
3 /folder/file.js
4 /home/user/data.txt
  • fs.open("./folder/file.js", "w", (err, fd) => {})
    → OS는 fd = 3 같은 숫자를 할당하고, 내부적으로 파일 정보를 저장.

이후 fs.write(fd, ...) 같은 함수를 호출하면 OS는 해당 fd에 연결된 파일을 바로 찾을 수 있음.

 

3️⃣ 리소스 관리를 쉽게 하기 위해

운영체제는 한정된 파일 핸들(파일 디스크립터 테이블 크기)을 가지고 있어서

  • 파일을 열면 새로운 숫자(fd)를 할당
  • 파일을 닫으면(fs.close(fd)) 숫자가 해제됨
    이런 식으로 자원을 관리해.

'HANCOM AI ACAMEMY > 수업 및 플젝' 카테고리의 다른 글

Python : 4월 10일  (0) 2025.04.10
Node.js : 4월 1일  (0) 2025.04.01
SQL : 3월 24일  (0) 2025.03.24
SQL : 3월 21일  (0) 2025.03.21
SQL : 3월 20일  (0) 2025.03.20

댓글