TIL/BackEnd

[BE] preSignedUrl을 활용한 업로드 다운로드 구현 중 고민

JoJobum 2022. 7. 31.

[BE] 이미지 업로드, 다운로드 시의 고민 (feat. preSigned URL) — Registro (tistory.com)

 

[BE] 이미지 업로드, 다운로드 시의 고민1 (feat. preSigned URL)

이미지나 동영상을 업로드하고 다운로드하는 경우가 많음 이러한 작업을 서버단에서 처리해줄 때 EC2에 띄워져 있는 서버에 이미지를 받아서 이를 S3에 저장하는 방법이 있을 것이고 유저가 바

lackofwillpower.tistory.com

 

이전에 작성했던 글을 내용을 실제로 구현하면서 느꼈던 고민과 과정을 기록하고자한다.

 

우선 구현하면서 느꼈던 고민에 대해서 이야기해려고 한다.

 

정확히는 나의 경우는 게시글과 이미지/동영상 등을 처리할 두 테이블을 따로 만들어 게시글 하나에 여러개의 이미지/동영상을 연결하려고 했다. 위의 이미지에선 게시글 대신 user에 연결한 상황을 작성했다.
어쨌든 클라이언트가 S3에 파일을 업로드할 수 있는 preSignedURL을 요구하면 이를 받아서 주려고 할때
 
(2번 과정) preSignedUrl을 받으려고 할때 S3에 할당할 파일명도 미리 입력해서 넣어야 한다. 여기서 파일명이 겹치면 안되니깐 uuid을 사용해서 파일명을 바꾸게 된다

(3번 과정) preSignedUrl을 받고, 

(4번 과정) 받은 preSignedUrl과, 이전에 할당한 파일명을 클라이언트에게 던져주고 

(5번 과정) 클라이언트는 이(url만 있으면 된다)를 활용해 S3에 파일을 업로드한다.

(6번 과정) 업로드를 완료했다고 서버에게 보고할 때 userId 와 파일명을 보내며 보고 하면 

(7번 과정) 서버는 DB에 이미지/동영상 테이블에 저장한다

 

여기서 발생하는 고민은 나중에 다시 유저가 업로드한 이미지를 보고 싶을 때의 상황이다 

유저가 A라는 이미지를 다시 받아서 보고자 할때 우리는 어떻게 이 이미지에 대한 preSignedUrl 가져와서 보여줄 것이냐

유저의 로컬 이미지 파일명과 uuid가 생성한 파일명을 매핑하는 테이블을 생성하든 아니면 이미지/동영상 테이블에 로컬 이미지 파일명 컬럼을 만들어서 이를 들고 있어야 하나? 라는 생각이 들었고, 이렇게 하면 로컬 이미지 파일명이 바뀌면 매핑된 정보가 틀리게 되는 것인데 다른 변하지 않는 값으로 해야하나??... 라는 생각을 했다. 

그리고 이 매핑하는 시점을 고려하면 처음 uuid를 생성하는 순간에 이를 저장하자니 이때는 실제로 이미지가 업로드되지 않은 시점이기에 DB에 저장하는 것이 맞지 않다는 생각이 들었다. (uuid가 생성되는 순간은 2번 과정 이전인데, 실제로 이미지가 업로드 되는 건 5번 과정이 성공한 순간이기에)

 

생각이 꼬였던 이유가 내가 구현하려던 기능의 정확한 목적을 잊어버려서 였던 것 같다.

결국 내가 필요했던건 게시글에 올린 이미지 혹은 유저가 올린 이미지를 볼 수 있게 하는 것이였기에 그냥 s3에 저장되는 uuid로 만들어진 파일명만 클라에게 던졌다가 클라가 이를 다시 업로드완료 보고를 할때 s3의 파일명과 userId( 혹은 게시글 id)를 다시 던져주어 이것을 DB에 저장하기로 했다.

이러면 이제 나중에 게시글을 조회할 때 게시글의 이미지를 불러올 때 해당 게시글 id값으로 조인되는 이미지들의 s3 파일명을 가지고 preSignedUrl을 만들어서 던져주면 되기 때문이다.

 

 

(당시에는 좀 답이 안보이는 문제였는데 근데 정리하면서 쓰니깐 너무 당연한 내용같아서 부끄럽다. 그 순간에는 고민이 너무 되서 소마멘토님한테 물어봤더니 사용자가 업로드되는 파일명 그대로를 알아야할 필요가 있나? 라는 질문에 답하며 머릿속에서 정리가 되면서 해결이 되었었다)

 

반응형

댓글