타입스크립트에서 readFile 같은 node.js API를 사용하려면 tsconfig.json 파일에 별도의 설정이 필요하다.
tsc --init 명령으로 tsconfig.json 파일을 생성하고 downlevelIteration항목을 true로 설정한다.
해당 옵션은 오래된 자바스크립트의 호환성을 높여주는 옵션이다.
파일과 관련된 기능을 모아둔 fs패키지를 이용하면 readfile을 할 수 있다. 파일은 동기버전인 readFileSync와 비동기 버전인 readFile로 제공된다.
import {readFileSync, readFile, read} from 'fs';
//동기식으로 파일을 불러온 예
const buffer:Buffer = readFileSync('./package.json')
console.log(buffer)
// 비동기식으로 파일을 불러온 예
readFile('./package.json', (error:Error, buffer:Buffer)=>{
console.log(buffer.toString())
})
//promise와 async,await로 구현한 예
const readFilePromise = (filename:string):Promise<string> => new Promise<string>((resolve, reject)=>{
readFile(filename, (error:Error, buffer:Buffer) =>{
if(error)
reject(error)
else
resolve(buffer.toString())
})
});
(async () => {
const content = await readFilePromise('./package.json')
console.log(content)
})
node.js에서 파일 읽기는 readFileSync와 readFile이라는 API를 통해서 구현한다.
readFileSync는 파일을 읽어서 Buffer라는 타입으로 전달해 주는데 Buffer는 node.js가 제공하는 클래스로서 바이너리 데이터를 저장하는 기능을 수행한다.
Buffer의 데이터를 문자열로 만들고 싶으면 toString메서드를 사용하면 된다.
보통 node.js에서 ~~~Sync라는 이름의 API들은 동기방식으로 동작하고 동기방식은 API 작업이 종료 될때까지 프로그램을 일시적으로 멈추는 기능을 한다.
위의 코드에서 readFileSync가 파일을 읽고 Buffer로 데이터를 전달하는데 이때 파일을 읽어올 때까지 코드는 잠시 멈춘다.
node.js는 동기 버전인 readFileSync 이외에도 비동기 버전인 readFile도 제공한다.
import {readFile} from 'fs';
readFile('./package.json', (err:Error, buffer:Buffer)=>{
if(err) throw err
else{
const content:string = buffer.toString()
console.log(content)
}
})
// 이하 코드는 멈추지 않고 실행
이때는 비동기 방식으로 동작함으로 readFile을 실행하는 동안 이하의 코드들을 실행한다.
자바스크립트는 단일 스레드(single-thread)로 동작하므로 될 수 있으면 readFileSync와 같은 동기 API를 사용하지 말아야한다.
타입스크립트 또한 ES5 자바스크립트로 변환되어 실행되므로 자바스크립트와 마찬가지로 될 수 있으면 동기 API를 사용하지 말아햐 한다.
타입스크립트(자바스크립트) 코드에서 동기 API가 실행되면, 운용체제는 동기 API의 작업 결과를 함수의 반환값으로 돌려주어야 한다. 이 때문에 운영체제는 동기 API가 실행된 코드를 일시적으로 멈춘 다음, 또 다른 스레드에서 실제 작업을 실행해 결과를 얻으면 그 때서야 비로소 잠시 멈췄던 동기 API를 실행하면서 결과값을 반환한다.
동기 API의 이러한 동작 방식은 코드를 작성하기 쉽게 해주지만 프로그램의 반응성을 떨어뜨린다. 만일 동기 API를 호출하는 자바스크립트 코드가 웹 서버에서 실행되면 단일 스레드로 동작하는 자바스크립트의 물리적인 특징상 웹 서버는 동기 API가 결과값을 반환 할 때까지 일시적으로 멈춘다. 그리고 웹 브라우저에서 이 웹 서버로 접속이 안되는 현상이 발생한다.
이처럼 단일 스레드에서 동작하므로 코드를 작성할때는 항상 비동기 방식으로 동작하는 API를 사용해 프로그램의 반응성을 훼손하지 말하야 한다.
단일 스레드로 동작하는 자바스크립트
스레드는 CPU가 프로그램을 동작시키는 최소 단위이다. 운영체제에서 프로그램이 실행되고 있는 상태일 때를 프로세스라고 한다. 프로세스는 한 개의 주 스레드와 여러 개의 작업 스레드를 동작시킨다.
자바스크립트 코드는 항상 한 개의 작업 스레드에서 실행된다. 웹 브라우저나 node.js 프로그램 자체는 다중 스레드로 동작하지만, 자바스크립트 코드는 한 개의 작업 스레드, 즉 단일 스레드에서 동작한다.