동기 비동기
Node File System 모듈
파일시스템 모듈이란, 파일 처리와 관련된 작업을 하는 모듈로 보통 FileSystem을 줄여서 fs 모듈이라고 줄여 부릅니다.
노드에서 가장 많이 쓰이고 중요한 모듈 중 하나입니다.
fs 모듈에는 대부분의 메소드들이 동기/비동기로 나뉘는데, Sync라는 이름이 붙어있는 메소드가 동기방식을 사용한다고 보면 됩니다.
동기적 읽기 방식을 사용하면 파일을 읽으면서 다른 작업을 동시에 할 수 없습니다.
하지만 비동기적으로 읽으면 파일을 읽으면서 다른 작업도 동시에 수행할 수 있고, 파일을 다 읽으면 매개변수 callback으로 전달한 함수가 호출됩니다.
주로 비동기적 형식을 많이 사용하지만, 서버 시작 시 세팅 파일을 읽는 작업과 같이 동기적 형식이 더 적절한 경우도 있습니다.
동기와 비동기 메소드
setTimeout 등은 비동기 처리를 한다. fs 모듈의 경우도 그러한 메소드를 많이 가지고 있다.
fs 모듈은 비동기 처리가 기본.
동기
1번완료 후 2번완료 후 3번 수행
비동기
1번 호출 후 반환을 기다리지 않고, 다른작업(예를 들어 3번호출 등)을 수행
동기 수행
import {readFile} from "fs";
readFile('./ex3write.txt', (err, data) => {
if(err){
throw err;
}
console.log('1번', data.toString());
});
readFile('./ex3write.txt', (err, data) => {
if(err){
throw err;
}
console.log('2번', data.toString());
});
readFile('./ex3write.txt', (err, data) => {
if(err){
throw err;
}
console.log('3번', data.toString());
});
console.log();
fs 모듈은 비동기 처리가 기본.
이 때 결과를 순서대로 출력되도록 하려면 promise 객체를 사용한다.
동기 수
import { promises as fs } from "fs";
console.log("시작");
fs.readFile('./ex3write.txt')
.then((data) => {
console.log("1번", data.toString());
return fs.readFile('./ex3write.txt');
})
.then((data) => {
console.log("2번", data.toString());
return fs.readFile('./ex3write.txt');
})
.then((data) => {
console.log("3번", data.toString());
return fs.readFile('./ex3write.txt');
})
.catch((err) => {
console.log("💥💥", err);
});
console.log("The END");
BMI 계산법을 통해 동기와 비동기를 다시한번 확인 해보자.
비동기처리 async
import readline from "readline";
//BMI 판정 기준 함수 작성
const getBmiCategory = (bmi) => {
if(bmi < 18.5) return '저체중';
if(bmi >= 18.5 && bmi < 23) return '정상';
if(bmi >= 23 && bmi < 25) return '비만전단계';
if(bmi >= 25 && bmi < 30) return '1단계 비만';
if(bmi >= 30 && bmi < 35) return '2단계 비만';
return '3단계 비만';
}
//키보드 입력을 위한 readline 인터페이스 생성
// input 스트림에서 데이터를 읽고, output 스트림으로 데이터를 쓸 수 있게 함.
const rdata = readline.createInterface({
input:process.stdin,
output:process.stdout,
})
console.log('비동기 입력 시작');
//키 입력받기
rdata.question('키 (cm 단위): ', (height) => {
// 몸무게 입력받기
rdata.question('몸무게 (kg 단위): ', (weight) => {
console.log(`입력받은 몸무게: ${weight}`);
const heightMeter = parseFloat(height) / 100; // cm to meter
const weightKg = parseFloat(weight);
//bmi 계산
const bmi = weightKg / (heightMeter * heightMeter);
const category = getBmiCategory(bmi);
console.log(`당신의 BMI지수는 ${bmi.toFixed(2)}이고 체질량 지수는 ${category}`);
rdata.close(); //생성한 인터페이스 닫기
})
});
console.log('\n❄️비동기 처리');
readline 모듈의 question 메소드는 콜백함수를 사용해 비동기적으로 입력 처리해준다.
비동기방식으로 출력되기에 우리가 원하는 방식(예측되는방식)으로 출력되지 않는다.
동기식으로 처리해보자
동기처리 sync
import {createRequire} from 'module';
const require = createRequire(import.meta.url);
const readlineSync = require('readline-sync'); //동기방식을 도와준다. 순서대로 출력되게 해줌.
// 터미널 인코딩 작업 요.(window용)
if(process.platform === 'win32'){
require('child_process').execSync('chcp 65001'); //터미널의 코드 페이지를 utf-8로 설정
}
//BMI 판정 기준 함수 작성
const getBmiCategory = (bmi) => {
if(bmi < 18.5) return '저체중';
if(bmi >= 18.5 && bmi < 23) return '정상';
if(bmi >= 23 && bmi < 25) return '비만전단계';
if(bmi >= 25 && bmi < 30) return '1단계 비만';
if(bmi >= 30 && bmi < 35) return '2단계 비만';
return '3단계 비만';
}
console.log('키 입력 받기');
const height = readlineSync.question('키(cm 단위): ');
console.log(`입력받은 키: ${height}`);
console.log('몸무게 입력 받기');
const weight = readlineSync.question('몸무게(kg 단위): ');
console.log(`입력받은 몸무게: ${weight}`);
const heightMeter = parseFloat(height) / 100; // cm to meter
const weightKg = parseFloat(weight);
console.log('BMI계산');
//bmi 계산
const bmi = weightKg / (heightMeter * heightMeter);
const category = getBmiCategory(bmi);
console.log(`당신의 BMI지수는 ${bmi.toFixed(2)}이고 체질량 지수는 ${category}`);
console.log('\n❄️동기 처리');
readline-sync 모듈을 설치 후 사용해야한다. 터미널에 다음과 같이 적어 설치해주자.
npm install readline-sync
[NODE] 📚 fs 모듈 - 파일 제어 명령어 💯 정리
Node File System 모듈 파일시스템 모듈이란, 파일 처리와 관련된 작업을 하는 모듈로 보통 FileSystem을 줄여서 fs 모듈이라고 줄여 부릅니다. 노드에서 가장 많이 쓰이고 중요한 모듈 중 하나입니다. fs
inpa.tistory.com