NoSQL 데이터베이스는 전통적인 관계(예: 일대다 또는 일대일)를 요구하지 않고 더 복잡한 구조를 허용함으로써 관계형 데이터베이스와 다릅니다. 대신, NoSQL 데이터베이스는 배열이나 서브문서와 같은 유연한 유형을 활용하여 관련 데이터를 단일 문서 내에서 효율적으로 저장합니다. 이러한 유연성은 개발자들이 애플리케이션의 쿼리 및 성능 요구에 맞는 모델을 설계할 수 있도록 합니다.
자카르타 NoSQL는 MongoDB를 포함한 NoSQL 데이터베이스와의 상호작용을 간소화하는 Java 프레임워크입니다. 이 프레임워크는 데이터가 어떻게 매핑되고 저장되는지를 결정하는 주석을 제공하여, 개발자가 포함된 객체가 그룹화될지 또는 평면 방식으로 저장될지를 제어할 수 있도록 합니다.
MongoDB와 자카르타 NoSQL을 사용할 때 주요 고려 사항 중 하나는 문서를 어떻게 구조화할 것인지입니다. 평면 구조와 그룹화된 구조 중에서 선택하는 것은 데이터가 저장되고, 쿼리되고, 검색되는 방식에 영향을 미칩니다. 이 기사에서는 실용적인 예제를 사용하여 이 두 가지 접근 방식을 탐구합니다.
자카르타 NoSQL과 제품 엔티티
평면 및 그룹화된 구조를 이해하기 위해 먼저 Product
엔티티를 소개하고 자카르타 NoSQL 주석이 어떻게 작동하는지 살펴보겠습니다:
public class Product {
ObjectIdConverter.class) (
private String id;
private String name;
private Manufacturer manufacturer;
private List<String> tags;
private Set<Category> categories;
Product(String name, Manufacturer manufacturer, List<String> tags, Set<Category> categories) {
this.name = name;
this.manufacturer = manufacturer;
this.tags = tags;
this.categories = categories;
}
public static ProductBuilder builder() {
return new ProductBuilder();
}
}
이제 자카르타 NoSQL 주석에 따라 manufacturer
필드를 다르게 저장할 수 있는 방법을 탐구해 보겠습니다.
그룹화된 구조와 평면 구조 이해하기
그룹화된 구조
그룹화된 구조는 문서 내에서 관련 정보를 별도의 객체로 조직합니다. 이 접근 방식은 가독성을 향상시키고 더 깔끔한 도메인 모델링 관행을 가능하게 합니다. 자카르타 NoSQL은 @Embeddable(Embeddable.EmbeddableType.GROUPING)
을 사용하여 이를 달성합니다.
예시:
{
"_id": { "$oid": "67b264520abd020ec0eb9a4c" },
"categories": [
{ "name": "Computers", "description": "All computers" },
{ "name": "Electronics", "description": "All electronics" }
],
"manufacturer": {
"address": "One Infinite Loop Cupertino, CA 95014",
"name": "Apple",
"contactNumber": "+1-408-996-1010"
},
"name": "MacBook Pro",
"tags": ["smartphone", "tablet", "laptop"]
}
여기서 제조업체는 그룹화되어 속성이 최상위 수준에 있지 않고 별도의 하위 객체로 배치됩니다.
Embeddable.EmbeddableType.GROUPING) (
public record Manufacturer( String name, String address, String contactNumber) {}
평면 구조
이 평면 구조는 관련 정보를 동일한 문서 내에 유지하며, 목록이나 중첩 필드를 직접 포함합니다. 자카르타 NoSQL은 @Embeddable(Embeddable.EmbeddableType.FLAT)
을 사용하여 이를 가능하게 합니다. 이 접근 방식은 복잡한 쿼리 없이 모든 세부 정보에 빠르게 접근할 수 있을 때 유용합니다.
예시:
{
"_id": { "$oid": "67b22d20c921154b0223b27b" },
"address": "One Infinite Loop Cupertino, CA 95014",
"categories": [
{ "name": "Electronics", "description": "All electronics" },
{ "name": "Computers", "description": "All computers" }
],
"contactNumber": "+1-408-996-1010",
"name": "Apple",
"tags": ["smartphone", "tablet", "laptop"]
}
이 접근 방식은 제조업체 세부 정보를 직접 문서에 저장하며, 이를 별도의 필드로 그룹화하지 않습니다.
Embeddable.EmbeddableType.FLAT) (
public record Manufacturer( String name, String address, String contactNumber) {}
자카르타 NoSQL의 예제 사용법
다음 코드 스니펫은 자카르타 NoSQL이 이러한 구조를 어떻게 통합하는지 보여줍니다:
public class App {
public static void main(String[] args) {
var faker = new Faker();
try (SeContainer container = SeContainerInitializer.newInstance().initialize()) {
var template = container.select(DocumentTemplate.class).get();
var electronicsCategory = new Category("Electronics", "All electronics");
var computerCategory = new Category("Computers", "All computers");
var tags = List.of("smartphone", "tablet", "laptop");
var manufacturer = new Manufacturer("Apple", "One Infinite Loop Cupertino, CA 95014", "+1-408-996-1010");
Product macBookPro = Product.builder().categories(Set.of(electronicsCategory, computerCategory))
.manufacturer(manufacturer)
.name("MacBook Pro")
.tags(tags)
.build();
Product product = template.insert(macBookPro);
System.out.println("Product saved: " + product);
}
}
}
올바른 접근 방식 선택
- 모든 속성이 동일한 수준에 있는 간단한 문서 레이아웃이 필요할 때는 평면 구조를 사용하십시오.
- 가독성과 유지 관리성을 개선하기 위해 관련 데이터를 논리적 하위 객체로 조직할 때는 그룹화된 구조를 사용하십시오.
결론
자카르타 NoSQL은 @Embeddable(Embeddable.EmbeddableType)
를 사용하여 MongoDB 문서를 유연하게 구조화할 수 있습니다. 평면 또는 그룹화된 구조를 선택하는 것은 데이터 액세스 패턴과 모델링 선호도에 따라 다릅니다. 이러한 접근 방식을 이해하면 효율적인 데이터베이스 설계를 할 수 있으며, 쿼리를 보다 효과적으로 수행하면서 도메인 모델을 깔끔하고 잘 구조화할 수 있습니다.
전체 코드는 GitHub 저장소에서 확인할 수 있습니다.
동영상
Source:
https://dzone.com/articles/handling-embedded-data-in-nosql-with-java