파비의 매일매일 공부기록

깔끔한 파이썬 탄탄한 백엔드 - #11 파일 업로드 엔드포인트 본문

Study/Python

깔끔한 파이썬 탄탄한 백엔드 - #11 파일 업로드 엔드포인트

fabichoi 2021. 8. 6. 23:30

이번장은 구현이 조금 더 까다로울 수 있는 '파일 업로드' 기능에 대해 소개한다.

 

요즘 어떤 시스템이든 로그인하면 사용자의 profile 사진을 설정할 수 있다.

현재 만들어진 API에는 profile 사진에 대한 내용이 없기에 이를 구현한다.

 

지금까지는 Request/Response시 거의 application/json content type을 이용했으나

이번에는 multipart/form-data의 content type을 이용할 것이다.

 

request body를 여러 부분으로 나누는 boundary값에 유의해야 한다.

request body의 각 부분은 --<boundary 값>인데, 마지막은 --<boundary 값>--으로 표시된다.

 

백엔드 API 서버에 파일을 업로드하는 부분에 대한 예제가 소개된다.

다른 것보다 기억에 남는 부분은 SQL Injection Attach처럼 파일 업로드는 해킹에 취약할 수 있기에 저자는 secure_filename이라는 라이브러리를 활용하여 이를 방지한다.

 

그 후에는 AWS S3에 이미지 파일 저장하는 내용이 소개된다.

백엔드 API 서버에 이미지를 저장할 경우 크게 3가지의 이슈에 대해 언급한다.

 

1. 저장 공간 문제 : 이미지 파일들은 보통 사이즈가 크므로 운영되는 시간이 길어질수록 용량을 많이 차지하게 되며 AWS 같은 클라우드 서비스를 이용할 경우 디스크 공간에 대한 금액이 늘어날 수 있다.

 

2. 파일 전송 속도 : 파일의 사이즈가 크게 되면 당연히 파일 전송 속도가 늘어나며 여러 사용자가 한 번에 여러 이미지를 업로드할 경우 부하가 커져 서버 자체가 뻗거나 느려질 수 있는 이슈가 있다.

 

3. 확장성 : 서버 증설이 용이하지 않은 이슈가 있다. 스케일 아웃이라고도 하는 백엔드 API 서버를 늘려야 하는 상황일 때 모든 서버가 동일한 이미지를 가지고 있어야 하거나 데이터를 가지고 있는 서버에 접속해서 응답을 해야 하는 이슈가 있으므로 복잡성이 증가할 수 있다. 따라서 파일에 대한 처리만 전담 처리하는 서버가 따로 필요하다.

 

CDN : Content Delivery Network. 콘텐츠를 네트워크에서 전송하는 서버. content는 이미지, 영상 등 스테틱 파일들을 의미한다. 웹사이트에서 보이는 이미지나 영상들을 웹 서버가 아닌 별도의 CDN을 통해서 전송한다. 이를 사용하는 이유는 저장 공간 문제, 파일 전송 속도, 확장성의 이유 때문이다.

 

AWS S3 : CDN을 직접 구현하거나 유료 CDN 서비스를 이용할 수 있는데 CDN 서비스를 직접 구현하는 것은 규모가 매우 커져서, 보통은 유료 CDN을 사용한다. 여러 기업들이 서비스하고 있는데, 저자는 AWS의 S3(Simple Storage Service)를 소개한다. 빠른 응답 속도가 필요할 경우 AWS CloudFront를 사용할 것을 권장한다.

 

나머지는 S3의 사용법에 대한 내용이다.

반응형
Comments