0Pricing
JavaScript Academy · 강의

변환 스트림

데이터가 파이프라인을 통과하는 동안 수정합니다.

변환 스트림은(는) CoddyKit의 무료 JavaScript Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 JavaScript Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. JavaScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

TransformStream이란 무엇인가요

TransformStream은 읽기 가능한 쪽과 쓰기 가능한 쪽 사이에 위치합니다. 입력된 chunk를 변환해 출력으로 내보내며, 데이터를 즉시 매핑하거나 필터링하거나 형태를 바꾸는 파이프 단계입니다.

구조

두 끝이 있습니다. writable은 데이터가 들어가는 곳이고 readable은 변환된 데이터가 나오는 곳입니다.

const ts = new TransformStream();
console.log(ts.writable, ts.readable);

transform 메서드

transform(chunk, controller) 함수로 동작을 정의합니다. 출력을 내보내려면 controller.enqueue()를 호출합니다.

const upper = new TransformStream({
  transform(chunk, controller) {
    controller.enqueue(chunk.toUpperCase());
  }
});

하나를 입력해 여러 개 출력하기

변환 과정에서는 입력 하나마다 0개, 1개 또는 여러 개의 chunk를 내보낼 수 있습니다. 데이터를 분할하거나 확장할 때 특히 유용합니다.

const splitter = new TransformStream({
  transform(line, controller) {
    for (const word of line.split(" ")) controller.enqueue(word);
  }
});

변환으로 필터링하기

제외하려는 chunk를 enqueue하지 않으면 됩니다.

const onlyEven = new TransformStream({
  transform(n, controller) {
    if (n % 2 === 0) controller.enqueue(n);
  }
});

flush 메서드

flush(controller)는 입력이 끝날 때 한 번 실행됩니다. 버퍼에 남은 데이터를 내보내거나 마지막 chunk를 내보내기에 적합합니다.

const ts = new TransformStream({
  transform(c, ctrl) { ctrl.enqueue(c); },
  flush(ctrl) { ctrl.enqueue("[END]"); }
});

chunk 사이에서 버퍼링하기

클로저에 상태를 유지하면 분할된 chunk를 결합할 수 있습니다. 예를 들어 임의의 바이트 경계에서 완전한 줄을 조립할 수 있습니다.

let buffer = "";
new TransformStream({
  transform(chunk, ctrl) {
    buffer += chunk;
    const parts = buffer.split("\n");
    buffer = parts.pop();
    for (const line of parts) ctrl.enqueue(line);
  },
  flush(ctrl) { if (buffer) ctrl.enqueue(buffer); }
});

내장 변환 스트림

플랫폼은 TextDecoderStream, TextEncoderStream, CompressionStream/DecompressionStream을 바로 사용할 수 있는 변환 기능으로 제공합니다.

const gzip = new CompressionStream("gzip");
const compressed = inputStream.pipeThrough(gzip);

pipeThrough로 연결하기

readable.pipeThrough(transform)은 소스를 transform에 연결하고 transform의 읽기 가능한 출력을 반환하므로 다음 단계에 바로 연결할 수 있습니다.

const out = sourceStream
  .pipeThrough(new TextDecoderStream())
  .pipeThrough(upper);

비동기 변환

transform은 비동기일 수 있습니다. 내부에서 await를 사용해 API를 호출하거나 각 chunk에 대해 비동기 작업을 수행할 수 있습니다. 스트림은 프라미스가 완료될 때까지 기다립니다.

new TransformStream({
  async transform(chunk, ctrl) {
    const result = await process(chunk);
    ctrl.enqueue(result);
  }
});

오류 전파

transform 내부에서 예외를 발생시키면 스트림에 오류가 발생합니다. 하위 소비자는 오류를 확인하고 처리 흐름이 종료됩니다.

new TransformStream({
  transform(chunk, ctrl) {
    if (!valid(chunk)) throw new Error("bad chunk");
    ctrl.enqueue(chunk);
  }
});

빠른 확인

변환 스트림을 테스트해 봅니다.

복습: 변환 스트림

transform과 flush로 변환을 만들고, 청크를 매핑·필터링·확장하고, 청크 경계를 넘어 버퍼링하고, CompressionStream 같은 내장 기능을 사용하고, pipeThrough로 단계를 연결했습니다. 다음 주제는 배압과 파이핑입니다.

자주 묻는 질문

“변환 스트림” 강의는 무료인가요?

네 — “변환 스트림” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 JavaScript Academy 강의 전체를 잠금 해제할 수 있습니다. JavaScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“변환 스트림”에서 뭘 배우나요?

데이터가 파이프라인을 통과하는 동안 수정합니다. 브라우저에서 직접 실행하는 실습 코드로 JavaScript Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

JavaScript Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 JavaScript Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“변환 스트림” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 JavaScript Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 JavaScript Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 읽을 수 있는 스트림
  2. Fetch 응답 스트리밍하기
  3. 변환 스트림
  4. 백프레셔와 파이핑
← JavaScript Academy(으)로 돌아가기