Study/Node.js

[노드JS] 파일 다루기

AC 2019. 3. 23. 21:37



『파일 다루기

_________________


노드의 파일 시스템은 파일을 다루는 기능과 디렉터리를 다루는 기능으로 구성되어 있으며, 동기식 IO와 비동기식 IO 기능을 함께 제공한다. 동기식 IO는 파일 작업이 끝날 때까지 대기하며, 비동깃기 IO는 파일 작업을 요청만 하고, 그 다음 자겅ㅂ을 바로 수행한다.


이후 파일 작업이 끝나면 그 상태는 이벤트로 받아서 처리한다.


동기식 IO와 비동기식 IO를 구별하기 위해 동기식 IO 메소드는 Sync라는 단어를 붙인다.


※ 동기식 방식(동기식 IO)을 사용할 때는 파일 처리가 끝날 때까지 대기하므로 처리 속도에 영향을 미칠 수 있다.


파일을 읽어 들이거나 파일에 쓰기

파일을 읽어 들이는 기능을 확인하기 위해 ch04_test5.js 파일을 만들고 다음 코드를 입력한다.


---------------------------------------------------------------


var fs = require('fs');


// 파일을 동기식 IO로 읽어 들인다.

var data = fs.readFileSync('./package.json', 'utf8');


// 읽어 들인 데이터를 출력한다.

console.log(data);


---------------------------------------------------------------


파일 시스템에 접근하기 위해 fs 모듈을 사용한다. fs 모듈을 사용하려면 우선 require() 메소드를 호출하면서 fs를 파라미터로 전달한다. 여기에서는 readFileSync() 메소드를 사용했는데, 메소드 이름에 Sync라는 단어가 붙어 있으므로 동기식으로 동작한다.


즉, 이 코드가 실행되면 파일을 다 읽을 때까지 대기한다. 따라서 그 아래에 있는 console.log() 메소드 호출 부분은 파일을 다 읽을 때까지 실행되지 않는다. 


이 파일을 실행하면 프로젝트 폴더 안에 들어 있는 package.json 파일의 내용이 콘솔 창에 출력된다.



이번에는 package.json 파일을 읽어 들여 콘솔 창에 출력하는 기능은 같지만 비동기식 IO로 실행되는 코드를 ch04_test6.js 파일에 입력한다.



---------------------------------------------------------------


var fs = require('fs');


// 파일을 비동기식 IO로 읽어 들인다.

fs.readFile('./package.json', 'utf8', function(err, data) {

   // 읽어 들인 데이터를 출력한다.

    console.log(data);

});


console.log('프로젝트 폴더 안의 packasge.json 파일을 읽도록 요청했다.');


---------------------------------------------------------------


여러 번 이야기했듯이 파일을 비동기식으로 읽어 들이는 방식이 노드에서 더 자주 사용하는 코드 패턴이다.

readFile() 메소드를 실행하면서 세 번째 파라미터로 전달된 함수(fucntion)는 파일을 읽어 들이는 작업이 끝났을 때 호출된다.


이 때 두 개의 파라미터 err와 data를 전달받아서 오류가 발생했는지 아니면 제대로 실행되었는지를 알 수 있다.



오류가 발생하면 err에 오류 데이터가 들어가고 그렇지 않으면 err 변수의 값이 null이 된다. 그러므로 일반적으로는 첫 번째 파라미터인 err가 null인지를 체크하는 코드를 사용한 후 문제가 없으면 파일 읽기에 성공한 것으로 처리한다.


이 파일을 실행하면 readFile() 메소드를 먼저 호출했지만 그 다음에 작성한 코드가 먼저 실행되는 것을 볼 수 있다.



▲ 비동기식 IO로 파일을 읽어 내용을 출력한 경우


파일을 읽어 들이는 것뿐만 아니라 파일을 쓰는 기능까지 fs 모듈에 정의한다. 

다음은 파일을 읽고 쓸 때 사용하는 대표적인 네 가지 메소드이다.




메소드 이름 

설명 

 readFile(filename, [encoding], [callback]) 

 비동기식 IO로 파일을 읽어 들인다. 

 readFileSync(filename, [encoding]) 

 동기식 IO로 파일을 읽어 들인다. 

 writeFile(filename, data, encoding='utf8', [callback]) 

 비동기식 IO로 파일을 쓴다. 

 writeFileSync(filename, data, encoding='utf8') 

 동기식 IO로 파일을 쓴다. 


[표] 파일을 읽고 쓰는 대표적인 네 가지 메소드




대부분은 비동기 방식으로 파일을 읽고 쓰기 때문에 비동기 방식의 메소드를 주로 사용한다.




이번에는 파일에 데이터를 쓰는 기능을 만들기 위해 ch04_test7.js 파일을 만들고 다음과 같이 입력한다.





------------------------------------------------


var fs = require('fs');


// 파일에 데이터를 쓴다.


fs.writeFile('./output.txt', 'Hello Word!', function(err){

    if(err){

        console.log('Error : ' + err);

    }

    

    console.log('output.txt 파일에 데이터 쓰기 완료.');

});


------------------------------------------------



파일에 데이터를 쓸 때 사용하는 writeFile() 메소드는 첫 번째 파라미터로서 파일 이름을 전달받는다.

두 번째 파라미터는 파일에 쓸 내용이고 세 번째는 작업이 끝나면 호출될 콜백 함수이다.


작업 중 오류가 발생하면 콜백 함수로 오류 객체가 전달된다.


오류 객체가 null 값으로 전달되면 데이터 쓰기가 완료된 것이다.



파일을 실행하면 프로젝트 폴더 안에 output.txt 파일이 만들어지고 그 안에 'Hello World!' 라는 글자가 쓰여 있는 것을 확인할 수 있다.







LIST