개발 공부/spring
springboot에서 monogoDB 연동 부터 insert와 다양한 메서드 까지
solutionMan
2023. 4. 22. 15:26
반응형
*글 작성 계기 spring boot를 처음 접하면서 몽고DB를 연동하고 메서드를 사용하는데 어려움을 느껴서 정리차원에서 작성함
의존성 주입
Gradle
implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
Maven
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
Configuration 설정
@Configuration
public class MongoConfig extends AbstractMongoClientConfiguration {
@Value("${spring.data.mongodb.uri}")
private String uri;
@Value("${spring.data.mongodb.database}")
private String databaseName;
@Override
protected String getDatabaseName() {
return databaseName;
}
@Override
public MongoClient mongoClient() {
ConnectionString connectionString = new ConnectionString(uri);
MongoClientSettings mongoClientSettings = MongoClientSettings.builder()
.applyConnectionString(connectionString)
.build();
return MongoClients.create(mongoClientSettings);
}
@Bean
public MongoTemplate mongoTemplate() {
return new MongoTemplate(new SimpleMongoClientDatabaseFactory(mongoClient(), getDatabaseName()));
}
}
좀 더 자세한 사항은 아래 링크 참고
MongoTemplate 메소드 종류와 사용예시
- insert
- find
- findOne
- findAndModify
- update
- delete
- aggregate
- upsert
- distinct
- exists
- bulkOps
- geoNear
- gridFsTemplate
- insert 단일 문서나 여러 문서를 데이터베이스에 삽입
User user = new User("John", "Doe");
mongoTemplate.insert(user, "users");
List<User> users = List.of(new User("Alice", "Smith"), new User("Bob", "Johnson"));
mongoTemplate.insert(users, "users");
- find
Query query = new Query(Criteria.where("name").is("John"));
List<User> users = mongoTemplate.find(query, User.class, "users");
- findOne: 데이터베이스에서 단일 문서를 검색하는 데 사용
Query query = new Query(Criteria.where("name").is("John"));
User user = mongoTemplate.findOne(query, User.class, "users");
- findAndModify: 데이터베이스에서 문서를 검색하고 업데이트 또는 삭제하는 데 사용
Query query = new Query(Criteria.where("name").is("John"));
Update update = new Update().set("lastName", "Smith");
User oldUser = mongoTemplate.findAndModify(query, update, User.class, "users");
- update: 데이터베이스에서 문서를 수정하는 데 사용
Query query = new Query(Criteria.where("name").is("John"));
Update update = new Update().set("lastName", "Smith");
mongoTemplate.updateFirst(query, update, User.class, "users");
- delete: 데이터베이스에서 문서를 삭제하는 데 사용
Query query = new Query(Criteria.where("name").is("John"));
mongoTemplate.remove(query, User.class, "users");
- aggregate: MongoDB의 aggregation pipeline을 사용하여 데이터를 집계하고 변환하는 데 사용
Aggregation aggregation = Aggregation.newAggregation(
Aggregation.match(Criteria.where("age").gte(18)),
Aggregation.group("city").count().as("count")
);
List<CityCount> cityCounts = mongoTemplate.aggregate(aggregation, "users", CityCount.class).getMappedResults();
- upsert: 데이터베이스에서 문서를 검색하고 업데이트하는데, 검색 조건에 해당하는 문서가 없으면 새로운 문서를 삽입
Query query = new Query(Criteria.where("name").is("John"));
Update update = new Update().set("lastName", "Smith");
mongoTemplate.upsert(query, update, User.class, "users");
- count : 데이터베이스에서 문서의 개수를 세는 데 사용
Query query = new Query(Criteria.where("name").is("John"));
long count = mongoTemplate.count(query, User.class, "users");
- distinct: 데이터베이스에서 중복되지 않는 필드 값들의 리스트를 반환하는 데 사용
List<String> cities = mongoTemplate.distinct("city", new Query(), User.class, String.class);
- exists: 데이터베이스에서 문서가 존재하는지 여부를 확인
Query query = new Query(Criteria.where("name").is("John"));
boolean exists = mongoTemplate.exists(query, User.class, "users");
- bulkOps: 대량의 데이터를 한 번에 업데이트하거나 삭제하는 데 사용됩니다. BulkOperations 객체를 사용하여 여러 개의 update, insert, remove 작업을 수행할 수 있습니다. 이를 통해 I/O 작업을 줄이고 데이터 처리 속도를 향상
*아래의 코드에서 BulkMode는 작업을 순서대로 실행할 것인지, 동시에 실행할 것인지 여부를 결정하는데 사용됩니다. UNORDERED 모드는 작업을 순서대로 실행하지 않고 가능한 한 많은 작업을 동시에 실행합니다.
BulkOperations bulkOps = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, User.class);
Query query1 = new Query(Criteria.where("age").lt(18));
bulkOps.remove(query1);
Query query2 = new Query(Criteria.where("age").gte(18));
Update update = new Update().set("isAdult", true);
bulkOps.updateMulti(query2, update);
bulkOps.execute();
- geoNear: 메서드는 지리 위치와 관련된 작업을 수행할 때 사용됩니다. GeoResults 객체를 반환하며, 검색 반경, 좌표, 정렬 순서 등의 매개변수를 설정
*아래의 코드에서는 뉴욕의 위도, 경도를 기준으로 10km 반경 내에서 가까운 사용자들을 찾아 반환
NearQuery nearQuery = NearQuery.near(40.748817, -73.985428, Metrics.KILOMETERS).maxDistance(10);
GeoResults<User> geoResults = mongoTemplate.geoNear(nearQuery, User.class);
- gridFsTemplate:MongoDB의 GridFS 기능을 사용하여 대용량 파일을 저장하고 검색하는 데 사용됩니다. GridFSFile, GridFsResource 클래스를 제공하며, 파일 업로드, 다운로드, 삭제 등의 작업을 수행
*위의 코드는 /path/to/file.txt 파일을 읽어와 gridFsTemplate을 사용하여 MongoDB의 GridFS에 파일을 저장하는 예시
InputStream inputStream = new FileInputStream(new File("/path/to/file.txt"));
gridFsTemplate.store(inputStream, "file.txt", "text/plain");
geoNear
반응형