월요일부터 오늘까지 하루에 한 번 발표가 있어서 계속 회의와 발표 준비만 한 거 같습니다...
그래도 오늘 발표를 잘 마무리해서 기분이 좋았고 7시에 채용 설명회를 하고 회식해서 공부를 많이 하지 못했습니다. ㅠㅠㅠ
그래도 오늘 알아본 정보들을 정리해보겠습니다
설치
npm install --save @nestjs/mongoose mongoose
app.module.ts
: nestjs 애플리케이션에서 MongoDB와의 연결을 설정
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { MongooseModule } from '@nestjs/mongoose'; //mongoDB 연결
import { VideoModule } from './video/video.module';
@Module({
**imports: [MongooseModule.forRoot('mongodb://localhost:27017/test'), VideoModule]**,
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
우선 간단하게 연결만 시도한 상태여서 보안적인 측면에서 env 파일 필요 → config
video.schema.ts
: 데이터 모델을 정의
import { Prop, Schema, SchemaFactory } from "@nestjs/mongoose";
import { IsNotEmpty, IsString } from "class-validator";
import { Document } from 'mongoose';
export type VideoDocument = Video & Document;
@Schema()
export class Video extends Document {
@Prop({ required: true })
@IsString()
@IsNotEmpty()
name: string;
@Prop()
@IsString()
@IsNotEmpty()
url: string;
}
export const VideoSchema = SchemaFactory.createForClass(Video);
video.service.ts
: MongoDB와 상호 작용을 위한 서비스를 생성
import { Injectable } from '@nestjs/common';
import { Video, VideoDocument } from './schemas/video.schema';
import { Model } from 'mongoose';
import { InjectModel } from '@nestjs/mongoose';
@Injectable()
export class VideoService {
**constructor(@InjectModel(Video.name) private videoModel: Model<VideoDocument>) { }**
async findAll(): Promise<Video[]> {
return this.videoModel.find().exec();
}
async create(video: Video): Promise<Video> {
const createVideo = new this.videoModel(video);
return createVideo.save();
}
}
video.controller.ts
: MongoDB 서비스를 사용
import { Controller, Get, Post, Body } from '@nestjs/common';
import { VideoService } from './video.service';
import { Video } from './schemas/video.schema';
@Controller('video')
export class VideoController {
**constructor(private readonly videoService: VideoService) { }**
@Get()
findAll(): Promise<Video[]> {
return this.videoService.findAll();
}
@Post()
create(@Body() video: Video): Promise<Video> {
return this.videoService.create(video);
}
}
video.module.ts
:
import { Module } from '@nestjs/common';
import { VideoService } from './video.service';
import { VideoController } from './video.controller';
import { MongooseModule } from '@nestjs/mongoose';
import { Video, VideoSchema } from './schemas/video.schema';
@Module({
imports: [**MongooseModule.forFeature([{name: Video.name, schema: VideoSchema}])**],
providers: [VideoService],
controllers: [VideoController]
})
export class VideoModule {}
NoSQL
: join 필요없음Schema-less
: 하나의 collection 내의 document가 각각 다른 schema를 가질 수 있다.document
: JSON file → 실제로는 BSON (Binary 형태로 변경된 구조)https://waterfogsw.tistory.com/5
✅ GridFS 사용시 이점
[참고][실제 구현 코드](https://velog.io/@dpekfa144/%EC%8B%A4%EC%A0%84-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%9D%BC%EC%A7%80-27%EC%9D%BC%EC%B0%A8-) - 단 몽고DB 프리티어에서는 500MB이상 불가
간단하게 GridFS를 이용하여 영상 저장
from pymongo import MongoClient
from gridfs import GridFS
# mongoDB는 27017 포트사용
client = MongoClient('localhost', 27017)
# test라는 이름의 DB를 만든다.
db = client.test
# GridFS 인스턴스 생성
fs = GridFS(db, collection='test_gridfs_collection')
# 영상 파일 열기
with open('/Users/chosoobeen/Desktop/Jungle/video_test/video.webm', 'rb') as video_file:
# 영상 데이터를 GridFS에 저장
video_id = fs.put(video_file, filename='/Users/chosoobeen/Desktop/Jungle/video_test/video.webm')
print('영상이 MongoDB에 저장되었습니다. ID:', video_id)
서버에서 압축을 할지, 클라이언트에서 압축할지? 서버 환경에 따라 다를듯
압축을 해제하는 것은 클라이언트에서 하는게 나을지도..?
→ 클라이언트 측에서 병렬 처리와 더 빠른 하드웨어 성능을 활용할 수 있다.
또는 aws S3에 저장하고 저장된 URL? 또는 위치? 를 mongoDB에 저장
🔷 장점
‼️ 고려해야 할 사항
MediaStream Redcording API
웹 브라우저에서 웹 카메라, 마이크, 화면 등의 미디어 스트림을 녹화하는 기능을 제공하는 API
미디어스트림을 실시간으로 녹화하거나 녹화된 미디어 스트림을 재생할 수 있다.
나만의 설명:
Media Stream을 Recording 하는 API로 MediaRecorder객체 하나로 구성되어 있다.
즉, MediaStream객체를 통해 입력 받는 소리, 영상, 화면 등을 MediaRecorder객체로 녹음 및 녹화하는 API이다.
Blob(Binary Large Obeject)은 미가공 데이터를 처리하거나 간접 참조하는 객체