wintertreey 님의 블로그
동기 비동기 본문
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' 카테고리의 다른 글
회원 CRUD, splice() (0) | 2024.08.13 |
---|---|
경로세팅, 라우팅, cors에러 (0) | 2024.08.11 |
웹서버 모듈: http, figlet, express, nodemon (1) | 2024.08.11 |
이벤트, 예외처리 (2) | 2024.08.11 |
Node.js 개념 (0) | 2024.08.08 |