개발 공부/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()));
    }
}

 

좀 더 자세한 사항은 아래 링크 참고

 

 

Connect to MongoDB

Connect to MongoDB Use MongoClients.create() (as of the 3.7 release), or MongoClient() for the legacy MongoClient API, to make a connection to a running MongoDB instance. Note The 3.5 release deprecated socket keep-alive settings, also socket keep-alive ch

mongodb.github.io

 

 

MongoTemplate 메소드 종류와 사용예시

 

  1. insert
  2. find
  3. findOne
  4. findAndModify
  5. update
  6. delete
  7. aggregate
  8. upsert
  9. distinct
  10. exists
  11. bulkOps
  12. geoNear
  13. 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

 

 

ull.im

울려 퍼지다.<br/> 반향하다.<br/> 공명하다.

blog.ull.im

 

반응형