AWS S3 동영상 다중 업로드

AFDB·2024년 8월 23일

AWS S3에 동영상을 업로드 중인데, 여러 개의 동영상을 업로드해야한다.

🔎 (문제 1) 현재는 단일 URL만 저장하고 있다.(여러 개의 주소를 넣어야 한다.)

지금은 media 컬럼에
https://[AWS S3 주소]Videos/비디오키.mp4
이런 URL 주소가 저장되는 형식
❓ 여러 개의 동영상을 업로드하기 위해서는 URL을 여러 개 담을 수 있는 배열 형식으로 컬럼 속성을 바꿔야 함
✅ media 컬럼의 데이터 타입을 JSON으로 변경 type: DataTypes.JSON
JSON 데이터 타입을 활용한 비정규화를 통해 단일 URL 저장에서 다중 URL 저장이 가능하도록 테이블 구조를 변경함
✅ 단순 문자열(string)로 저장되던 데이터를 JSON 형식으로 바꿈으로서 배열 비정규화를 통해 배열을 저장할 수 있게 되고, 데이터베이스가 구조화된 데이터로 처리할 수 있게 되었다.

🔎 (문제 2) AWS S3 미들웨어 수정

❓ S3에 URL이 배열인 채로 S3에 올라가야 하니, S3 폴더에 업로드하는 모듈을 변경해야 한다.
uploadVideo: upload("videos", videoFileFilter).array("videos", 10) videos 요청으로 배열 형식 10개가 업로드되도록 미들웨어 수정

🔎 (문제 3) 동영상 업로드 함수 수정

한 개의 URL 말고, 배열에 for문을 돌려서 배열의 요소 모두 S3에 업로드 하도록 변경해야 함

🔎 (문제 4) 라우팅 코드 수정

❓ 단일 URL일 때, single로 설정되어 있던 라우트 코드 변경

기존 router.post("/videos", uploadVideo.single("video"), Cvideo.uploadVideo);
→ 변경 router.post("/videos", uploadVideo, Cvideo.uploadVideo);

🔎 (문제 5) 여러 개의 동영상 모두 썸네일을 추출하고 있었다.

❓ 첫 번째 동영상에 대해서만 썸네일을 추출하도록 if (i === 0) { ...} 이렇게 0번째 인덱스에 해당하는 동영상에서 추출한 썸네일만 저장하려고 했다.
✅ BUT! 일단 모든 동영상의 썸네일을 추출하고 만약 사용자가 썸네일에 해당하는 동영상을 삭제하면, 그 다음 동영상의 썸네일을 보여줘야한다. 그래서 모든 동영상의 썸네일을 추출하도록 유지했다.

🔎 (문제 6) URL이 배열로 들어가기 때문에 S3 주소가 읽힐 때, [”https://~”,"https://~] 이런 식으로 읽힌다.

🔥 그래서 콘솔 로그 찍으면 %22https://~%22 이런 식으로 노답으로 들어갔다. 때문에 제대로 주소를 못 읽어서 에러 발생
→ 배열이라서 제일 앞,뒤의 대괄호와 큰따옴표가 %22로 바뀌어서 주소를 못 읽는 것 같다
🔥 이 부분에서 시간이 오래 걸렸는데 결론적으로, %22가 붙어서 나온다는 건, JSON 타입이 아니라 단순한 문자열인 string으로 바뀌었다는 뜻이다.
🔥 분명 post 테이블에서 데이터 타입을 JSON으로 바꿨는데 왜 아직도 단순 문자열일까

✅ models/post.js 에서 시퀄라이즈만 type: DataTypes.JSON 으로 바꾸는 것이 다가 아니었다. → 시퀄라이즈 모델에선 바뀌었지만, MySQL 워크벤치에서 조회해보니 안 바뀌었다.
DESCRIBE post; 로 MySQL 워크벤치에서 확인해보니 아니나 다를까

저 부분이 여전히 varchar(255)로 되어있었다.(캡쳐사진에선 수정 후라 JSON)

🤯당장 바꿔🤯
ALTER TABLE post MODIFY COLUMN media JSON NOT NULL;
😌 해결

0개의 댓글