Node.js에서 writable.cork() 메서드는 스트림에 기록된 모든 데이터를 강제로 메모리 내부의 버퍼에 저장하는 역할을 합니다. 이렇게 버퍼링된 데이터는 stream.uncork() 또는 stream.end() 메서드가 호출되기 전까지는 버퍼 메모리에서 해제되지 않습니다.
이러한 cork/uncork 메커니즘은 여러 개의 작은 데이터 조각을 한 번에 효율적으로 처리해야 할 때 특히 유용합니다. 데이터를 임시로 모아두었다가 한꺼번에 플러시함으로써 불필요한 시스템 호출을 줄일 수 있기 때문입니다.
문법
cork() 메서드
writable.cork()
uncork() 메서드
writable.uncork()
매개변수
cork()와 uncork() 메서드는 별도의 매개변수를 받지 않습니다. 두 메서드는 이미 스트림에 기록된 데이터를 대상으로 버퍼링 동작만 수행하기 때문입니다.
예제 1: cork() 메서드로 데이터 버퍼링하기
cork.js라는 이름의 파일을 생성하고 아래 코드를 복사하여 붙여넣습니다. 파일 생성 후 다음 명령어로 코드를 실행할 수 있습니다.
node cork.js
cork.js
// writable.cork() 메서드 사용 예제 프로그램
const stream = require('stream');
// 쓰기 가능한(writable) 데이터 스트림 생성
const writable = new stream.Writable({
// 스트림에서 데이터 기록 처리
write: function(chunk, encoding, next) {
// 출력을 위해 데이터 청크 변환
console.log(chunk.toString());
next();
}
});
// 데이터 기록
cwritable.write('Hi - This data is printed');
// cork() 함수 호출
writable.cork();
// 추가 데이터 기록
writable.write('Welcome to TutorialsPoint !');
writable.write('SIMPLY LEARNING ');
writable.write('This data will be corked in the memory');실행 결과
C:\home\node>> node cork.js Hi - This data is printed
위 실행 결과를 보면, cork() 메서드가 호출되기 전에 기록된 데이터만 화면에 출력되고, 그 이후에 기록된 나머지 데이터는 모두 버퍼 메모리에 저장(cork)된 것을 확인할 수 있습니다.
예제 2: uncork() 메서드로 버퍼 비우기
이번에는 uncork() 메서드를 사용하여 버퍼에 저장된 데이터를 어떻게 해제하는지 살펴보겠습니다.
uncork.js
// writable.cork() 메서드 사용 예제 프로그램
const stream = require('stream');
// 쓰기 가능한(writable) 데이터 스트림 생성
const writable = new stream.Writable({
// 스트림에서 데이터 기록 처리
write: function(chunk, encoding, next) {
// 출력을 위해 데이터 청크 변환
console.log(chunk.toString());
next();
}
});
// 데이터 기록
writable.write('Hi - This data is printed');
// cork() 함수 호출
writable.cork();
// 추가 데이터 기록
writable.write('Welcome to TutorialsPoint !');
writable.write('SIMPLY LEARNING ');
writable.write('This data will be corked in the memory');
// 버퍼 메모리에서 데이터 플러시
writable.uncork();실행 결과
C:\home\node>> node uncork.js Hi - This data is printed Welcome to TutorialsPoint ! SIMPLY LEARNING This data will be corked in the memory
uncork() 메서드를 통해 버퍼 메모리가 플러시되자, 이전 예제에서 저장되어 있던 모든 데이터가 정상적으로 출력된 것을 확인할 수 있습니다.
정리
writable.cork()는 스트림에 기록되는 데이터를 일시적으로 버퍼에 저장하고, writable.uncork()는 해당 버퍼를 비워 실제로 데이터를 출력하거나 전송합니다. 또한 stream.end() 메서드를 호출하면 uncork()를 명시적으로 호출하지 않아도 버퍼링된 데이터가 자동으로 플러시됩니다.