1. 개요
진행하는 프로젝트에서 이미지와 같은 정적 파일들을 어디에 저장해야하는 지에 대한 고민을 작성해보려합니다.
제가 생각한 정적 파일을 저장하는 방법은 총 4가지 입니다.
2. 이미지 저장 방식 비교
1. 이미지 자체를 BLOB으로 저장
- 장점 : DB에 이미지 자체를 저장할 수 있어 일관성을 유지할 수 있습니다. 또한 DB백업만으로도 이미지를 복구할 수 있습니다.
- 단점 : 이미지 자체를 저장하는 방식이라 용량이 커지고 DB 성능 저하가 생길 수 있습니다.
2. Spring Boot의 정적 파일(resources)에 저장 후 DB에는 경로를 저장
- 장점 : 1번 방식과 다르게 DB의 용량 부담을 줄일 수 있습니다.
- 단점 : 애플리케이션 빌드 시 정적 파일로 관리되기 때문에 실시간 업로드 및 수정이 어렵습니다. 또한 정적 파일이 많아짐에 따라 서버의 디스크 용량과 관리 측면에서 부담이 될 수 있습니다.
3. Nginx 사용한다면 Nginx에 정적 파일 저장 및 DB 경로 저장
- 장점 : 구현이 단순하고, 클라우드 서비스를 이용하지 않고도 실시간 업로드가 구현이 가능합니다.
- 단점 : 결국 서버에 저장하는 방식이기때문에 디스크 용량이 부족해질 수 있고, 서버 성능 저하나 장애로 이어질 수 있습니다. 또한 여러 대의 Nginx 서버를 운영한다면 이미지의 일관성을 유지하기 어려울 수 있습니다.
4. AWS S3에 정적 파일을 저장하고 DB에는 경로만 저장
- 장점 :
- 대량의 데이터를 안정적으로 저장할 수 있어, 트래픽 급증이나 데이터량 증가에 효과적으로 대응할 수 있습니다.
- 서버와 분리되어 저장되기 때문에 서버 부하를 줄일 수 있습니다.
- CDN과 연계하여 빠르게 이미지를 전송할 수 있습니다.
- 단점 : 역시 가장 큰 단점은 비용이라고 생각합니다. 아래 이미지와 같이 저장하는 용량이나 접근마다 비용을 부과하는 방식입니다.

AWS S3 비용 정책
3. 결론
소규모 프로젝트에서는 상황에 따라 DB에 이미지 자체를 저장하거나, 애플리케이션 서버의 정적 파일에 저장하는 방식이 충분할 수 있다고 생각합니다.
하지만, 대규모 서비스나 실시간 이미지 업로드와 같이 특정 요구사항이 있는 경우에는 S3와 같은 클라우드 서비스를 이용하거나 Nginx에 정적 파일을 저장하는 방식이 효율적일 것이라고 생각합니다.
물론 비용이 충분하다면 S3 + CDN 조합이 모든 요구사항에 적합할 것이라고 생각합니다.
사실 현재 진행하는 프로젝트에서는 실시간 업로드가 필요하지 않고 이미지 파일도 그렇게 많은편도 아닌데다가
소규모 프로젝트라 resources에 이미지를 저장하여도 충분했습니다.
하지만, 비용이 충분하고...
(신한투자증권에서 비용을 내주기때문에...)
학습을 하는 과정이라 S3를 사용해보았습니다. 이미지를 빠르게 전달해주는 것까지는 필요없다고 판단하여 CDN은 추가하지않고
이후 서비스를 운영하게된다면 성능, 확장성 등을 생각했을 때 프로젝트와 상황에 맞는 방법을 다양하게 섞어서 선택할 수 있게되었으면 좋겠습니다 :)