Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

wintertreey 님의 블로그

동기 비동기 본문

Node

동기 비동기

wintertreey 2024. 8. 11. 16:24

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 계산법을 통해 동기와 비동기를 다시한번 확인 해보자.

 

https://www.hanam.go.kr/health/contents.do?key=8926

 

비동기처리 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

 

동기처리 출력결과


https://inpa.tistory.com/entry/NODE-%F0%9F%93%9A-%ED%8C%8C%EC%9D%BC-%EC%97%85%EB%A1%9C%EB%93%9C-fs-%EB%AA%A8%EB%93%88

 

[NODE] 📚 fs 모듈 - 파일 제어 명령어 💯 정리

Node File System 모듈 파일시스템 모듈이란, 파일 처리와 관련된 작업을 하는 모듈로 보통 FileSystem을 줄여서 fs 모듈이라고 줄여 부릅니다. 노드에서 가장 많이 쓰이고 중요한 모듈 중 하나입니다. fs

inpa.tistory.com

 

'Node' 카테고리의 다른 글

회원 CRUD, splice()  (0) 2024.08.13
경로세팅, 라우팅, cors에러  (0) 2024.08.11
웹서버 모듈: http, figlet, express, nodemon  (1) 2024.08.11
이벤트, 예외처리  (0) 2024.08.11
Node.js 개념  (0) 2024.08.08