inblog logo
|
p4rksk
    Node.js

    Node.js - 비동기 version 파일 읽기 쓰기

    박선규's avatar
    박선규
    Feb 07, 2025
    Node.js - 비동기 version 파일 읽기 쓰기
    Contents
    파일 읽기파일 읽기 안에 파일 읽기 파일안에 파일 읽기 + 파일작성⚡ 핵심 개념: 이벤트 루프(Event Loop)콜백지옥 대체 함수 async
    📌
    노드에서 이 비동기 방식 콜백을 많이쓰는 이유는
    기본적으로 노드JS는 단일 스레드로 구성이 돼있기 때문이다.
    그래서 파일에서 데이터를 다 읽을 때까지 백그라운드에서 무거운 일을 하고 콜백함수도 등록한다.
    I/O 작업(파일 읽기, 네트워크 요청 등)은 백그라운드에서 실행되고, 완료되면 콜백 함수 실행
     

    파일 읽기

    해당 파일을 읽을거다.
    해당 파일을 읽을거다.
     

    콜백함수 동작방식

    📌
    노드가 해당 파일을 읽기 시작하고 준비가되는 즉시에 지정한 콜백함수가 실행이된다.
    notion image
    📌
    해당 파일을 읽기 시작하고 다음줄 코드로 넘어가 “읽기 파일 동작” 이 코드를 읽고, 파일이 완전히 읽혔을 때 콜백 함수가 실행돼 텍스트가 출력이 된다.
     

    파일 읽기 안에 파일 읽기

    notion image
    notion image
    📌
    start.txt의 파일 내용을 출력하고 read-this.txt 파일 내용을 출력 할 거다.
     

    파일명 대신 변수로

    notion image
    📌
    data1에 내용이 data2의 파일 이름가 동일하므로 변수로 data1을 변수로 받아줘 파일명으로 대체한다.
     

    출력

    notion image
     

    파일안에 파일 읽기 + 파일작성

    notion image
    📌
    추가적으로 이 파일까지 같이 출력 해볼거다.
    또한 작성 할 것이다.
     
     
    notion image
    notion image
    📌
    글 쓰기는 파일명 뒤에, 넣을 데이터, 확장자, 콜백함수 순으로 온다.

    ⚡ 핵심 개념: 이벤트 루프(Event Loop)

    Node.js는 싱글 스레드 기반이지만, 비동기 작업을 처리할 때 **이벤트 루프(Event Loop)**를 사용한다.
    📌 정확한 동작 방식
    1. 동기 코드(Synchronous Code) 먼저 실행
        • console.log('읽기 파일 동작');처럼 즉시 실행 가능한 코드는 **콜 스택(Call Stack)**에서 바로 실행된다.
    1. 비동기 작업(Async Task)은 백그라운드로 이동
        • fs.readFile() 같은 비동기 함수는 **Node.js의 백그라운드(Worker Pool)**에서 실행된다.
        • 파일을 읽는 동안 이벤트 루프는 다른 동기 코드 실행을 계속 진행한다.
    1. 파일 읽기가 끝나면 콜백 큐(Callback Queue)로 이동
        • 비동기 작업이 완료되면 콜백 함수가 **태스크 큐(Task Queue)**에 들어간다.
        • 이벤트 루프는 현재 실행 중인 코드가 끝날 때까지 대기한 후, 큐에서 콜백을 꺼내 실행한다.
     

    콜백지옥 대체 함수 async

    📌
    위 코드는 가독성이 떨어지는 부분이 있으니 async로 함수로 대체하여 기능은 그대로인 상태에서 가독성은 챙기자
    const fs = require('fs').promises; // fs의 Promise 버전 사용 async function processFiles() { try { const data1 = await fs.readFile('./starter/txt/start.txt', 'utf-8'); const data2 = await fs.readFile(`./starter/txt/${data1}.txt`, 'utf-8'); console.log(data2); const data3 = await fs.readFile(`./starter/txt/append.txt`, 'utf-8'); console.log(data3); await fs.writeFile('./starter/txt/final.txt', `${data2} \n ${data3}`, 'utf-8'); console.log('파일이 작성됐습니다.'); } catch (err) { console.error('오류 발생:', err); } } console.log('읽기 파일 동작'); processFiles();
     
    Share article

    p4rksk

    RSS·Powered by Inblog