티스토리 뷰

etc

[mongodb] image, video 저장하기

tbMaster 2022. 9. 27. 18:53
반응형

개발을 시작하면서, 이미지, 영상을 저장해야 할 일이 생겼다. 그래서 어떠한 방법들이 있는지 조사하던 중에 MongoDB에서 image, video를 저장할 수 있다하여, 테스트를 진행해보았다. 

 

결과

이미지 저장 및 가져오기

:  ./image/image1.png  파일을 mongoDB에 저장하는 테스트 코드이다.

: mongoDB에 저장된 이미지를 불러와 ./result/mongo/image1.png 로 저장하는 테스트 코드이다.

MongoDB에서 이미지와 영상은 동일한 코드로 저장되고, 불러올 수 있다. 아래는 영상에 대한 저장 및 불러오기 테스트 코드이며, 이미지와 다르지 않다는 것을 확인할 수 있다.

 

 

영상 저장 및 불러오기

 

테스트 수행 후, 생성된 결과 이미지, 영상이다.

 

 

동작 코드

spring-boot 에서 제공하는 mongodb를 dependecy 하였다.

implementation 'org.springframework.boot:spring-boot-starter-data-mongodb:2.7.4'

 

 

GridFSTemplate을 이용하여, GridFS을 이용할 수 있는데, 아래는 GridFSTemplate 이용을 위한 설정 코드이다.

// [1]
MongoCredential mongoCredential =
        MongoCredential.createCredential([userName],[database],[password]);

// [2]
mongoClient = MongoClients.create(MongoClientSettings.builder()
        .credential(mongoCredential)
            .applyConnectionString(new ConnectionString("mongodb://[mongdb_host]:[mongodb_port]")).build());

// [3]
mongoDatabaseFactory = new SimpleMongoClientDatabaseFactory(mongoClient, db);

// [4]
mappingMongoConverter = new MappingMongoConverter(new DefaultDbRefResolver(mongoDatabaseFactory),
        new MongoMappingContext());

// [5]
gridFsTemplate = new GridFsTemplate(mongoDatabaseFactory, mappingMongoConverter);

 

[1]  MongoCredential : MongoDB에 생성한 데이터베이스에 접근하기 위한 인증을 설정하는 클래스로,  userName, database, password를 작성해야 한다. 나의 경우, mongodb 에 데이터베이스를  생성한 후, authetication을 부여했기 때문에 MongodCredential을 사용하여 접근 가능하도록 하였다.

 

[2] MongoClient : MongoDB에 접근하기 위한 Client를 생성하는 클래스로,  MongoClientSettings를 이용해 MongoClient에 필요한 각종 설정을 작성하였다. 

※ 참고: MongoCredential 등 부가적인 설정을 할 필요가 없다면, [3]의 MongoDatabaseFactory에서 내부적으로 MongoClient를 생성해주기 때문에 따로 정의할 필요없다.

 

[3],[4] MongoDatabaseFactory, MappingMongoConverter : GridFsTemplate 에 파라미터로 필요하여 생성하였다.

※ MappingMongoConverter는 아직 잘 모르겠다....ㅜ

 

[5] GridFsTemplate : 이미지, 영상등의 binary 데이터를 조작하기 위해, spring boot에서 제공하는 Template 이다.

 

 

저장 코드

 

저장하는 데이터에 대한 메타 정보를 저장할 수 있으며, MetaData를 통해 가능하다.

public void saveObject(@NotNull byte[] bytes, @NotNull String filename, String contentType) {
    DBObject metaData = new BasicDBObject();
    //metaData.put("name", name);
    gridFsTemplate.store(new ByteArrayInputStream(bytes), filename, contentType, metaData);
}

 

조회 코드

 

저장된 바이너리 데이터를 가져오고 싶을 경우, getResource 메서드를 이용해서 가져온다.

   public Object findObject(String filename) {
        InputStream inputStream = gridFsTemplate.getResource(filename).getContent();
        return inputStream;
    }

 

 

GridFS 

GridFS는 바이너리로 데이터를 조작할 수 있게 한다. 단, 일정크기 이상으로 데이터가 크면, chunk 단위로 잘라 여러 여러 document에 저장한다.  chunk 당 document 하나이다. chunk는 기본적으로 255kB로 설정되어 있다. 

GridFS 를 쓰게 되면 2개의 Collection이 생성되어 데이터가 저장되는데, "fs.chunks", "fs.files" collection이 만들어진다.

fs.chunks 는 실제 binary 데이터가 저장되는 collection 이며, fs.files 는 binary 데이터에 대한 metadata가 저장되는 collection이다.

 

 

fs.files 에 저장된 데이터

 

 

fs.chunks 에 저장된 데이터

 

 

참고자료

https://www.baeldung.com/spring-data-mongodb-gridfs

 

GridFS in Spring Data MongoDB | Baeldung

A quick guide to interacting with GridFS using Spring Data MongoDB.

www.baeldung.com

https://docs.spring.io/spring-data/mongodb/docs/current/api/org/springframework/data/mongodb/gridfs/GridFsTemplate.html

 

GridFsTemplate (Spring Data MongoDB 3.4.3 API)

org.bson.types.ObjectId store(InputStream content, String filename, String contentType, Object metadata) Stores the given content into a file with the given name and content type using the given metadata.

docs.spring.io

https://www.mongodb.com/docs/manual/core/gridfs/

 

GridFS — MongoDB Manual

Docs Home → MongoDB Manual GridFS is a specification for storing and retrieving files that exceed the BSON-document size limit of 16 MB.Instead of storing a file in a single document, GridFS divides the file into parts, or chunks , and stores each chunk

www.mongodb.com

https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongo.mongo-db-factory

 

Spring Data MongoDB - Reference Documentation

abs, acos, acosh, add (* via plus), asin, asin, atan, atan2, atanh, ceil, cos, cosh, derivative, divide, exp, floor, integral, ln, log, log10, mod, multiply, pow, round, sqrt, subtract (* via minus), sin, sinh, tan, tanh, trunc

docs.spring.io

 

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함