▪️오늘 과제
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 |
댓글