티스토리 뷰
개발을 시작하면서, 이미지, 영상을 저장해야 할 일이 생겼다. 그래서 어떠한 방법들이 있는지 조사하던 중에 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
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
'etc' 카테고리의 다른 글
[mysql] ubuntu 18.06에서 MySQL 설치 및 외부접속 허용하기 (0) | 2022.10.11 |
---|---|
[spring-rest-docs] adoc 파일을 pdf로 저장하는 방법 (2) | 2022.10.05 |
[JAVA] JAVA 로 SCP 실행하는 방법 (jSch 라이브러리) (0) | 2022.07.05 |
[ Docker ] Docker 외부 포트 설정 (직접 명령어 & REST API 적용) (0) | 2022.07.05 |
[Maven] Maven 프로젝트 실행가능한 Jar 파일 만들기 (0) | 2022.07.01 |