티스토리 뷰
개발을 시작하면서, 이미지, 영상을 저장해야 할 일이 생겼다. 그래서 어떠한 방법들이 있는지 조사하던 중에 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
https://www.mongodb.com/docs/manual/core/gridfs/
https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongo.mongo-db-factory
'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 |