View
앞 블로깅에서는 S3에 파일을 업로드하는 기능을 컨트롤에서 구현하였다면, 이제는
서비스로 분리시키고, 파일 업로드와 동시에 DB의 voice테이블에 객체를 생성하는 작업을 해보려 합니다.
보시는 것처럼 컨트롤에 있던 AWS관련 메소드를 그대로 가져왔으며, 추가된 것이 있다면,
prisma.voice.create 메소드 입니다.
아래 함수를 작성 하던 도중 2가지 에러를 만났는데요,
1. 한가지는, fileSize필드이 타입인 decimal값의 범위를 너무 작게 준것 때문이었고,
umeric field overflow", detail: Some("A field with precision 8, scale 3 must round to an absolute value less than 10^5."
즉, Decimal field의 범위를 8,3으로 지정해주었는데, 범위를 벗어났다는 이야기 이다.
즉시, 범위를 10,3으로 바꾸어주니 이는 해결되었다.
2. 다른 하나는 url에 region을 입력하지 않기도 하였고, 파일명에 특수문자가 들어가 에러가 났던 것이었습니다.
url로 접속하였는데, 아래와 같은 에러가 나면 url에 이상이 있는 것으로 이는 2차 프로젝트 당시에도 제가 겪었던 같은 문제였기에 빠르게 해결할 수 있었습니다.
최종적으로 아래와 같은 service 코드가 작성되게 되었고,
async uploadVoice(sentence_id:number,file):Promise<VoiceDTO> {
const AWS_S3_BUCKET_NAME = 'flip-test2'
const AWS_REGION = 'ap-northeast-2'
AWS.config.update({
credentials: {
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
}
});
try {
const objectName = `${Date.now()}_${file.originalname}`;
const upload = new AWS.S3()
.putObject({
Key: objectName,
Body: file.buffer,
Bucket: AWS_S3_BUCKET_NAME,
ACL: 'public-read',
}).promise();
const url = `https://${AWS_S3_BUCKET_NAME}.s3.${AWS_REGION}.amazonaws.com/${objectName}`
const newVoice = this.prisma.voice.create ({
data: {
fileSize : file.size,
url : url,
user:{connect : {id : 1}},
sentence :{connect : {id : sentence_id}}
}
});
return newVoice;
} catch(error) {
console.log(error)
}
controller는 아래와 같다.
@Post('upload2')
@UseInterceptors(FileInterceptor('file'))
async createVoiceInstance(@Query('sentence_id') sentence_id :number,@UploadedFile() file):Promise<any>{
return await this.voiceService.uploadVoice(sentence_id, file);
}
여전히 궁금한것은 파일 크기에 대한 것이었다.
DB에 찍힌 아래 파일의 용량은 원본 파일의 용량(id:12)이다.
그런데, S3에 들어갈때는, 용량이 0.3MB 줄어드는 것을 알수 있었다. 압축이 되는 것 같다.
용량제한을 둘때는 원본 파일의 용량에 두어야한다.
그렇다면 DB에 저장되어야 하는 파일용량은 S3에 저장된 파일 용량이어야 하지 않을까 생각했다.
내가 짠 코드는 원본파일의 용량을 DB에 저장하고 있다.
그리고 구지 파일 용량을 DB에 저장할 필요가 있을까에 대한 생각도 해보았다.
단지 서비스 안에 파일 제한을 두는 코드를 작성하면 되지 않을까?
이것에 대해 좀더 고민해보아야 겠다.
'NestJS' 카테고리의 다른 글
TIL | NestJS_스트리밍 횟수 카운트 (0) | 2021.10.22 |
---|---|
TIL | NestJS_AWS_S3_controller에서 Service_2(파일 용량 제한) (0) | 2021.10.20 |
TIL | NestJS_TypeScript_AWS_S3 (0) | 2021.10.18 |
TIL | now(), @updateAt의 @db.Timestamptz(3)의 유무에 따른 시간 표시 (0) | 2021.10.18 |
TIL | 데이터 베이스에 데이터를 저장 (0) | 2021.10.18 |