Node js Streams 튜토리얼: 파일 스트림, 파이프
Node.js의 파일 스트림
노드는 데이터 전송 메커니즘으로 스트림을 광범위하게 사용합니다.
예를 들어, console.log 함수를 사용하여 콘솔에 무엇이든 출력하면 실제로는 스트림을 사용하여 데이터를 콘솔에 보내는 것입니다.
Node.js에는 파일에서 데이터를 스트리밍하여 적절하게 읽고 쓸 수 있는 기능도 있습니다. 이제 스트림을 사용하여 파일을 읽고 쓰는 방법에 대한 예를 살펴보겠습니다. 이 예에서는 아래에 언급된 단계를 따라야 합니다.
단계 1) 아래 데이터가 포함된 data.txt라는 파일을 만듭니다. 이 파일이 로컬 시스템의 D 드라이브에 저장되어 있다고 가정해 보겠습니다.
Node.js 튜토리얼
개요
이벤트
데이터 연결
재스민 사용하기
단계 2) 스트림을 사용하여 파일에서 데이터를 읽는 관련 코드를 작성합니다.
var fs = require("fs"); var stream; stream = fs.createReadStream("D://data.txt"); stream.on("data", function(data) { var chunk = data.toString(); console.log(chunk); });
코드 설명:-
- 먼저 스트림을 생성하는 데 필요한 모든 기능을 포함하는 'fs' 모듈을 포함해야 합니다.
- 다음으로 createReadStream 메서드를 사용하여 읽을 수 있는 스트림을 만듭니다. 입력으로 data.txt 파일의 위치를 제공합니다.
- steam.on 함수는 이벤트 핸들러이며, 그 안에서 첫 번째 매개변수를 'data'로 지정하고 있습니다. 즉, 파일의 스트림에 데이터가 들어올 때마다 콜백 함수를 실행합니다. 우리의 경우에는 두 가지 기본 단계를 수행하는 콜백 함수를 정의합니다. 첫 번째는 파일에서 읽은 데이터를 문자열로 변환하는 것입니다. 두 번째는 변환된 문자열을 콘솔에 출력으로 보내는 것입니다.
- 우리는 데이터 스트림에서 읽은 각 데이터 덩어리를 문자열로 변환합니다.
- 마지막으로 각 문자열 변환 청크의 출력을 콘솔로 보냅니다.
출력:
- 코드가 제대로 실행되면 콘솔에 위의 출력이 표시됩니다. 이 출력은 data.txt 파일의 출력과 동일합니다.
파일에 쓰기
동일한 방식으로 읽기 스트림을 생성하는 것과 마찬가지로 쓰기 스트림을 생성하여 파일에 데이터를 쓸 수도 있습니다. 먼저 data.txt라는 내용이 없는 빈 파일을 만들어 보겠습니다. 이 파일이 컴퓨터의 D 드라이브에 있다고 가정해 보겠습니다.
아래 코드는 파일에 데이터를 쓰는 방법을 보여줍니다.
var fs = require("fs"); var stream; stream = fs.createWriteStream("D://data.txt"); stream.write("Tutorial on Node.js") stream.write("Introduction") stream.write("Events") stream.write("Generators") stream.write("Data Connectivity") stream.write("Using Jasmine")
코드 설명:-
- createWriteStream 메소드를 사용하여 쓰기 가능한 스트림을 생성합니다. 입력으로 data.txt 파일의 위치를 제공합니다.
- 다음으로 우리는 stream.write 메소드를 사용하여 텍스트 파일에 다양한 텍스트 줄을 썼습니다. 스트림은 이 데이터를 data.txt 파일에 쓰는 작업을 담당합니다.
data.txt 파일을 열면 이제 파일에서 다음 데이터를 볼 수 있습니다.
Node.js 튜토리얼
개요
이벤트
Generators
데이터 연결
사용 재스민 속
Node.js의 파이프
노드 애플리케이션 내에서 스트림은 두 개의 인수를 사용하는 Pipe() 메서드를 사용하여 함께 파이프될 수 있습니다.
- 데이터의 대상 역할을 하는 필수 쓰기 가능 스트림
- 옵션을 전달하는 데 사용되는 선택적 개체입니다.
한 파일에서 다른 파일로 데이터를 전송하려는 경우 파이프를 사용하는 일반적인 예입니다.
이제 파이프를 사용하여 한 파일에서 다른 파일로 데이터를 전송하는 방법의 예를 살펴보겠습니다.
단계 1) 아래 데이터가 포함된 datainput.txt라는 파일을 만듭니다. 이 파일이 로컬 시스템의 D 드라이브에 저장되어 있다고 가정해 보겠습니다.
Node.js 튜토리얼
개요
이벤트
Generators
데이터 연결
재스민 사용하기
단계 2) dataOutput.txt라는 비어 있는 빈 파일을 생성하여 로컬 시스템의 D 드라이브에 저장합니다.
단계 3) datainput.txt 파일에서 dataOutput.txt 파일로 데이터를 전송하려면 아래 코드를 작성하세요.
var fs = require("fs"); var readStream = fs.createReadStream("D://datainput.txt"); var writeStream = fs.createWriteStream("D://dataOutput.txt"); readStream.pipe(writeStream);
코드 설명:-
- 먼저 새 파일로 전송해야 하는 모든 데이터가 포함된 datainput.txt 파일에 대한 "읽기 스트림"을 생성합니다.
- 그런 다음 빈 파일이자 datainput.txt 파일에서 데이터를 전송하기 위한 대상인 dataOutput.txt 파일에 "writestream"을 생성해야 합니다.
- 그런 다음 파이프 명령을 사용하여 읽기 스트림에서 쓰기 스트림으로 데이터를 전송합니다. 파이프 명령은 읽기 스트림으로 들어오는 모든 데이터를 가져와서 쓰기 스트림으로 푸시합니다.
이제 dataOutput.txt 파일을 열면 datainput.txt 파일에 있던 모든 데이터가 표시됩니다.
Node.js의 이벤트
이벤트는 Node.js의 핵심 개념 중 하나이며, 때때로 Node.js를 이벤트 기반 프레임워크라고도 합니다.
기본적으로 이벤트는 일어나는 일입니다. 예를 들어, 데이터베이스에 대한 연결이 설정되면 데이터베이스 연결 이벤트가 트리거됩니다. 이벤트 중심 프로그래밍은 특정 이벤트가 트리거될 때 트리거되는 함수를 만드는 것입니다.
Node.js에서 이벤트를 정의하는 기본 예를 살펴보겠습니다.
'data_received'라는 이벤트를 생성하겠습니다. 이 이벤트가 발생하면 "data received"라는 텍스트가 콘솔로 전송됩니다.
var events = require('events'); var eventEmitter = new events.EventEmitter(); eventEmitter.on('data_received', function() { console.log('data received succesfully.'); }); eventEmitter.emit('data_received');
코드 설명:-
- 'events' 모듈을 포함하려면 require 함수를 사용하세요. 이 모듈을 사용하면 Node.js에서 이벤트를 생성할 수 있습니다.
- 새 이벤트 이미터를 만듭니다. 이는 3단계에서 정의된 콜백 함수에 "data_received"인 이벤트를 바인딩하는 데 사용됩니다.
- "data_received" 이벤트가 트리거되는 경우 "data_received" 텍스트를 콘솔에 출력해야 한다는 이벤트 기반 함수를 정의합니다.
- 마지막으로 eventEmiter.emit 함수를 사용하여 이벤트를 수동으로 트리거합니다. 그러면 data_received 이벤트가 트리거됩니다.
프로그램이 실행되면 아래와 같이 "data received"라는 텍스트가 콘솔에 전송됩니다.
이벤트 방출
이벤트를 정의할 때 호출할 수 있는 이벤트에 대한 다양한 메서드가 있습니다. 이 주제에서는 각 항목을 자세히 살펴보는 데 중점을 둡니다.
- 일회성 이벤트 핸들러
때로는 이벤트가 처음 발생할 때만 반응하고 싶을 수도 있습니다. 이러한 상황에서는 Once() 메서드를 사용할 수 있습니다.
이벤트 핸들러에 대해 Once 메서드를 어떻게 사용할 수 있는지 살펴보겠습니다.
코드 설명:-
- 여기서는 'data_received' 이벤트에 대해 콜백 함수가 한 번만 실행되어야 함을 나타내기 위해 'once' 메서드를 사용하고 있습니다.
- 여기서는 'data_received' 이벤트를 수동으로 트리거합니다.
- 'data_received' 이벤트가 다시 발생하면 이번에는 아무 일도 일어나지 않습니다. 이는 이벤트가 한 번만 트리거될 수 있다고 말한 첫 번째 단계 때문입니다.
코드가 제대로 실행되면 로그에 'data_received 성공적으로'가 출력됩니다. 이 메시지는 콘솔에 한 번만 나타납니다.
- 이벤트 리스너 검사
수명 중 어느 시점에서든 이벤트 이미터에는 XNUMX개 이상의 리스너가 연결될 수 있습니다. 각 이벤트 유형의 리스너는 여러 가지 방법으로 검사할 수 있습니다.
연결된 리스너 수만 확인하려는 경우 EventEmitter.listenerCount() 메서드만 살펴보세요.
(참고 : 리스너가 이벤트에 즉시 추가되는지 여부를 기본 프로그램에서 알아야 하기 때문에 리스너가 중요합니다. 그렇지 않으면 추가 리스너가 호출되므로 프로그램이 제대로 작동하지 않습니다.)
코드 설명:-
- 이벤트 관련 메서드를 사용하는 데 필요한 eventEmitter 유형을 정의하고 있습니다.
- 그런 다음 이벤트 핸들러를 정의하는 데 사용할 이미터라는 객체를 정의합니다.
- 우리는 기본적으로 아무것도 하지 않는 2개의 이벤트 핸들러를 생성하고 있습니다. 이 예제에서는 ListenerCount 메서드가 어떻게 작동하는지 보여주기 위해 간단하게 유지됩니다.
- 이제 data_received 이벤트에서 ListenerCount 메서드를 호출하면 콘솔 로그에서 이 이벤트에 연결된 이벤트 리스너 수를 보냅니다.
코드가 제대로 실행되면 콘솔 로그에 값 2가 표시됩니다.
- newListener 이벤트
새 이벤트 핸들러가 등록될 때마다 이벤트 이미터는 newListener 이벤트를 생성합니다. 이 이벤트는 새로운 이벤트 핸들러를 감지하는 데 사용됩니다. 일반적으로 리소스를 할당해야 하거나 각각의 새 이벤트 핸들러에 대해 일부 작업을 수행해야 할 때 newListener 이벤트를 사용합니다.
var events = require('events'); var eventEmitter = events.EventEmitter; var emitter = new eventEmitter(); emitter.on("newListener", function(eventName, listener) { console.log("Added listener for " + eventName + " events"); }); emitter.on('data_received', function() {}); emitter.on('data_received', function() {});
코드 설명:-
- 'newListener' 이벤트에 대한 새 이벤트 핸들러를 만들고 있습니다. 따라서 새 이벤트 핸들러가 등록될 때마다 "Added listener for" + 이벤트 이름이 콘솔에 표시됩니다.
- 여기서는 "Added Listener for"라는 텍스트 + 등록된 각 이벤트의 이벤트 이름을 콘솔에 쓰고 있습니다.
- 'data_received' 이벤트에 대해 2개의 이벤트 핸들러를 정의하고 있습니다.
위 코드가 정상적으로 실행되면 콘솔에 아래 텍스트가 출력됩니다. 단지 'newListener' 이벤트 핸들러가 두 번 트리거되었음을 보여줍니다.
data_received 이벤트에 대한 리스너가 추가되었습니다.
data_received 이벤트에 대한 리스너가 추가되었습니다.
요약
- 스트림은 Node.js에서 입출력 장치의 데이터를 읽고 쓰는 데 사용됩니다. Node.js를 'fs' 라이브러리를 사용하여 파일에 대한 읽기 및 쓰기 가능한 스트림을 만듭니다. 이러한 스트림은 파일에서 데이터를 읽고 쓰는 데 사용할 수 있습니다.
- 파이프를 사용하여 여러 스트림을 함께 연결할 수 있습니다. 가장 일반적인 예 중 하나는 한 파일에서 다른 파일로 데이터를 전송하기 위해 읽기 및 쓰기 스트림을 함께 파이프하는 것입니다.
- Node.js는 이벤트 기반 프레임워크로 태그되는 경우가 많으며 Node.js에서 이벤트를 정의하는 것은 매우 쉽습니다. 이러한 이벤트에 응답하는 함수를 정의할 수 있습니다.
- 이벤트는 주요 이벤트에 응답하기 위한 메서드도 노출합니다. 예를 들어, 이벤트가 트리거될 때 콜백 함수가 한 번만 실행되는지 확인하는 데 사용할 수 있는 Once() 이벤트 핸들러를 살펴보았습니다.