[Node.js] NodeJS 파일 입출력 [2]
이어지는 글
[Node.js] NodeJS 버퍼 객체](https://dololak.tistory.com/85)
NodeJS 세밀한 입출력 조작
Node를 이용해 입출력을 할 때 기능이나 성능을 위해서 또는 목적에 의해 필요한 부분만 입출력을 수행하는 등 세밀하게 조작해야 할 때가 있습니다. 이때는 입출력 대상에 직접 연결하여 입력 또는 출력을 직접 세밀하게 수행한 후 연결을 닫아주면 됩니다.
Node가 입출력을 수행하는 절차는 다음과 같습니다. 이러한 절차는 다른 언어들에서도 마찬가지이므로 알아두는 것이 좋습니다.
- Node 프로그램이 입출력을 수행할 대상과의 데이터 입출력 통로를 열어준다는 의미에서
open()메서드를 실행합니다. - 연결 이후 입출력을 수행하기 위해서
read(),write()메서드를 호출합니다. - 이후 모든 입출력 처리를 수행한 후 연결을 닫아주기 위해서
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에 데이터를 출력하는 로직을 알아보도록 하겠습니다.
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.length, null, function (err, written, buffer) {
if (err) throw err;
fs.close(fd, function () {
console.log('파일과의 연결 통로 닫음.');
});
});
});
출력결과
파일과의 연결 통로 열림
파일과의 연결 통로 닫음.
소스 두번 실행한 후 output.txt
출력할 내용
출력할 내용
-
파일과의 연결 통로를 열어주기 위해 파일시스템 모듈의
open()메서드를 사용함과 동시에open()이 성공했을 때 실행될 콜백 함수를 넘겨줍니다. 연결할 파일 경로는./output.txt이며'a'플래그는 파일에 데이터 출력 시 내용이 이미 있는 경우 해당 내용 뒤에 추가하여 출력한다는 의미입니다. 넘겨준 콜백이 실행될 때err과fd가 넘어오게 되어있는데err은 에러가 발생했을 때 넘어오는 에러 객체이며,fd의 경우 연결된 대상 파일의 정보를 담고 있는 파일 디스크립터 객체입니다. -
write()메서드를 통해 데이터를 출력합니다. 데이터를 출력할 대상이 누구인지 알아야 하기 때문에 파일 디스크립터 객체인fd를 첫 번째 인자로 넘기며 이때 데이터는 버퍼 객체에 담아 넘기게 됩니다. 이후0과buf.length를 넘겨주는데 이는 버퍼에 담긴 데이터 중 어디서부터 어디까지를 출력할지 정해줍니다.0부터 버퍼의 길이까지 넘긴다고 했으니 결국 버퍼에 담긴 데이터 모두를 출력하겠다는 의미가 됩니다. 출력이 끝났을 때 호출될 콜백을 마지막에 넘깁니다. -
출력이 모두 끝나면
close()메서드를 호출하여 파일과의 입출력 통로 연결을 닫습니다.
입력처리
위 출력 처리에서 output.txt에 출력한 데이터를 입력을 통해 읽어오도록 하겠습니다.
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.length, null, function(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('파일과의 연결 통로 닫음.');
});
});
});
출력결과
읽은 데이터 :
출력할 내용
출력할 내용
읽어온 데이터 byte 수 : 34
파일과의 연결 통로 닫음.
-
파일과의 연결 통로를 열어주기 위해 파일시스템 모듈의
open()메서드를 사용함과 동시에open()이 성공했을 때 실행될 콜백 함수를 넘겨줍니다. 연결할 파일 경로는./output.txt이며'r'플래그는 데이터를 읽겠다는 의미이며 만약 대상 파일의 경로에 존재하지 않는 경우 예외가 발생합니다. 넘겨준 콜백이 실행될 때err과fd가 넘어오게 되어있는데err은 에러가 발생했을 때 넘어오는 에러 객체이며,fd의 경우 연결된 대상 파일의 정보를 담고 있는 파일 디스크립터 객체입니다. -
read()메서드를 통해 데이터를 입력합니다. 데이터를 읽을 대상이 누구인지 알아야 하기 때문에 파일 디스크립터 객체인fd를 첫 번째 인자로 넘기며 이때 데이터는 버퍼 객체에 담아 넘기게 됩니다. 이후0과buf.length를 넘겨주는데 버퍼의0번째 주소에서부터 버퍼의 끝까지의 공간에 데이터를 담아서 읽겠다는 의미입니다. 파일로부터 데이터 입력이 완료됐을 때의 콜백 함수를 넘겨받는데 에러가 발생했을 때 에러 객체가err에 담겨오게 되며,bytesRead는 읽어온 데이터가 몇 바이트인지 값이 담겨있으며buffer에는 실제 읽어온 데이터를 담고 있는 버퍼 객체입니다. -
입력이 모두 끝나면
close()메서드를 호출하여 파일과의 입출력 통로 연결을 닫습니다.
'NodeJS' 카테고리의 다른 글
| [Node.js] NodeJS 로깅 (Logging) (1) | 2018.01.28 |
|---|---|
| [Node.js] NodeJS 파일 입출력 [3] 스트림 단위 입출력 (0) | 2018.01.27 |
| [Node.js] npm이란 - 외부 모듈 사용하는 방법 (0) | 2018.01.03 |
| [Node.js] Node 작성한 모듈을 외부 모듈로 만드는 방법, exports 사용법 (0) | 2018.01.02 |
| [Node.js] NodeJS 이벤트리스너 등록 개수 제한 해제 (0) | 2017.12.31 |
도로락
WriterIT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그