Node/노드 기능

파일 시스템 사용하기

webmaster 2022. 9. 4. 17:57
728x90

fs

파일 시스템에 접근하는 모듈

  • 파일/폴더 생성, 삭제, 읽기, 쓰기 가능
  • 웹 브라우저에서는 제한적이었으나 노드는 권한을 가지고 있음
  • 파일 읽기 예제(결과의 버퍼는 뒤에서 설명함)

fs Promise

콜백 방식 대신 프로미스 방식으로 사용 가능

  • require(‘fs’).promises
  • 사용하기 훨씬 더 편해서 프로미스 방식을 추천함

fs 파일 만들기

  • fs.writeFile을 사용하게 되면, file을 쓸 수 있다.

동기 메서드와 비동기 메서드

노드는 대부분의 내장 모듈 메서드를 비동기 방식으로 처리

동기-블록킹, 비동기-논블록킹 비교

  • 비동기는 코드의 순서와 실행 순서가 일치하지 않는 것을 의미
  • 일부는 동기 방식으로 사용 가능
  • 위 코드의 콜백 함수는 비동기로 동작하기 때문에 어떤 것을 먼저 출력할지 예측할 수 없다(운영체제만 실행 순서를 알고 있다)
    • 콜백 함수를 비동기로 호출하기 때문에 백그라운드로 작업이 들어가고 테스트 큐로 옮겨질 때, 어떤 것이 먼저 옮겨지고 실행되는지는 알 수 없다
  • 노드에서는 대부분 동기-블로킹 방식과 비동기- 블로킹 방식임 
    • 동기와 비동기: 백그라운드 작업 완료 확인 여부
    • 블로킹과 논 블로킹: 함수가 바로 return 되는지 여부
    • 비동기 논블로킹이 효율적이지만, 순서가 보장되지 않는 단점이 있다.

동기 메서드 사용하기

  • 코드는 깔끔하지만, 서버의 입장에서 생각하면, 놀고 있는 자원이 너무 많아지고, 성능이 좋지 않다.

비동기 콜백 메서드로 순서 유지하기

  • 코드가 우측으로 너무 들어가는 현상 발생(콜백 헬)
  • 동기와의 차이는 해당 asyncOrder 파일을 다른 곳에서 여러 번 호출할 때 있다(해당 파일을 실행할 때 비동기로 호출하기에 성능이 훨씬 빠르다)

프로미스 비동기 호출(콜백 헬 극복)

  • 프로미스를 사용해, 콜백 헬에서 벗어날 수 있다.
  • 아직 가독성은 그렇게 좋지 않다(then 지옥에서는 벗어나지 못했다)

Async/Await로 조금 더 깔끔한 코드 작성

const fs = require("fs").promises;
async function main() {
  let data = await fs.readFile("./readme.txt");
  console.log("1번", data.toString());
  data = await fs.readFile("./readme.txt");
  console.log("2번", data.toString());
  data = await fs.readFile("./readme.txt");
  console.log("3번", data.toString());
  data = await fs.readFile("./readme.txt");
  console.log("4번", data.toString());
}
  • 동기적으로 호출하는 코드와 비슷해졌지만 비동기로 호출된다.
  • 코드가 훨씬 간결해졌으며, 가독성이 좋아졌다
728x90

'Node > 노드 기능' 카테고리의 다른 글

pipe와 스트림 메모리 효율 확인  (0) 2022.09.04
버퍼와 스트림 이해하기  (0) 2022.09.04
child_process  (0) 2022.07.24
worker_threads  (0) 2022.07.24
crypto와 util  (0) 2022.07.24