개요
이 튜토리얼에서는 Spring Data MongoDB 를 Java 운전자 와 함께 사용하여 Spring Boot 애플리케이션 에서 고성능 대량 삽입을 수행하는 방법을 학습 수 있습니다.
Spring Data MongoDB
Spring Data MongoDB 는 MongoDB 위한 공식 Spring Data 객체 문서 매퍼(ODM)입니다. 이를 통해 기존 Java 객체(POJO) 및 리포지토리 추상화를 사용하여 MongoDB 와 상호 작용 수 있습니다. 동적 쿼리, 인덱싱, 중첩 문서 매핑과 같은 MongoDB 관련 기능을 지원하는 동시에 수동 find() 및 update() 호출과 같은 상용구 코드를 줄입니다.
Spring Boot
Spring Boot는 Spring Framework를 기반으로 구축된 프레임워크 입니다. 자동 구성, 기본값 및 프로덕션 지원 기능을 추가하여 Spring Data MongoDB 와의 통합을 포함하여 Spring 기반 Java 애플리케이션 빌드를 간소화합니다. 자세한 내용은 Spring Boot 문서를 참조하세요.
종속성 주입
종속성 주입(DI)은 Spring Framework의 핵심 원칙입니다. 이를 통해 Spring 컨테이너 빈이라는 객체를 생성하고 관리 한 다음 이를 사용하는 다른 빈에 객체를 삽입할 수 있습니다. 이는 클래스가 사용하는 객체를 초기화하고 구성하는 역할을 하는 일반적인 객체 지향 개발과는 다릅니다.
종속성 주입에 대한 자세한 내용은 Spring Framework 문서의 종속성 주입 페이지를 참조하세요.
Spring Data BulkOperations 인터페이스
BulkOperations 데이터베이스 에 적용할 수 있는 쓰기 (write) 작업 목록이 포함된 Spring Data MongoDB 인터페이스입니다. 유사한 MongoDB Java 드라이버 작업에 매핑되는 다음 작업의 모든 조합을 처리하다 할 수 있습니다.
insertupdateOneupdateManyreplaceOnedeleteOnedeleteManyupsert
BulkOperation 는 정렬하거나 정렬하지 않을 수 있습니다. 순서가 지정된 대량 작업은 작업을 순차적으로 실행 , 오류가 감지되면 오류 코드와 함께 반환됩니다. 순서가 지정되지 않은 작업은 병렬로 실행 일반적으로 더 빠릅니다. 그러나 작업 중에 오류가 발생했는지 수동으로 확인해야 합니다.
대량 작업에 대한 자세한 내용은 다음 리소스를 참조하세요.
Spring Framework API 문서의BulkOperations
이 가이드의 대량 쓰기 작업
MongoDB Server 매뉴얼의 대량쓰기 작업
튜토리얼
이 튜토리얼의 완성된 샘플 앱 SpringDataBulkInsert 샘플 프로젝트 GitHub 리포지토리 에서 찾을 수 있습니다.
전제 조건
이 튜토리얼을 시작하기 전에 다음 구성 요소가 설치 및 설정하다 있는지 확인하십시오.
종속성 추가
사용 중인 MongoDB Java 드라이버 및 Java 버전과 호환되는 Spring Data MongoDB 버전을 사용해야 합니다. 호환성 사양은 Spring Data MongoDB 문서의 요구 사항 페이지 및 이 가이드 의 호환성 페이지를 참조하세요.
참고
Spring Initializr 또는 Spring Boot 샘플 spring-boot-starter-data-mongodb 프로젝트 pom.xml 의 복제본을 사용하여 프로젝트 만든 경우, 버전 관리 호환성이 이미 고려되었으며 구성 요소는 파일 에 이미 포함되어 있습니다.
pom.xml 파일 에 다음 종속성을 추가합니다.
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> <version>3.2.5 </version> </dependency> <dependency> <groupId>net.datafaker</groupId> <artifactId>datafaker</artifactId> <version>2.4.3</version> </dependency>
datafaker 종속성은 대량 쓰기 (write) 작업에 사용할 대량의 Product 객체를 생성하는 데 사용됩니다.
MongoClient 구성
클래스에는 Spring Data 프레임워크 가 MongoDB Server 와 상호 작용 수 있도록 허용하고 기타 구성 옵션을 설정하는 객체 에 대한 구성이 포함되어 있습니다. 구성 옵션에 대한 자세한 내용은 이 MongoConfig 가이드 의 MongoClient 연결 옵션 지정 페이지를 참조하세요.
이 애플리케이션 클래스에는 @Configuration 주석, 메서드에는 @Bean 주석, 매개변수 변환에는 @Value 주석을 사용합니다. 이러한 주석을 사용하면 Spring IoC(Inversion of Control) 컨테이너 객체를 관리 할 수 있습니다. 이러한 주석에 대한 자세한 설명은 Spring Data 프레임워크 가이드 의 다음 섹션을 참조하세요.
@Configuration및@Bean주석: Java 기반 컨테이너 구성@Value주석: @Value 사용
MongoConfig.java 파일 만들고 다음 구성 및 템플릿 클래스를 추가하여 MongoDB 연결을 설정하다 합니다.
package com.mongodb.examples.springdatabulkinsert; import com.mongodb.ConnectionString; import com.mongodb.MongoClientSettings; import com.mongodb.client.MongoClient; import com.mongodb.client.MongoClients; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.mongodb.core.MongoTemplate; public class MongoConfig { private String uri; private String databaseName; public MongoClient mongoClient() { ConnectionString connectionString = new ConnectionString(uri); MongoClientSettings mongoClientSettings = MongoClientSettings.builder() .applyConnectionString(connectionString) .build(); return MongoClients.create(mongoClientSettings); } public MongoTemplate mongoTemplate() throws Exception { return new MongoTemplate(mongoClient(), databaseName); } }
참고
API 대 인터페이스
이 구현 MongoRepository와 같은 Spring Data 리포지토리 인터페이스를 확장하는 대신 MongoTemplate API 사용하여 대량 작업을 세밀하게 제어할 수 있습니다.
application.properties 파일 에서 연결 문자열 (mongodb.uri), 데이터베이스 이름(mongodb.database) 및 대량 작업 수(documentCount)의 값을 설정합니다.
mongodb.database=bulk mongodb.uri=<connection string> documentCount=25000
이 튜토리얼에서는 라는 데이터베이스 bulk 25000 사용하고 저장할, 문서를 <connection
string> 생성합니다. 자리 표시자를 Atlas 배포서버 대한 연결 문자열 로 바꿉니다. 자세한 내용은 이 가이드 의 java-get-started-connection-string 섹션을 참조하세요.
객체를 문서에 매핑
클래스를 컬렉션 에 매핑하면 Spring IoC 컨테이너 객체를 MongoDB 문서로 저장 수 있습니다. 주석을 사용하여 클래스가 매핑되는 컬렉션 지정할 수 @Document 있습니다. 객체를 MongoDB 문서에 매핑하는 방법에 대한 자세한 내용은 Spring Data MongoDB 문서의 매핑 주석 개요 섹션을 참조하세요.
@Id 다음 코드의 주석은 객체 id 필드 MongoDB 문서에서 고유 _id 식별자로 사용되는 문서 필드 에 매핑됨을 나타냅니다. 배열을 제외한 모든 유형의 필드 고유 식별자로 선택할 수 있습니다. 자세한 내용은 Spring Data MongoDB 문서의 매핑 계층 섹션에서 _id 필드 처리하는 방법을 참조하세요.
다음 코드를 사용하여 Product.java 파일 만들어 Product 클래스를 정의하고 products 컬렉션 에 매핑합니다.
public class Product { private static final Logger LOG = LoggerFactory.getLogger(Product.class); private String id; private String name; private int qty; private double price; private Date available; private Date unavailable; private String skuId; public Product(String name, int qty, double price, Date available, Date unavailable, String skuId) { this.name = name; this.qty = qty; this.price = price; this.available = available; this.unavailable = unavailable; this.skuId = skuId; } public static List<Product> randomProducts(int count) { Faker faker = new Faker(); Random rand = new Random(); List<Product> retProds = new ArrayList<>(count); for (int i = 0; i < count; ++i) { Product product = new Product(faker.animal().name(), 1 + rand.nextInt(998), 10.0 + rand.nextInt(9999), new Date(), new Date(), faker.idNumber().valid()); retProds.add(product); } return retProds; } // Getters and setters }
Product 클래스에는 Product 객체의 배열 생성하는 정적 메서드가 포함되어 있습니다. 필드에 대한 getter 및 setter를 정의할 수도 있습니다.
제품을 저장할 리포지토리 정의
ProductRepository Product 객체 객체의 ProductRepository MongoTemplate MongoConfig @Autowired 컬렉션 관리 . 객체 에는 클래스에서 생성된 Bean이 삽입되어야 합니다.mongoTemplate 를 인수로 포함하는 생성자와 함께 주석을 사용하면 Spring 컨테이너 생성자 주입을 사용하여 종속성을 mongoTemplate 삽입합니다. 생성자 주입에 대한 자세한 내용은 Spring 프레임워크 문서의 생성자 기반 종속성 주입 섹션을 참조하세요.
다음 코드를 사용하여 ProductRepository.java 파일 만들고 ProductRepository 클래스를 정의하여 Product 객체 컬렉션 관리 .
public class ProductRepository { private static final Logger LOG = LoggerFactory .getLogger(ProductRepository.class); private final MongoTemplate mongoTemplate; public ProductRepository(MongoTemplate mongoTemplate){ this.mongoTemplate = mongoTemplate; } public void updateProductQuantity(String name, int newQuantity) { Query query = new Query(Criteria.where("name").is(name)); Update update = new Update(); update.set("quantity", newQuantity); UpdateResult result = mongoTemplate.updateFirst(query, update, Product.class); if (result == null) LOG.error("No documents updated"); else LOG.info(result.getModifiedCount() + " document(s) updated.."); } public int bulkInsertProducts(int count) { LOG.info("Dropping collection..."); mongoTemplate.dropCollection(Product.class); LOG.info("Dropped!"); Instant start = Instant.now(); mongoTemplate.setWriteConcern(WriteConcern.W1.withJournal(true)); List<Product> productList = Product.randomProducts(count); BulkOperations bulkInsertion = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, Product.class); bulkInsertion.insert(productList); BulkWriteResult bulkWriteResult = bulkInsertion.execute(); LOG.info("Bulk insert of " + bulkWriteResult.getInsertedCount() + " documents completed in " + Duration.between(start, Instant.now()).toMillis() + " milliseconds"); return bulkWriteResult.getInsertedCount(); } }
bulkInsertProducts() 메서드는 순서가 지정되지 않은 대량 삽입을 사용하므로 작업 순서를 보장하지 않아 성능을 향상시킬 수 있습니다.
대량 작업 수행
기본 애플리케이션 클래스는 ProductRepository 를 트리거하여 지정된 수의 Product 객체를 생성하고 MongoDB database 에 저장합니다. @Autowired 주석을 사용하여 ProductRepository를 삽입하고 로깅을 구현합니다.
애플리케이션 실행 하려면 메인 클래스에 다음 코드를 추가하세요.
public class SpringDataBulkInsertApplication implements CommandLineRunner { private int count; private static final Logger LOG = LoggerFactory .getLogger(SpringDataBulkInsertApplication.class); private ProductRepository repository; public static void main(String[] args) { SpringApplication.run(SpringDataBulkInsertApplication.class, args); } public void run(String... args) throws Exception { repository.bulkInsertProducts(count); LOG.info("End run"); System.exit(0); } }
결론
Spring Data MongoDB MongoDB 작업을 위한 높은 수준의 추상화를 제공합니다. 자동 종속성 주입을 지원하여 애플리케이션 아키텍처를 간소화할 수 있으므로 수동 클라이언트 구성과 복잡한 쿼리 처리가 필요하지 않습니다. 상용구 코드를 줄이고 객체 지향 데이터 액세스 지원함으로써 데이터 액세스 간소화하고 우려 사항을 명확하게 분리할 수 있습니다.
더 많은 리소스
Spring 및 Spring Data MongoDB 프레임워크에 대한 자세한 내용은 다음 리소스를 참조하세요.
지원 받거나 MongoDB Community 에 기여하려면 MongoDB 개발자 커뮤니티를 참조하세요.