[TIL 8] 파일 관리하기 - path, File System 모듈, 노드와 비동기 처리

nini·2025년 3월 13일

KB IT's Your Life

목록 보기
8/40

파일 관리하기 - path, File System 모듈

path 모듈

웹 브라우저에서는 쓸 수 없는 모듈(프로그램 코드가 임의로 나의 파일에 접근하는 것이 차단되어 있음)

  • path 모듈

    • 파일 경로, 디렉토리 경로를 다룸
      • 운영체제 간에 경로를 구분하는 구분자가 다름 -> 경로 구분자를 통일
        • 윈도우 \, linux & mac / -> 윈도우여도 /로 사용(알아서 바꿔줌)
    • 경로를 결합, 특정 부분을 추출할 때 사용(나누거나 합칠 수 있음)
    • 절대 경로와 상대 경로
  • 경로를 다루는 주요 함수

    • path 모듈 가져오기
      const path = require('path모듈명');
    • 경로 합치기
      path.join(경로1, 경로2, ...) 가변 매개변수(개수에 제한이 없다)
const path = require('path');
// 경로 연결하기
const fullpath = path.join('some', 'work', 'ex.txt');
console.log(fullPath); // some\work\ex.txt
// 동기
  • 경로만 추출하기 - dirname 함수

    • path.dirname(경로)
  • 파일 이름 추출하기 - basename 함수

    • path.basename(경로) 경로를 제외한 파일명만 리턴
    • path.basename(경로, 확장자) 지정한 확장자를 제외한 파일명 리턴
      • 확장자라는 개념은 윈도우에만 있음, 맥이나 리눅스에서는 파일명으로 간주
  • 확장자 추출하기 - extname 함수

    • path.extname(경로)
  • 경로를 객체로 변환하기 - parse 함수

    • path.parse(경로)
    • parse: 문자열을 분석해서 의미있는 정보를 얻는 것
{
  root, // 루트 디렉토리
  dir, // 디렉토리 경로
  base, // 파일명, 확장명
  ext, // 확장명
  name // (확장명을 제외한) 파일명
} // 결과값으로 객체가 리턴된다

// 원하는 값만 불러올 수 있음, 객체로 전체 다 불러오기도 가능
const { name, ext } = path.parse(__filename);
console.log({ name, ext });
//{ name: 'path', ext: '.js' }

FS 모듈

  • FS 모듈?
    • File System 모듈의 약자
    • 비동기 처리 방법에 따라 사용하는 함수가 다름
      • 동기 처리 함수
        • 콜백 처리 함수(비동기)
        • Promise API
    • FS 모듈 가져오기
const fs = require('fs');

fs.함수명
fs.readFile('example.txt', (err, data) => {...});
  • 현재 디렉토리 읽기

    • 함수(파일명) 뒤에 Sync가 붙으면 동기함수, 안 붙으면 비동기 함수 - default 비동기

    • 동기 처리로 디렉터리 읽기 - readdirSync 함수

      • fs.readdirSync(경로 [, 옵션])
        • 경로: 파일 목록을 표시할 경로를 지정
        • 옵션 - encoding: 기본값 utf8
        • 동기 함수의 에러 처리는 try catch로
    • 비동기 처리로 디렉터리 읽기 - readdir 함수

      • fs.readdir(경로[, 옵션], 콜백)
        • 경로: 파일 목록을 표시할 경로를 지정
        • 옵션
          • encoding: 기본값 utf8
          • withFileTypes: 기본값은 false, true면 반환값이 몬자열로 된 배열이 아닌 디렉터리 항목으로된 배열로 반환
        • 콜백함수: (err, files)
        • 비동기 처리의 에러 처리는 콜백 함수의 첫번째 매개변수를 검사해서
    • 자바스크립트에서 false로 해석되는 값

      • false, 0, ‘’(비어있는 문자열), undefined, null
      • python에서는 [ ] false이지만 js에서는 true

파일 관리하기

  • 파일 읽기

    • 동기 처리로 파일 읽기 - readFileSync 함수

      • fs.readFileSync(경로 [,옵션])
        • 경로
        • 옵션
          • encoding: 기본값 null(binary mode 이진 데이터로 읽어라)
          • flag: 기본값 r, r+(읽기&쓰기), w(쓰기), a(추가) 등
    • 비동기 처리로 파일 읽기 - readFile 함수

      • fs.readFile(파일 [, 옵션], 콜백)
        • 파일
        • 옵션
          • encoding
          • flag
          • signal: 파일을 읽는 데 시간이 너무 걸릴 경오 중간 취소를 위해 설정
        • 콜백
        • (erro, data) 매개변수

      https://nodejs.org/docs/latest/api/fs.html
      ✅ 공식 문서 활용해서 매개변수, 예제 등 보기

  • 파일에 기록하기

    • 동기 처리로 파일에 쓰기 - writeFileSync 함수
      • fs.writeFileSync(파일, 내용 [, 옵션])
        • 파일: 내용을 기록할 파일 경로
        • 내용: 기록할 내용을 지정
        • 옵션
          • encoding: 기본값 utf8
          • flag: 기본값 w
          • mode: 파일 사용자 권한, 기본값 0o666
    • 파일 존재 여부 체크하기 - existsSync 함수
      • fs.existsSync(파일)
    • 비동기 처리로 파일에 쓰기 - writeFile 함수
      • fs.writeFile(파일, 내용[, 옵션], 콜백)
        • 파일: 내용을 기록할 파일 경로
        • 내용: 기록할 내용을 지정
        • 옵션
          • encoding: 기본값 utf8
          • flag: 기본값 w
          • mode: 파일 사용자 권한, 기본값 0o666
          • signal: 쓰기 취소 설정
        • 콜백: err => {}
    • 기존 파일에 내용 추가하기
      • flag 옵션 사용하기
      • appendFileSync 함수
      • appendFile 함수
  • 파일 삭제하기

    • 동기 처리로 파일 삭제하기
      • fs.unlinkSync(파일)
    • 비동기 처리로 파일 삭제하기
      • fs.unlink(파일, 콜백)

디렉토리 관리하기

  • 디렉토리 만들기
    • fs.mkdirSync(경로 [,옵션])
    • fs.mkdir(경로 [, 옵션], 콜백)
      • 경로
      • 옵션
        • recursive: 중간 경로가 존재하지 않으면 생성할지 여부, 기본값 false
        • mode: 사용자 권한, 기본값 0o777
      • 콜백: err => {}
  • 디렉토리 삭제하기
    • fs.rmdirSync(경로 [, 옵션])
    • fs.rmdir(경로 [, 옵션], 콜백)
      • 경로
      • 옵션
        • maxRetries: 오류 발생시 재시도 횟수, 디폴트 0
        • retryDelay: 재시도 회수를 지정했을 때 개기 시간(밀리초), 기본값 100
      • 콜백: err => {}
  • 파일 삭제 및 내용이 있는 디렉터리 삭제하기
    • fs.rmSync(경로 [, 옵션])
    • fs.rm(경로[, 옵션], 콜백)
      • 경로
      • 옵션
        • force: 파일이나 디렉터리를 강제로 삭제할지 여부, 기본값 false
        • maxRetries: 최대 재시도 횟수
        • retryDelay: maxRetries 설정시 대기 시간. 기본값 100 밀리초
        • recursive: 하위 폴더까지 삭제할지 여부, 기본값 false
      • 콜백: err => {}

버퍼와 스트림 이해하기

  • 버퍼

    • 바이더리 데이터를 핸들링하는 노드의 타입
    • 임시 데이터를 저장하는 물리적인 메모리 공간
    • 노드의 버퍼 크기는 고정되어 있음(default 64k)
  • 스트림

    • 한 곳에서 다른 곳으로 데이터가 이동하는 것, 데이터의 흐름
  • 리더블 스트림(readable stream)

    • 데이터를 읽기 위한 스트림으로 주로 서버에서 용량이 큰 데이터를 가져올 때 많이 사용
    • createReadStream 함수로 생성
    • 이벤트처리
      • .on('이벤트', 콜백)
      • data, end, error
  • 라이터블 스트림(writable stream)

    • 데이터를 기록하는 스트림
  • 2개의 스트림을 연결하는 파이프 - pipe

    • data 이벤트가 발생했을 때 따로 가져오기 기록하던 것을 한꺼번에 처리

    • 이벤트 처리를 하지 않아도 됨

      fs.readStream.on('data', (chunk) => {
      	fs.writeStream.write(chunk)
      });
      
      // pipe 함수 사용
      fs.readStream.pipe(writeStream);

노드와 비동기 처리

동기 처리와 비동기 처리의 차이

  • 동기 처리란

    • 스레드 thread
      • 작업을 처리하기 위해 자원을 사용하는 단위
      • 하나의 작업이 실행되는 최소 단위
    • 싱글 스레드, 멀티 스레드
  • 비동기 처리

    • 함수 호출을 하면 작업을 의뢰하고 바로 리턴(호출한 함수가 끝나고 실제 작업은 시작하지 않았음)
    • 더 이상 실행할 코드가 없을 때 비동기 함수가 의뢰한 작업 실행
    • 의뢰한 작업이 끝났음을 통지하기 위해 콜백 함수 호출(작업을 의뢰할 때 콜백 함수를 같이 등록해 둠)

논블로킹 I/O

  • 블로킹 I/O, blocking I/O

    • I/O를 수행할 때 우리의 코드 실행은 멈추게 됨
    • 동기 함수는 블로킹 I/O로 실행
    • 노드의 함수명이 ~Sync()로 끝남
    • I/O의 결과 데이터가 리턴됨, 에러 발생시 예외가 발생
    • 단점
      • I/O 작업은 시간이 많이 걸림
      • 그 시간동안 아무것도 할 수 없음
  • 논블로킹 I/O, non-blocking I/O

    • 작업을 비동기로 처리

이벤트 루프

  • 콜 스택(call stack)

    • 동기 함수 호출의 정보가 쌓이는 자료 구조
  • 이벤트 루프로 비동기 처리하기

    • I/O 완료 후 실행해야 할 콜백은 libuv의 큐를 이용해 관리 → 콜백 큐
profile
사용자를 고려한 디자인과 UX에 관심있는 개발자

0개의 댓글