앱 동아리 활동 중, 이미지 저장시 필요한 파일해상도 별로 서버에 저장하라는 요청을 받았다.
나는 원본파일만 서버에 저장하고 GET 요청에 따라 클라이언트가 이미지를 resizing 하면 편리하다고 생각했는데,
서버가 필요한 이미지크기마다 저장해야 한다고 깨달았다. 정리해보자!
1. EC2
2. S3
3. Lambda
4. CDN (Cloud Front) , Lambda@edge
1. EC2
"가상 컴퓨터" 라고 이해하면 된다.
너가 만든 프로그램이 가상컴퓨터가 대신 실행시켜주는거야!
2. S3
정의 : S3란 인터넷 스토리지 서비스로 용량에 관계없이 파일을 저장할 수 있고 웹에서 파일에 접근할 수 있다.
사용이유 :
1. 보통 이미지 저장할 때 S3에 저장한다.
2. 저장 용량이 무한대이고, 파일 저장에 최적화돼 있다.
3. 용량을 추가하거나 성능을 높이는 작업이 필요없다.
4. 비용은 EC2와 EBS로 구축하는 것보다 훨씬 저렴하다.
여기서 질문! 데이터베이스 RDS를 쓰는데 S3를 왜 따로 써야하나요?
동적 웹페이지와 정적 웹페이지가 섞여있을 때
동적 웹페이지이지만 EC2에서 서비스하고
정적 웹페이지는 S3를 이용하여 성능도 높이고 비용도 절감되기 때문이다.
이미지 리사이징
클라이언트가 이미지를 S3에 저장을 요청한다.
질문 : 저장요청받은 원본 이미지만 S3에 저장을 하면, 나중에 큰 이미지크기 GET 요청 시는 어떻게 할까?
답 : 클라이언트가 저장된 원본이미지의 크기를 늘려서 서비스한다
하지만, 여기서 단점이 생긴다.
화질이 떨어지거나, 축소된 이미지를 원하는 경우는 과도한 고화질이 된다.
이를 해결하기 위해서, 필요한 사이즈 별로 데이터베이스에 저장한다.
하지만 S3로는 구현이 불가하기에 람다를 사용한다.
3. LambDa
람다는 함수단위의 코드를 저장하여 필요 시에만 함수를 실행해주는 서비스이다.
따라서 람다안에 리사이징 하는 코드를 넣고
클라이언트가 이미지 저장하는 요청을 보내면 람다 코드를 실행하여 필요한 이미지사이즈들을 만들어 S3에 저장한다.
하지만, 단점이 있다.
이미지를 저장할 때마다 람다함수를 통해 여러 사이즈의 이미지를 저장하다보면, S3의 용량이 너무 비효율적으로 증가한다.
여기서 람다함수를 적용하면 우측방식인데, 원본이미지 개수가 많아지면 시스템의 효율이 떨어진다.
4. CDN (Cloud Front), LambDa@edge
단순하게 사용자와 가까이에 있는데 이때 캐싱 기능을 통해 파일을 빨리 사용자에게 주는 곳이다.
지리적으로 분산된 여러 개의 서버, 웹 콘텐츠를 사용자와 가까운 곳에서 전송함으로써,
전송 속도를 높이고 전 세계 데이터 센터는 파일 복사본을 임시로 저장하는 프로세스인 캐싱을 사용한다.
CDN을 사용할 경우, 쓰이는 람다는 lambda@edge이다.
예시
기억할 것
1. 이미지 명 : myImage.png
2. 리사이징 정보 : q=90&w=150&h=150
만약 리사이징 정보가 CDN의 캐싱에 없을 경우,
S3에 가서 해당 이미지명을 찾아 람다함수를 적용해 리사이징을 하여 제공한다.
캐싱에 있을 경우, 바로 CDN에서 제공한다.
'Backend > JavaScript,NodeJS, Express' 카테고리의 다른 글
[NodeJS] Multer 와 S3로 이미지 처리하기 (0) | 2022.04.28 |
---|---|
[NodeJS] sharp 패키지 써보기. (0) | 2022.04.26 |
[JavaScript] 기본 개념 정리 (호이스팅, 비동기 구현 방식) (0) | 2022.03.19 |
s3로 이미지 저장하기 (0) | 2022.01.09 |
MYSQL의 int() 괄호 안의 숫자 의미는 무엇일까? (0) | 2021.11.16 |