다양한 데이터베이스 구조를 처리하는 것은 종종 시스템 아키텍처에 중요한 복잡성을 도입하는데, 특히 여러 데이터베이스 인스턴스가 필요한 경우에는 더 그렇습니다. 이러한 단편화는 운영을 복잡하게 만들고 비용을 증가시키며 효율성을 감소시킬 수 있습니다. ArangoDB와 같은 멀티모델 데이터베이스는 이러한 도전에 대처하기 위한 통합 솔루션을 제공합니다. 이러한 데이터베이스는 단일 데이터베이스 인스턴스 내에서 키-값, 문서 및 그래프 데이터 모델을 지원하여 아키텍처를 단순화하고 데이터 관리를 간소화합니다.
관계형 데이터베이스와는 달리, NoSQL 데이터베이스는 SQL과 같은 범용 표준을 준수하지 않습니다. 대신, 그들은 그들의 저장 구조를 기반으로 분류됩니다. 인기있는 유형 중 일부는 다음과 같습니다:
- 키-값: Java
Map
이나 Python 사전과 유사하며, 이 구조는 키를 사용하여 전체 값을 BLOB로 검색합니다. - 와이드-칼럼: 키-값과 유사하지만 값들을 열로 분할하여 더 세분화된 데이터 검색을 제공합니다.
- 문서: JSON이나 XML과 유사한 구조로, 이 유형은 더 큰 쿼리 유연성을 제공합니다.
- 그래프: 엔티티와 그들의 연결을 나타내어 복잡한 관계 모델링과 쿼리를 가능하게 합니다.
멀티모델 데이터베이스는 이러한 기능들을 하나의 시스템으로 결합합니다. 예를 들어, ArangoDB는 키-값, 문서 및 그래프 모델을 지원하여 별도의 데이터베이스가 필요하지 않습니다.
본 문서는 Jakarta NoSQL을 사용하여 Java 애플리케이션에서 ArangoDB를 사용하여 키-값 및 문서 모델을 탐색하는 방법을 보여줍니다.
ArangoDB 설정하기
ArangoDB를 시작하기 위해 Docker는 서드파티 서비스를 관리하는 간단한 방법을 제공합니다. 다음 명령어를 실행하면 ArangoDB 인스턴스를 쉽게 설정할 수 있습니다:
docker run -e ARANGO_NO_AUTH=1 -d --name arangodb-instance -p 8529:8529 arangodb/arangodb
키-값 데이터 탐색하기
키-값 데이터베이스는 간단한 데이터 모델에 이상적입니다. ArangoDB의 키-값 기능을 사용하여 공항 데이터를 관리하는 샘플 애플리케이션을 만들어 보겠습니다. Airport
엔티티에는 code
(ID)와 name
두 개의 필드가 포함됩니다.
import jakarta.nosql.Column;
import jakarta.nosql.Entity;
import jakarta.nosql.Id;
import net.datafaker.Faker;
import net.datafaker.providers.base.Aviation;
import java.util.Objects;
public class Airport {
private String code;
private String name;
public String getCode() {
return code;
}
public String getName() {
return name;
}
public boolean equals(Object o) {
if (o == null || getClass() != o.getClass()) {
return false;
}
Airport airport = (Airport) o;
return Objects.equals(code, airport.code);
}
public int hashCode() {
return Objects.hashCode(code);
}
public String toString() {
return "Airport{" +
"code='" + code + '\'' +
", name='" + name + '\'' +
'}';
}
public static Airport of(Faker faker) {
Aviation aviation = faker.aviation();
var airport = new Airport();
airport.code = aviation.airport();
airport.name = aviation.airport();
return airport;
}
}
엔티티가 정의되면 KeyValueTemplate
을 사용하여 데이터베이스와 상호작용할 수 있습니다. 이 튜토리얼에서는 Eclipse JNoSQL를 사용하여 주석을 넘어 Jakarta NoSQL 기능을 더 많이 탐색할 것입니다. Eclipse JNoSQL이 Jakarta Data를 구현하고 지원하면 리포지토리를 생성할 수 있습니다.
import jakarta.enterprise.inject.se.SeContainer;
import jakarta.enterprise.inject.se.SeContainerInitializer;
import net.datafaker.Faker;
import org.eclipse.jnosql.mapping.keyvalue.KeyValueTemplate;
public class App {
public static void main(String[] args) {
var faker = new Faker();
try (SeContainer container = SeContainerInitializer.newInstance().initialize()) {
KeyValueTemplate template = container.select(KeyValueTemplate.class).get();
var airport = template.put(Airport.of(faker));
System.out.println(template.get(airport.getCode(), Airport.class));
}
}
}
이 프로그램은 무작위 공항 레코드를 생성하고, 데이터베이스에 삽입한 후 검색합니다. 로컬에서 실행 중이라면 다음 URL을 사용하여 브라우저로 데이터베이스의 값을 확인할 수 있습니다:
http://localhost:8529/_db/airport/_admin/aardvark/index.html#collections
문서 데이터 작업하기
Jakarta NoSQL은 상속 및 계층적 데이터 모델링 지원을 포함한 문서 데이터베이스 작업에 풍부한 기능을 제공합니다. 일반적으로 NoSQL 데이터베이스는 이러한 기능을 기본적으로 지원하지 않지만, Jakarta NoSQL은 API를 통해 이 간극을 메꿉니다. 우리는 클라우드 제공업체 데이터를 관리하기 위해 Jakarta NoSQL을 ArangoDB와 함께 사용하여 두 가지 전문화인 Amazon Web Services (AWS)와 Azure를 포함합니다.
Jakarta NoSQL은 문서 데이터베이스에서 상속을 관리하기 위해 @DiscriminatorColumn
, @DiscriminatorValue
, @Inheritance
주석을 사용합니다.
@DiscriminatorColumn
주석은 데이터베이스 문서에서 엔티티 유형을 식별하는 데 사용되는 필드를 지정합니다.@DiscriminatorValue
주석은 각 하위 클래스에 대한 특정 값을 정의하여 올바르게 식별되도록합니다.@Inheritance
주석은 클래스 계층 구조가 데이터베이스로 매핑될 것임을 나타냅니다.
먼저, 클라우드 제공업체를 위한 베이스 클래스를 정의합니다:
"type") (
public class CloudProvider {
protected String id;
protected String region;
}
다음으로, 전문화된 클라우드 제공업체 클래스를 소개합니다. 이 예제는 Jakarta NoSQL이 @DiscriminatorValue
주석을 활용하여 다른 문서 유형을 구별하는 방법을 보여줍니다. 각 전문화 – AWS 및 Azure -는 베이스 CloudProvider
클래스를 상속하면서 각 제공업체에 고유한 속성을 정의합니다. 또한 데모 목적으로 샘플 데이터를 생성하기 위한 팩토리 메서드 (of
)도 제공됩니다.
AWSCloudProvider
import jakarta.nosql.Column;
import jakarta.nosql.DiscriminatorValue;
import jakarta.nosql.Entity;
import net.datafaker.Faker;
import java.util.UUID;
"AWS") (
public class AWSCloudProvider extends CloudProvider {
private String accountId;
public String getAccountId() {
return accountId;
}
public String toString() {
return "AWSCloudProvider{" +
"accountId='" + accountId + '\'' +
", id='" + id + '\'' +
", region='" + region + '\'' +
'}';
}
public static AWSCloudProvider of(Faker faker) {
var aws = faker.aws();
var cloudProvider = new AWSCloudProvider();
cloudProvider.region = aws.region();
cloudProvider.region = aws.region();
cloudProvider.id = UUID.randomUUID().toString();
cloudProvider.accountId = aws.accountId();
return cloudProvider;
}
}
AzureCloudProvider
package org.soujava.demos.arangodb.document;
import jakarta.nosql.Column;
import jakarta.nosql.DiscriminatorValue;
import jakarta.nosql.Entity;
import net.datafaker.Faker;
import java.util.UUID;
"AZURE") (
public class AzureCloudProvider extends CloudProvider {
private String tenantId;
public String getTenantId() {
return tenantId;
}
public String toString() {
return "AzureCloudProvider{" +
"tenantId='" + tenantId + '\'' +
", id='" + id + '\'' +
", region='" + region + '\'' +
'}';
}
public static AzureCloudProvider of(Faker faker) {
var azure = faker.azure();
var cloudProvider = new AzureCloudProvider();
cloudProvider.region = azure.region();
cloudProvider.region = azure.region();
cloudProvider.id = UUID.randomUUID().toString();
cloudProvider.tenantId = azure.tenantId();
return cloudProvider;
}
}
마지막으로, DocumentTemplate
을 사용하여 데이터베이스와 상호 작용하는 방법을 살펴봅시다. 이 코드는 AWS 및 Azure 공급 업체의 인스턴스를 생성하고 데이터베이스에 삽입하고 검색하는 방법을 보여줍니다. 이 구현은 데이터 지속성을 처리하기 위해 Jakarta NoSQL의 API를 활용하며, 저장 및 검색 중에 상속 및 판별자 로직이 원활하게 적용됩니다.
import jakarta.enterprise.inject.se.SeContainer;
import jakarta.enterprise.inject.se.SeContainerInitializer;
import net.datafaker.Faker;
import org.eclipse.jnosql.mapping.document.DocumentTemplate;
import java.util.List;
import java.util.logging.Logger;
public class App {
private static final Logger LOGGER = Logger.getLogger(App.class.getName());
public static void main(String[] args) {
var faker = new Faker();
LOGGER.info("Starting the application");
try (SeContainer container = SeContainerInitializer.newInstance().initialize()) {
var template = container.select(DocumentTemplate.class).get();
LOGGER.info("Creating 10 documents");
for (int index = 0; index < 5; index++) {
template.insert(List.of(AWSCloudProvider.of(faker), AzureCloudProvider.of(faker)));
}
System.out.println("The cloud providers here");
template.select(CloudProvider.class).stream().forEach(System.out::println);
System.out.println("The AWS cloud providers here");
template.select(AWSCloudProvider.class).stream().forEach(System.out::println);
System.out.println("The Azure cloud providers here");
template.select(AzureCloudProvider.class).stream().forEach(System.out::println);
}
}
private App() {
}
}
결론
ArangoDB의 멀티모델 기능은 현대 애플리케이션에 대한 다재다능한 선택지를 제공합니다. 단일 데이터베이스에서 키-값 및 문서 모델을 결합하면 데이터 아키텍처를 간단하게 유지하면서도 유연성을 유지할 수 있습니다. Jakarta NoSQL을 사용하면 ArangoDB를 Java 애플리케이션에 원활하게 통합할 수 있으며, 익숙한 주석 및 프로그래밍 패러다임을 활용할 수 있습니다.
전체 코드는 GitHub 저장소를 방문하십시오.
Source:
https://dzone.com/articles/arangodb-success-through-multivalue-database