JavaScript_node.js_비동기

Eugenius1st·2022년 7월 27일
0

JavaScript

목록 보기
27/62

브라우저에서 사용할 수 있는 비동기 흐름은 타이머 혹은 DOM 이벤트와 관련된 상황으로 다소 한정적이지만, Node.js의 경우 많은 API가 비동기로 작성되어 있다.

Node.js는 "비동기 이벤트 기반 JavaScript 런타임"이다.

학습 목표

  • Node.js 내장 모듈을 사용할 수 있다.
  • 서드 파티 모듈 (3rd-party module)을 활용할 수 있다.
  • Node.js 공식 문서를 활용하여 fs.readFile을 이용할 수 있다.

Node.js 내장모듈 사용법

https://nodejs.org/dist/latest-v16.x/docs/api/

개발자는 자신이 이해하는 범위만큼 모듈을 사용할 수 있다. 예를 들어, DNS에 대한 지식을 알고 있다면, DNS 모듈 사용법 문서에서 관련 메서드를 사용할 수 있다. 당장 DNS가 무엇인지 모를 수는 있지만, 파일 시스템 모듈은 파일을 읽거나 저장하는 기능을 구현할 수 있도록 돕는다. 메서드 목록을 살펴보면, 파일을 읽을 때에 쓸법한 메서드 이름을 찾을 수 있다. 물론, 처음부터 필요한 메서드를 정확하게 찾는 일은 쉽지 않다.

파일을 읽을 때에는 readFile이라는 메서드가 적합하다. 파일의 저장은 어떨까? saveFile 이라는 메서드는 찾을 수 없지만, 비슷해 보이는 메서드가 있다. 파일을 저장할 때에는 writeFile을 쓰면 된다.

모든 모듈은 '모듈을 사용하기 위해 불러오는 과정'이 필요하다. 브라우저에서 다른 파일을 불러올 때에는 다음과 같이 <script> 태그를 이용했다.

3rd-party 모듈을 사용하는 방법

서드 파티 모듈(3rd-party module)은 해당 프로그래밍 언어에서 공식적으로 제공하는 빌트인 모듈(built-in module)이 아닌 모든 외부 모듈을 일컫는다. 예를 들어, Node.js에서 underscore는 Node.js 공식 문서에 없는 모듈이기 때문에 서드 파티 모듈이다. underscore 와 같은 서드 파티 모듈을 다운로드하기 위해서는 npm을 사용해야 합니다.

터미널에서 다음과 같이 입력해 underscore 를 설치할 수 있습니다.

npm install underscore

이제 node_modules에 underscore가 설치되었습니다. 이제 Node.js 내장 모듈을 사용하듯 require 구문을 통해 underscore 를 사용할 수 있습니다.

const _ = require('underscore');


fs.readFile을 통해 알아보는 Node.js 공식문서 가이드

메서드 fs.readFile 은 로컬에 존재하는 파일을 읽어온다. 16.x 버전 기준으로, fs.readFile의 공식 API 문서에 안내되어 있는 항목을 설명한다. 공식 문서와 이 내용을 동시에 놓고 보면, 공식 문서의 구성을 이해하는 데 도움이 된다.

공식 문서 내용은 이렇게 인용구로 표시한다.

fs.readFile(path[, options], callback)

서드 fs.readFile 은 비동기적으로 파일 내용 전체를 읽는다. 이 메서드를 실행할 때에는 전달인자 세 개를 받는다.

Asynchronously reads the entire contents of a file.

path \<string> | \<Buffer> | \<URL> | \<integer>

path에는 파일 이름을 전달인자로 받는다. 네 가지 종류의 타입을 넘길 수 있지만 일반적으로 문자열(<string>)의 타입을 받는다.

filename or file descriptor

다음은 etc/passwd 라는 파일을 불러오는 예제입니다.

fs.readFile('/etc/passwd', ..., ...)
options \<Object> | \<string>

대괄호로 감싼 두 번째 전달인자 options는 넣을 수도 있고, 넣지 않을 수도 있다. 대괄호는 선택적 전달인자를 의미한다.

options는 문자열 또는 객체 형태로 받을 수 있다. 문자열로 전달할 경우 인코딩을 받는다. 밑의 예제에서는 'utf8' 을 두 번째 전달인자로 받는 것을 확인할 수 있다. options를 객체 형태로 받는 것은 두 번째 예제를 참고해보자.

If options is a string, then it specifies the encoding:

fs.readFile('/etc/passwd', 'utf8', ...);
let options = {
encoding: 'utf8', // utf8 인코딩 방식으로 엽니다
flag: 'r' // 읽기 위해 엽니다
}

// /etc/passwd 파일을 options를 사용하여 읽습니다.
fs.readFile('/etc/passwd', options, ...) 
callback \<Function>```

```js  
err \<Error> | \<AggregateError>
data \<string> | \<Buffer>

콜백 함수를 전달한다. 파일을 읽고 난 후에 비동기적으로 실행되는 함수이다.

콜백 함수에는 두 가지 매개변수가 존재한다. 에러가 발생하지 않으면 err 는 null 이 되며, data 에 문자열이나 Buffer 라는 객체가 전달된다. data 는 파일의 내용이다.

질문: data 에는 문자열이나 Buffer 가 전달됩니다. 어떤 경우에 문자열로 전달되는 것일까? 힌트는, 공식 문서의 다음 내용에 나와 있습.

If no encoding is specified, then the raw buffer is returned.

메서드 fs.readFile로 파일의 데이터를 읽을 수 있다.

fs.readFile('test.txt', 'utf8', (err, data) => {
if (err) {
  throw err; // 에러를 던집니다.
}
console.log(data);
});
profile
최강 프론트엔드 개발자가 되고싶은 안유진 입니다

0개의 댓글