데이터베이스

이미지와 오브젝트 스토리지

한땀코딩 2020. 11. 1. 19:36

이미지를 어떻게 관리할 것인가

학습의 목적으로 가볍게 이미지를 관리하던 프로젝트만 진행할 때는 단순하게 서버 쪽에 이미지 파일을 넣어두거나, 온라인에서 이미지 링크만 가져와서 사용했습니다. 하지만 서비스 내에서 유저가 유동적으로 이미지를 선택하고, 이 이미지에 대한 조회가 잦아지는 경우 모든 걸 서버에 넣어두기도 어려울 뿐만 아니라, 이후에 관리가 굉장히 어려워질 수 있습니다.

워낙 DB에 대한 지식이 짧다 보니, 이미지를 어떻게 db에 저장할 것인가에 대해 소소하게 검색을 해봤고 일반적으로 추천하는 방식은 이렇습니다.

 

  1. 이미지의 메타데이터(이미지 업로더, 이미지 제목, 분류 등)는 RDBMS에 저장해둔다. 이때 이미지의 링크를 저장할 칼럼도 함께 만든다.
  2. 이미지만을 관리하는 별도의 저장소를 만들어서 이미지는 이곳에 저장하고 그 주소만 가져와 위의 db의 링크 칼럼에 추가해준다.

이 과정에서 저 '별도의 저장소'란 무엇인지도 처음에 혼란이 있었는데, 알아보니 별개의 관계형 데이터베이스를 만드는 것이 아니라 오브젝트 스토리지를 활용하는 방식이 주를 이루고 있었습니다.

오브젝트 스토리지란

오브젝트 스토리지란?

오브젝트 스토리지를 검색해보면 IBM에서 정리한 글이 나오는데, 가장 심플하게 잘 설명되어 있는 것 같습니다.

오브젝트 스토리지는 클라우드에서 일반적으로 사용되는, 계층 없는 데이터 저장 방법입니다. 다른 데이터 스토리지 방법과 달리, 오브젝트 기반 스토리지는 디렉터리 트리를 사용하지 않습니다. 개별 데이터 단위(오브젝트)가 스토리지 풀의 동일한 레벨에 있습니다. 각 오브젝트에는 애플리케이션에서 검색하는 데 사용되는 고유 식별자가 있습니다. 또한 각 오브젝트는 함께 검색되는 메타데이터를 포함할 수 있습니다.

관계형 데이터베이스처럼 트리 형태로 관리되는 것이 아니고, 파일 단위로 어딘가 저장해두고 그 주소만 발급받으면 쉽게 접근할 수 있는 느낌으로 이해할 수 있을 것 같습니다. 이런 강점 때문에 이미지는 오브젝트 스토리지에 넣어서 빠르게 저장, 접근하고 나머지 메타데이터는 연관성 있는 정보와 함께 관계형 데이터베이스에 저장하는 형식입니다.

MySQL에 이미지를 저장하는 방법?

물론 MySQL도 이미지를 직접 저장할 수 있는 옵션을 제공하고 있습니다. 이미지는 BLOB (Binary Large Object) 타입으로 DB에 저장됩니다. MySQL의 경우 제공하는 타입은 TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB이 있고, 기본적으로 binary string으로 취급한다고 합니다.

그렇다면 왜 MySQL에 바로 이미지를 저장하지 않고 오브젝트 스토리지를 활용하게 되는 걸까요? 가장 많이 언급되는 부분은 아무래도 비용 문제가 있습니다. 관계형 데이터베이스는 이미지와 같이 덩치가 큰 데이터를 관리하게 되면 순식간에 몸집이 불어나는데, 이렇게 되면 당연히 관리가 어려워집니다. DB에서 이미지 데이터 타입 자체를 다루기 어렵다기보다, 규모가 커질 때 확장성 면에서 불리할 수 있습니다. 물론, 이 또한 서비스의 구조에 따라 주관적으로 판단할 수 있는 부분입니다. 주로 DB에 바로 이미지를 저장하는 경우는 모든 데이터의 백업을 한 번에 모아서 해야 하거나, 잦은 수정이 없고 소량의 고정된 이미지를 사용하는 경우가 주로 언급되고 있습니다.

Is it a bad design to store images as blobs in a database?

 

Is it a bad design to store images as blobs in a database?

Answer (1 of 21): I have done it both ways multiple times for very large websites with high volume traffic. Quora User is correct that you can't make unequivocal statement that storing images in a database is always bad. I like a lot of his points. Most pe

www.quora.com

위 링크에서 관련하여 비교적 상세하게 설명을 해주고 있는데, 여기서 중요하게 언급되는 부분은 속도와 확장성입니다. DB 하나에 모든 이미지가 들어가있다면, 유저가 이미지를 조회하게 될 때 유저의 지역과 이미지의 크기에 따라 속도의 차이가 많이 발생할 수 있습니다. 이를 극복하기 위해 또 등장하는 개념이 CDN인데, 이를 활용하려면 관계형 데이터베이스가 아닌 별도의 저장공간으로 이미지와 같은 비정형 데이터를 분리하게 됩니다. CDN에 대해서는 가능하다면 별도의 포스팅에서 더 상세하게 적어보겠습니다.

오브젝트 스토리지 서비스

IBM Cloud Object Storage - 개요

클라우드 스토리지 | 웹 스토리지| Amazon Web Services

 

클라우드 스토리지 | 웹 스토리지| Amazon Web Services

Amazon Simple Storage Service(Amazon S3)는 업계 최고의 확장성, 데이터 가용성 및 보안과 성능을 제공하는 객체 스토리지 서비스입니다. 즉, 규모와 업종에 상관없이 고객이 이 서비스를 이용하여 데이터

aws.amazon.com

대표적으로 클라우드를 통해 제공되는 오브젝트 스토리지 중 잘 알려진 건 S3인 것 같습니다. 이 외에도 ncloud에서도 별도로 제공하고 있습니다. 이후 실제로 서비스를 하나 골라서 사용해보게 되면 좀 더 상세한 사용 후기도 함께 올려보려고 합니다.

'데이터베이스' 카테고리의 다른 글

ORM과 SQLAlchemy  (1) 2020.09.06