이어지는 글


NodeJS 세밀한 입출력 조작
Node를 이용해 입출력을 할 때 기능이나 성능을 위해서 또는 목적에 의해 필요한 부분만 입출력을 수행하는 등세밀하게 조작해야 할 때가 있습니다. 이때는 입출력 대상에 직접 연결하여 입력 또는 출력을 직접 세밀하게 수행한 후 연결을 닫아주면 됩니다.
Node가 입출력을 수행하는 절차는 다음과 같습니다. 이러한 절차는 다른 언어들에서도 마찬가지이므로 알아두는것이 좋습니다.

1. Node 프로그램이 입출력을 수행할 대상과의 데이터 입출력 통로를 열어준다는 의미에서 open() 메서드를 실행 합니다.
2. 연결 이후 입출력을 수행하기 위해서 read(), write() 메서드를 호출 합니다.
3. 이후 모든 입출력 처리를 수행한 후 연결을 닫아주기 위해서 close()메서드를 호출 합니다.



close() 메서드의 용도
이러한 연결은 컴퓨터의 자원을 사용하게 되므로 close()를 통해 연결을 꼭 닫아줌으로써 사용한 자원을 반납해 주어야 합니다.
연결을 제대로 닫아주지 않는 경우 수많은 연결 통로가 생성되고 쌓여 자원이 부족하게 되고 실행중인 Node 프로그램 뿐만 아니라 컴퓨터에서 실행중인 모든 프로그램들에게 까지 영향을 줄 수 있습니다.



NodeJS에서의 입출력 처리
Node 입출력의 장점은 비동기 방식으로 입출력이 이루어진다는 것입니다.
때문에 비동기 방식으로 데이터 입출력을 처리하는지 알아보겠습니다.
내용 이해가 잘 안되시는 분은 포스팅 상단의 이어지는 글을 참고해주시기 바랍니다.
메서드
설명
open(path, flags, mode, callback_)
입출력 대상 파일과의 연결 통로를 엽니다.
read(fd, buffer, offset, length, position, callback)
데이터를 읽어 옵니다.
write(fd, buffer, offset, length, position, callback)
데이터를 출력합니다.
close(fd, callback) 입출력 대상 파일과의 연결 통로를 닫습니다.

 


출력처리
output.txt에 데이터를 출력하는 로직을 알아보도록 하겠습니다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var fs = require('fs');
 
fs.open('./output.txt''a'function (err, fd) {
    console.log('파일과의 연결 통로 열림');
 
    if (err) throw err;
    var buf = new Buffer('\n출력할 내용');
 
    fs.write(fd, buf, 0, buf.lengthnullfunction (err, written, buffer) {
        if (err) throw err;
 
        fs.close(fd, function () {
            console.log('파일과의 연결 통로 닫음.');
        });
 
    });
 
});
cs

출력결과
1
2
파일과의 연결 통로 열림
파일과의 연결 통로 닫음.            
cs

 


 

소스 두번 실행한 후 output.txt
 
1
2
3
 
출력할 내용
출력할 내용                         
cs

 


1. 파일과의 연결 통로를 열어주기 위해  파일시스템 모듈의 open() 메서드를 사용함과 동시에 open() 이 성공했을때 실행될 콜백 함수를 넘겨줍니다. 연결할 파일 경로는 ./output.txt 이며 'a' 플래그는 파일에 데이터 출력시 내용이 이미 있는 경우 해당 내용 뒤에 추가하여 출력한다는 의미입니다. 넘겨준 콜백이 실행될 때 err과 fd 가 넘어오게 되어있는데 err은 에러가 발생했을때 넘어오는 에러 객체이며, fd의 경우 연결된 대상 파일의 정보를 담고 있는 파일 디스크립터 객체입니다.

2. write() 메서드를 통해 데이터를 출력합니다. 데이터를 출력할 대상이 누구인지 알아야 하기 때문에 파일 디스크립터 객체인 fd를 첫번째 인자로 넘기며 이때 데이터는 버퍼객체에 담아 넘기게 됩니다.
이후 0과 buf.length를 넘겨주는데 이는 버퍼에 담긴 데이터중 어디서부터 어디까지를 출력할지 정해줍니다. 0부터 버퍼의 길이까지 넘긴다고 했으니 결국 버퍼에 담긴 데이터 모두를 출력하겠다는 의미가 됩니다.
출력이 끝났을 때 호출될 콜백을 마지막에 넘깁니다.

3. 출력이 모두 끝나면 close() 메서드를 호출하여 파일과의 입출력 통로 연결을 닫습니다.



입력처리
위 출력 처리에서 output.txt 에 출력한 데이터를 입력을 통해 읽어오도록 하겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var fs = require('fs');
fs.open('./output.txt''r'function(err, fd) {
    if(err) throw err;
    
    var buf = new Buffer(40);
 
    fs.read(fd, buf, 0, buf.lengthnullfunction(err, bytesRead, buffer) {
        if(err) throw err;
 
        var data = buffer.toString('utf8');
 
        console.log('읽은 데이터  : %s', data)
        console.log('읽어온 데이터 byte 수 : %d', bytesRead);
 
        fs.close(fd, function() {
            console.log('파일과의 연결 통로 닫음.');
    });
 
  });
});
 
cs

 

 
출력결과
1
2
3
4
5
읽은 데이터  :
출력할 내용
출력할 내용      
읽어온 데이터 byte 수 : 34
파일과의 연결 통로 닫음.                    
cs

1. 파일과의 연결 통로를 열어주기 위해  파일시스템 모듈의 open() 메서드를 사용함과 동시에 open() 이 성공했을때 실행될 콜백 함수를 넘겨줍니다. 연결할 파일 경로는 ./output.txt 이며 'r' 플래그는 데이터를 읽겠다는 의미이며 만약 대상 파일의 경로에 존재하지 않는 경우 예외가 발생합니다. 넘겨준 콜백이 실행될 때 err과 fd 가 넘어오게 되어있는데 err은 에러가 발생했을때 넘어오는 에러 객체이며, fd의 경우 연결된 대상 파일의 정보를 담고 있는 파일 디스크립터 객체입니다.

2. read() 메서드를 통해 데이터를 출력합니다. 데이터를 출력할 대상이 누구인지 알아야 하기 때문에 파일 디스크립터 객체인 fd를 첫번째 인자로 넘기며 이때 데이터는 버퍼객체에 담아 넘기게 됩니다.
이후 0과 buf.length를 넘겨주는데 버퍼의 0번째 주소에서부터 버퍼의 끝까지의 공간에 데이터를 담아서 읽겠다는 의미입니다.
파일로부터 데이터 입력이 완료됐을때의 콜백 함수를 넘겨받는데 에러가 발생했을 때 에러객체가 err에 담겨오게 되며, bytesRead는 읽어온 데이터가 몇바이트인지 값이 담겨있으며 buffer에는 실제 읽어온 데이터를 담고 있는 버퍼객체 입니다.

3. 입력이 모두 끝나면 close() 메서드를 호출하여 파일과의 입출력 통로 연결을 닫습니다.

블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

,