노드 공부 기록(6) - Node.js fs 모듈, 파일 시스템 접근하기, 버퍼와 스트림, 폴더 생성, 삭제, 스레드풀
my code archive
article thumbnail
반응형

🔍fs 모듈이란?

  • 파일 시스템에 접근하는 모듈
  • 파일 생성, 삭제, 읽기, 쓰기, 폴더도 만들거나 지울 수 있다.

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

//readme.txt
저를 여러 번 읽어보세요.
  • 비동기방식으로 파일 하나를 여러 번 읽어보기

실행 결과

  • 비동기메서드들은 백그라운드에 해당 파일을 읽으라고만 요청하고 다음 작업으로 넘어감 => 따라서 파일 읽기 요청만 세 번 보내고 console.log('끝')을 찍는다.
  • 수백 개의 I/O 요청이 들어와도 메인 스레드는 백그라운드에 요청 처리를 위임, 얼마든지 추가 요청을 받을 수 있음.

  • 동기방식으로 순서대로 읽어보기

실행 결과

  • readFile 대신 readFileSync 메서드 사용
  • 동기방식의 경우 수백 개 이상의 요청이 들어올 때 성능에 문제가 생김(이전 작업이 완료되어야 다음 작업을 진행할 수 있기 때문에) ->백그라운드 작업 시 메인 스레드는 아무 것도 하지 못하고 대기해야 하는 비효율적인 상황이 발생

  • 비동기방식으로 하되 순서는 유지하고 싶을 때 : readFile의 콜백에 다음 readFile을 넣으면 된다.

 

🔍버퍼와 스트림

파일을 읽거나 쓰는 방식에는 크게 두 가지 방식이 있다. => 버퍼, 스트림

 

  • from(문자열) : 문자열을 버퍼로 바꾸는 기능
  • toString(버퍼) : 버퍼를 다시 문자열로 바꾸는 기능
  • concat(배열) : 배열 안에 든 버퍼들을 하나로 합침.
  • alloc(바이트) : 빈 버퍼를 생성함.

실행 결과

 

//readme3.txt
저는 조금씩 조금씩 나눠서 전달됩니다. 나눠진 조각을 chunk라고 부릅니다.
  • createReadStream으로 읽기 스트림 만들기 : 첫 번째 인수로 읽을 파일 경로, 두 번째 인수로 버퍼의 크기 설정 (옵션)
  • readStream은 이벤트 리스너를 붙여서 사용(보통 data, end, error 이벤트 사용). -> 파일을 읽는 도중 에러 발생 시 error 이벤트 호출, 파일 읽기가 시작되면 data 이벤트 발생.
  • 아래 코드에서는 미리 data 배열을 만들어놓고 들어오는 chunk들을 하나씩 push한 뒤 마지막에 Buffer.concat()으로 합쳐서 다시 문자열을 만듦.

실행 결과

  • createWriteStream으로 쓰기 스트림 만들기
  • finish이벤트 리스너를 붙여 데이터를 다 썼다면 end 메서드로 종료를 알리고, 이때 finish 이벤트가 발생함.

실행 결과

  • pipe : createReadStream으로 파일을 읽고 그 스트림을 전달받아 createWriteStream으로 파일을 씀. (=파일 복사와 비슷)

실행 결과 : writeme3.txt가 생성됨(복사)

 

🔍기타 fs 메서드 알아보기

  • 폴더 생성
  • fs.access(경로, 옵션, 콜백) : 폴더나 파일에 접근할 수 있는지 체크함.

💡F_OK : 파일 존재 여부

💡R_OK : 읽기 권한 여부

💡W_OK : 쓰기 권한 여부

  • fs.mkdir(경로, 콜백) : 폴더 생성 메서드
  • fs.open(경로, 옵션, 콜백) : 파일의 아이디(fd 변수)를 가져오는 메서드. 파일이 업사면 파일을 생성한 뒤 그 아이디를 가져온다.
  • fs.rename(기존 경로, 새 경로, 콜백) : 파일의 이름을 바꾸는 메서드.

실행 결과

 

  • 폴더 내용 확인 및 삭제
  • fs.readdir(경로, 콜백) : 폴더 안의 내용물 확인
  • fs.unlink(경로, 콜백) : 파일 지우기
  • fs.rmdir(경로, 콜백) : 폴더 지우기

실행 결과

  • 복사
  • 첫 번째 인수로 복사할 파일, 두 번째 인수로 복사될 경로, 세 번째 인수로 복사 후 실행될 콜백 함수

실행 결과

 

🔍스레드풀

  • 비동기 메서드 사용 시 여러 요청이 들어와도 백그라운드에서 동시 처리가 가능한 이유는 바로 스레드풀이 있기 때문이다.
  • 내부적으로 스레드풀을 사용하는 모듈은 crypto, zlib, dns.lookup 등이 있다.

실행 결과

  • 실행할 때마다 시간과 순서가 달라진다.
  • 스레드풀이 작업을 동시에 처리하므로 여덟 개의 작업 중 어느 것이 먼저 처리될지 알 수 없다.
  • 기본적인 스레드풀의 개수가 4개이기 때문에 1~4 / 5~8이 그룹으로 묶여져 있고, 5~8이 1~4보다 시간이 더 소요되는 규칙을 발견할 수 있다.

반응형
profile

my code archive

@얼레벌레 개발자👩‍💻

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

반응형