먼저 아래 글을 읽고 오자
•
해당 포스팅은 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”