Spring Data 지원

이 문서에서는 Spring Cloud Azure와 Spring Data를 함께 사용하는 방법을 설명합니다.

Spring Data Azure Cosmos DB 지원

Azure Cosmos DB 개발자가 SQL, MongoDB, Graph 및 Azure Table Storage와 같은 다양한 표준 API를 사용하여 데이터를 사용할 수 있도록 하는 전역 분산 데이터베이스 서비스입니다.

종속성 설정

<dependency>
   <groupId>com.azure.spring</groupId>
   <artifactId>spring-cloud-azure-starter-data-cosmos</artifactId>
</dependency>

구성

메모

보안 주체를 사용하여 Azure 리소스에 액세스하기 위해 Microsoft Entra ID로 인증하고 권한을 부여하는 경우 보안 주체에게 Azure 리소스에 액세스할 수 있는 충분한 권한이 부여되었는지 확인합니다. 자세한 내용은 Microsoft Entra ID사용하여 액세스 권한 부여를 참조하세요.

다음 표에서는 spring-cloud-azure-starter-data-cosmos구성 가능한 속성을 나열합니다.

재산 묘사
spring.cloud.azure.cosmos.enabled Azure Cosmos DB 서비스를 사용할 수 있는지 여부를 나타내는 값입니다. 기본값은 true.
spring.cloud.azure.cosmos.database Azure Cosmos DB 데이터베이스 ID입니다.
spring.cloud.azure.cosmos.endpoint Azure Cosmos DB를 연결할 URI입니다.
spring.cloud.azure.cosmos.key Azure Cosmos DB를 연결하는 PrivateKey입니다.
spring.cloud.azure.cosmos.credential.client-certificate-password 인증서 파일의 암호입니다.
spring.cloud.azure.cosmos.credential.client-certificate-path Azure에서 서비스 주체 인증을 수행할 때 사용할 PEM 인증서 파일의 경로입니다.
spring.cloud.azure.cosmos.credential.client-id Azure에서 서비스 주체 인증을 수행할 때 사용할 클라이언트 ID입니다.
spring.cloud.azure.cosmos.credential.client-secret Azure에서 서비스 주체 인증을 수행할 때 사용할 클라이언트 암호입니다.
spring.cloud.azure.cosmos.credential.managed-identity-enabled 관리 ID를 사용하도록 설정할지 여부입니다. 기본값은 false.
spring.cloud.azure.cosmos.credential.password Azure에서 사용자 이름/암호 인증을 수행할 때 사용할 암호입니다.
spring.cloud.azure.cosmos.credential.username Azure에서 사용자 이름/암호 인증을 수행할 때 사용할 사용자 이름입니다.
spring.cloud.azure.cosmos.populate-query-metrics 진단 문자열 및 쿼리 메트릭을 채울지 여부를 나타내는 값입니다. 기본값은 false.
spring.cloud.azure.cosmos.consistency-level Azure Cosmos DB에 대한 일관성 수준.

주요 개념

다음 목록에서는 Spring Data 지원의 주요 개념을 보여 줍니다.

  • 다음과 같은 기본 CRUD 기능을 제공하는 Spring Data CrudRepositoryReactiveCrudRepository.

    • 구해내다
    • 모두 찾기
    • ID로 단일 항목 찾기
    • 모두 삭제
    • ID로 삭제
    • 엔터티 삭제
  • Spring Data @Id 주석입니다. 도메인 클래스의 필드를 Azure Cosmos DB 문서의 id 매핑하는 두 가지 방법이 있습니다.

    • @Id사용하여 도메인 클래스의 필드에 주석을 추가합니다. 이 필드는 Azure Cosmos DB의 문서 id 매핑됩니다.
    • 이 필드의 이름을 id설정합니다. 이 필드는 Azure Cosmos DB의 문서 id 매핑됩니다.

    메모

    두 가지 방법을 모두 적용하면 @Id 주석의 우선 순위가 더 높습니다.

  • 사용자 지정 컬렉션 이름입니다. 기본적으로 컬렉션 이름은 사용자 도메인 클래스의 클래스 이름이 됩니다. 사용자 지정하려면 도메인 클래스에 주석 @Document(collection="myCustomCollectionName") 추가합니다.

  • Azure Cosmos DB 파티션지원합니다. 도메인 클래스의 필드를 파티션 키 필드로 지정하려면 @PartitionKey주석을 추가합니다. CRUD 작업을 수행할 때 파티션 값을 지정합니다. 자세한 예제는 GitHub의 AddressRepositoryIT.java 참조하세요.

  • Spring Data 사용자 지정 쿼리 찾기 작업을 지원합니다.

  • spring-boot-starter-data-rest지원합니다.

  • 도메인 클래스에서 목록 및 중첩 형식을 지원합니다.

기본 사용량

프라이빗 키를 사용하여 Azure Cosmos DB 액세스

Azure Cosmos DB를 spring-cloud-azure-starter-data-cosmos 연결하는 가장 간단한 방법은 기본 키를 사용하는 것입니다. 다음 속성을 추가합니다.

spring:
  cloud:
    azure:
      cosmos:
        key: ${AZURE_COSMOS_KEY}
        endpoint: ${AZURE_COSMOS_ENDPOINT}
        database: ${AZURE_COSMOS_DATABASE}

엔터티 정의

다음 예제와 같이 Azure Cosmos DB에서 엔터티를 문서로 정의합니다.

@Container(containerName = "mycollection")
public class User {
    @Id
    private String id;
    private String firstName;
    @PartitionKey
    private String lastName;
    private String address;

    public User() {
    }

    public User(String id, String firstName, String lastName, String address) {
        this.id = id;
        this.firstName = firstName;
        this.lastName = lastName;
        this.address = address;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return String.format("%s %s, %s", firstName, lastName, address);
    }
}

id 필드는 Azure Cosmos DB의 문서 id 사용됩니다. 또는 @Id 있는 필드에 주석을 추가하여 문서 id매핑할 수 있습니다.

주석 @Container(containerName = "mycollection") Azure Cosmos DB에서 문서의 컬렉션 이름을 지정하는 데 사용됩니다.

리포지토리 만들기

리포지토리를 만들려면 Spring Data 리포지토리 지원을 제공하는 ReactiveCosmosRepository 인터페이스를 확장합니다.

@Repository
public interface UserRepository extends ReactiveCosmosRepository<User, String> {
    Flux<User> findByFirstName(String firstName);
}

현재 ReactiveCosmosRepository 인터페이스는 기본 저장, 삭제 및 찾기 작업을 제공합니다. 나중에 추가 작업이 지원됩니다.

애플리케이션 클래스 만들기

다음 예제에서는 모든 구성 요소를 사용하여 애플리케이션 클래스를 만듭니다.

@SpringBootApplication
public class CosmosSampleApplication implements CommandLineRunner {

private static final Logger LOGGER = LoggerFactory.getLogger(CosmosSampleApplication.class);

    @Autowired
    private UserRepository repository;

    @Autowired
    private CosmosProperties properties;

    public static void main(String[] args) {
        SpringApplication.run(CosmosSampleApplication.class, args);
    }

    public void run(String... var1) {
        final User testUser = new User("testId", "testFirstName",
                "testLastName", "test address line one");

        // Save the User class to Azure Cosmos DB database.
        final Mono<User> saveUserMono = repository.save(testUser);

        final Flux<User> firstNameUserFlux = repository.findByFirstName("testFirstName");

        //  Nothing happens until we subscribe to these Monos.
        //  findById won't return the user as user isn't present.
        final Mono<User> findByIdMono = repository.findById(testUser.getId());
        final User findByIdUser = findByIdMono.block();
        Assert.isNull(findByIdUser, "User must be null");

        final User savedUser = saveUserMono.block();
        Assert.state(savedUser != null, "Saved user must not be null");
        Assert.state(savedUser.getFirstName().equals(testUser.getFirstName()),
                "Saved user first name doesn't match");

        firstNameUserFlux.collectList().block();

        final Optional<User> optionalUserResult = repository.findById(testUser.getId()).blockOptional();
        Assert.isTrue(optionalUserResult.isPresent(), "Cannot find user.");

        final User result = optionalUserResult.get();
        Assert.state(result.getFirstName().equals(testUser.getFirstName()),
                "query result firstName doesn't match!");
        Assert.state(result.getLastName().equals(testUser.getLastName()),
                "query result lastName doesn't match!");
        LOGGER.info("findOne in User collection get result: {}", result.toString());

    }

    @PostConstruct
    public void setup() {
        // For this example, remove all of the existing records.
        this.repository.deleteAll().block();
    }
}

이 예제에는 저장, 삭제 및 찾기 작업을 지원하는 자동 배선된 UserRepository 인터페이스가 포함되어 있습니다.

샘플

GitHub에서 확인하세요 azure-spring-boot-samples .

spring-cloud-azure-starter-data-cosmos 라이브러리를 사용하는 것 외에도 더 복잡한 시나리오에 azure-spring-data-cosmos 라이브러리를 직접 사용할 수 있습니다. 자세한 내용은 Azure Cosmos DB 클라이언트 라이브러리Spring Data를 참조하세요.