fs module 이란

조 은길·2021년 3월 15일
10

Node.js & 몽고DB

목록 보기
6/10
post-thumbnail

이번 시간에는 fs module에 관해서 살펴보겠다. 오늘 비동기와 promise에 관한 스프린트를 하는데, 내가 뭘하고 있는 건지, 이게 무엇을 위한 것인지 감이 잘 안 잡혀서 이렇게 정리를 해보기로 결심했다.

[ 만약에, 본인이 C++를 공부했다면, ifstream과 ofstream의 자바스크립트 버전이라고 생각하면 이해가 쉽다. ]

일반적으로 npm을 사용하기 위해서는 설치를 먼저해줘야 하는데, 별도의 설치를 하지 않아도 node 상에서 기본적으로 사용할 수 있는 module들이 있다.

- fs module (= File System module) 이란, 파일 처리와 관련된 전반적인 작업을 하는 모듈을 말한다.

이 모듈을 사용하려면, 파일 최상단에

const fs = require( "fs" ); // => fs 모듈 불러오기

을 기입해야 한다. ( const, var, let => 무엇을 쓰든, 큰 차이는 없다 )

Node에서 가장 중요한 묘듈 중에 하나인데, 메소드가 너무 많아서 모두 다 정리는 할 수 없다.
그래서, 부트캠프 강사 분께서 강조하신 메소드 몇 개만 살펴보자!!


모든 메소드들은 동기와 비동기 형식으로 구분할 수있다.

Sync라는 이름이 붙어있으면, 동기적 방식이다.
( 참고로, 자꾸 Async 앞에 A를 '어'라고 발음하는 사람들이 많던데... "에이 싱크"이다. )
( Ajax 역시도 '아젝스'나 '어젝스'가 아니고 "에이 젝스"이다 ㅠ.ㅠ )

  1. 동기적인 방식을 사용하면, 파일을 읽으면서, 다른 작업을 동시에 할 수가 없다. 즉, " 일타쌍피 "가 안 되는데... 그래서, 대부분의 경우 비동기적인 방식이 많이 쓰인다. 하지만, 동기적인 방식이 더 효율적인 경우가 있는데, 대표적으로, 서버 시작시 설정 파일을 읽는 작업을 들 수 있다.

  2. 비동기적인 방식을 사용하면, 파일을 읽으면서, 다른 작업도 동시에 수행할 수 있다.
    하지만, 비동기 함수는 항상 마지막 parameter가 수행 완료시 호출할 callback 함수로 작성되어야 한다.

대표적인 메소드들 소개에 앞서, 함수 안의 인자들이 각각 무엇을 의미하는지 알아보자!!

filename은 '불러올 파일의 위치(경로)'이고, string, Buffer, URL, integer 타입이 올 수 있다.(보통은 문자열을 사용한다.)

[options] 는 가지고 오는 데이터를 어떻게 인코딩을 정해주는 인자이다. 생략이 가능한 인자이지만, 주로 utf8을 적어준다.
=> 하지만, 영어가 아닌 다른 언어가 포함되있는 경우 "utf8" 을 안 써주면, 파일이 깨지니, 그냥 쓰는 게 좋다!!

비동기적 방식의 경우 하나의 인자를 더 받는데,
callback은 콜백함수로써, 이 콜백함수는 err와 data를 인자로 받는다.

a. readFile ( 읽기파일 )

fs.readFile(filename, [options], callback)
=> filename의 파일을 [options]의 방식으로 읽은 후 callback으로 전달된 함수를 호출합니다. (비동기적)

fs.readFileSync(filename, [options])
=> filename의 파일을 [options]의 방식으로 읽은 후 문자열을 반환합니다.
(동기적)

ex)
먼저 파일을 읽어야 하기 때문에 text.txt라는 텍스트 파일을 main.js 폴더에 생성해보자!!

// text.txt
this is text


=> 두 함수 중에 무엇이 먼저 console에 출력될 것같은가??
순서상으로는 비동기 함수가 먼저 나오지만, console에는 동기적 함수가 먼저 찍힌다.

[TMI] 이 부분을 이해하려면, 이벤트 루프의 작동 방식을 알아야 하는데... 간단히 말해서, 동기적인 함수는 콜 스택에 바로 들어갔다가 일이 끝나면 사라지지만, 비동기적 함수는 불려지기 전까지는 이벤트 루프에 의해 다른 곳에 가있다가 필요해지는 순간 혹은 마지막 순간에 콜 스택에 불려져서, 일을 처리하고 사라진다.

이 부분( = 이벤트 루프 )에 대해 더 자세하게 알고 싶다면, 이 영상을 추천한다.
어쨌든 이벤트 루프는 무엇입니까? | Philip Roberts |
( 한글 자막도 지원 된다 )
아니면, 필자가 정리한 글을 봐도 된다. => JS 비동기의 핵심 Event Loop


b. writeFile ( 쓰기파일 )

fs.writeFile(filename, data, [options], callback)
=> filename의 파일에 [options]의 방식으로 data 내용을 쓴 후 callback 함수를 호출합니다.(비동기적)

fs.writeFileSync(filename, data, [options])
=> filename의 파일에 [options]의 방식으로 data 내용을 씁니다.
(동기적)

=> 쓰기도 마찬가지로, 아래 코드를 실행하면 '동기적 파일 쓰기!!'가 먼저 출력된다.

예외 처리 방식

파일 입출력은 다양한 원인으로 예외가 발생할 수 있으므로, 파일 입출력을 하면서 중요한 부분 중 하나가 예외처리이다. 시스템이 비정상적으로 종료되지 않게 하기 위한 필수 사항인데, 동기적 방식과 비동기 방식에서의 예외 처리 방식이 조금씩 다르므로 예제로 알아보자!!

1) 동기적 방식 예외처리

  • 동기적 방식에서는 자바스크립트에서 예외처리를 할 때 일반적으로 써주는 방식인 try~catch 구문으로 처리한다. 쓰기도 마찬가지로 try catch 구문으로 써주면 된다.

=> [ 자주 헷갈리는 부분 ] : try ( ) {...} 가 아니라!! try {...} 이다.

2) 비동기적 방식 예외처리

  • 비동기적 방식에서는 예외가 발생하면 callback 함수의 매개변수 err에 전달되므로, 따로 try~catch 구문을 사용할 필요가 없다.


여기까지 fs module 끝!!!!!

추가적인 메소드를 더 공부해보고 싶다면,
https://nodejs.org/api/fs.html 이 링크를 참고하자!!


  • 참고한 자료들과 출처 ( Reference )

이번 블로그는 코드스테이츠의 강의 내용과 Programming with Mosh 의 일부를 바탕으로 작성했으며, 그 어떠한 상업적 용도도 없음을 밝힌다.

Programming with Mosh

코드스테이츠 Help-Desk

flaviocopes

what the heck is the event loop anyway

profile
좋은 길로만 가는 "조은길"입니다😁

0개의 댓글