

# 응답 스트리밍 지원 Lambda 함수 작성
<a name="config-rs-write-functions"></a>

응답 스트리밍 함수의 핸들러 작성은 일반적인 핸들러 패턴과 다릅니다. 스트리밍 함수를 작성할 때 다음을 수행해야 합니다.
+ `awslambda.streamifyResponse()` 데코레이터로 함수를 래핑합니다. `awslambda` 글로벌 객체는 Lambda의 Node.js 런타임 환경에서 제공됩니다.
+ 모든 데이터 처리가 완료되도록 스트림을 정상적으로 종료합니다.

## 응답을 스트리밍하도록 핸들러 함수 구성
<a name="config-rs-write-functions-handler"></a>

Lambda가 함수의 응답을 스트리밍해야 함을 런타임에 나타내려면 함수를 `streamifyResponse()` 데코레이터로 래핑해야 합니다. 그러면 런타임이 응답 스트리밍에 적합한 로직 경로를 사용하고 함수가 응답을 스트리밍할 수 있습니다.

`streamifyResponse()` 데코레이터는 다음 파라미터를 수락하는 함수를 수락합니다.
+ `event` - HTTP 메서드, 쿼리 파라미터 및 요청 본문과 같은 함수 URL의 호출 이벤트에 대한 정보를 제공합니다.
+ `responseStream` - 쓰기 가능한 스트림을 제공합니다.
+ `context` – 호출, 함수 및 실행 환경에 대한 정보를 메서드 및 속성에 제공합니다.

`responseStream` 객체는 [Node.js `writableStream`](https://nodesource.com/blog/understanding-streams-in-nodejs/)입니다. 이러한 스트림과 마찬가지로 `pipeline()` 메서드를 사용해야 합니다.

**참고**  
`awslambda` 글로벌 객체는 Lambda의 Node.js 런타임에서 자동으로 제공되므로 가져올 필요가 없습니다.

**Example 응답 스트리밍 지원 핸들러**  

```
import { pipeline } from 'node:stream/promises';
import { Readable } from 'node:stream';

export const echo = awslambda.streamifyResponse(async (event, responseStream, _context) => {
  // As an example, convert event to a readable stream.
  const requestStream = Readable.from(Buffer.from(JSON.stringify(event)));

  await pipeline(requestStream, responseStream);
});
```

`responseStream`은 스트림에 쓰기를 위한 `write()` 메서드를 제공하지만 가능하면 [https://nodejs.org/api/stream.html#streampipelinesource-transforms-destination-callback](https://nodejs.org/api/stream.html#streampipelinesource-transforms-destination-callback)을 사용하는 것이 좋습니다. `pipeline()`을 사용하면 쓰기 가능한 스트림이 더 빠른 읽기 가능한 스트림에 의해 압도되지 않도록 합니다.

## 스트리밍 종료
<a name="config-rs-write-functions-end"></a>

핸들러가 반환되기 전에 스트림을 제대로 종료해야 합니다. `pipeline()` 메서드가 이를 자동으로 처리합니다.

다른 사용 사례의 경우 `responseStream.end()` 메서드를 호출하여 스트림을 올바르게 종료하세요. 이 메서드는 스트림에 더 이상 데이터를 쓰지 말아야 한다는 신호를 보냅니다. `pipeline()` 또는 `pipe()`를 사용하여 스트림에 쓰는 경우에는 이 메서드가 필요하지 않습니다.

Node.js 24부터 Lambda는 핸들러가 반환되거나 응답 스트림이 종료된 후 해결되지 않은 promise가 완료되는 것을 더 이상 기다리지 않습니다. 함수가 타이머 또는 가져오기와 같은 추가 비동기식 작업에 의존하는 경우 핸들러에서 `await` 작업을 수행해야 합니다.

**Example pipeline()을 사용하여 스트림을 종료하는 예제**  

```
import { pipeline } from 'node:stream/promises';

export const handler = awslambda.streamifyResponse(async (event, responseStream, _context) => {
  await pipeline(requestStream, responseStream);
});
```

**Example pipeline()을 사용하지 않고 스트림을 종료하는 예제**  

```
export const handler = awslambda.streamifyResponse(async (event, responseStream, _context) => {
  responseStream.write("Hello ");
  responseStream.write("world ");
  responseStream.write("from ");
  responseStream.write("Lambda!");
  responseStream.end();
});
```