Search

241028_1112_NestJS 정적 파일 서빙의 (거의) 모든 것 + 그런데 glory를 곁들인…

먼저 아래 글을 읽고 오자

해당 포스팅은 useStaticAssets → ServeStaticModule → StreamableFile 순으로 점차 복잡한 사례로 전개해 나가신 것이 읽기 쉬운 구성으로 되어있다.
방법 간의 차이와 용도를 비교하며 설명한 부분이 특히 유용했다.

정적파일 서빙의 대부분이 있는데 조금만 보태보자

정적 파일 서빙 시 보안이나 캐싱 옵션을 좀 더 세부적으로 조정해야 할 때, 커스텀 미들웨어를 활용해 접근 제어나 헤더 설정을 추가할 수 있다고 한다.
미들웨어 커스터마이징
middleware
또한, 다른 곳에도 비슷한 기능이 있는데, 고정된 정적 파일의 경우 캐싱 전략을 설정해 성능을 최적화할 수 있다고 한다.

좀더 뇌절해보자

그리고 실시간 데이터 스트림을 적용해보자 (NodeJS. PassThrough)

PassThrough는 Node.js의 stream 모듈에서 제공하는 스트림으로, 입력과 출력을 그대로 전달하여 데이터가 도착하는 즉시 클라이언트로 스트리밍하는 데 유용합니다.
상황 설명: 사용자 요청에 따라 실시간 데이터를 연속적으로 제공해야 하는 경우.
예를 들어, IoT 센서의 실시간 상태를 CSV 형식으로 요청 시마다 생성하여 제공.
구현 코드: 다음은 실시간으로 데이터를 수집하고 CSV 파일로 스트리밍하는 예제입니다.
//241028_0115_glory : 기존 코드는 사전에 생성된 엑셀 파일을 반환 //241028_1125_glory : PassThrough 스트림을 사용하여 실시간으로 CSV 형식의 데이터를 생성 및 스트리밍. import { Controller, Get, StreamableFile } from '@nestjs/common'; import { SensorDataService } from './sensor-data.service'; import { PassThrough } from 'stream'; @Controller('sensor-data') export class SensorDataController { constructor(private readonly sensorDataService: SensorDataService) {} @Get('export') async exportSensorData(): Promise<StreamableFile> { // 실시간 데이터 스트리밍용 PassThrough 스트림 생성 // - PassThrough 스트림은 데이터가 생성될 때마다 클라이언트로 즉시 전송할 수 있도록 도와줌 // - 실시간 데이터 수집 및 전송에 적합한 스트림 방식 const stream = new PassThrough(); // 실시간 데이터를 CSV 형식으로 스트림에 작성 // - SensorDataService에서 IoT 센서 등의 실시간 데이터를 수집 // - 요청 시점에서 CSV 파일 형식으로 데이터 작성 후 PassThrough 스트림에 입력 // - 클라이언트는 파일이 완전히 생성되지 않아도 데이터를 연속적으로 수신 가능 this.sensorDataService.streamSensorDataToCSV(stream); // StreamableFile로 PassThrough 스트림 반환 // - type과 disposition을 설정하여 클라이언트가 CSV 파일로 다운로드할 수 있도록 설정 return new StreamableFile(stream, { type: 'text/csv', disposition: `attachment; filename="sensor_data.csv"`, }); } }
TypeScript
복사

안녕하세요

한국전자기술연구원 김영광입니다.
관련 기술 문의와 R&D 공동 연구 사업 관련 문의는 “glory@keti.re.kr”로 연락 부탁드립니다.

Hello

I'm Yeonggwang Kim from the Korea Electronics Research Institute.
For technical and business inquiries, please contact me at “glory@keti.re.kr”