연습 - Maven을 사용하여 Java 앱 설정하기

완료됨

이 단원에서는 원하는 IDE로 코드를 편집하여 기본적인 콘솔 앱을 만듭니다. 선택적으로 원하는 터미널을 사용하여 코드도 실행합니다.

Azure Cosmos DB 리소스 만들기

Microsoft Learn에서는 이 랩을 완료할 수 있도록 계정과 리소스를 만들 수 있는 무료 Azure 샌드박스를 제공합니다. 이 구독에서 Azure Cosmos DB 계정을 설정한 다음 데이터베이스와 컨테이너를 만듭니다.

  1. 샌드박스를 활성화한 계정과 동일한 계정을 사용하여 Azure Portal에 로그인합니다.
  2. Azure Portal을 사용하여 원하는 이름으로 Azure Cosmos DB 계정을 만듭니다. 계정의 리소스 그룹을 만들 때가 오면 리소스 그룹 [샌드박스 리소스 그룹]을 찾아서 선택합니다.
  3. Azure Cosmos DB 계정에서 Users라는 데이터베이스를 만듭니다.
  4. 사용자 데이터베이스에서 /userId라고 하는 파티션 키를 사용해 WebCustomers라는 컨테이너를 만듭니다. WebCustomers에 대해 400RU/s를 프로비저닝합니다.

작업 디렉터리 만들기

  1. Java 애플리케이션을 위한 템플릿이 제공됩니다. 이 템플릿 리포지토리를 시스템에 복제합니다.

    git clone https://github.com/MicrosoftDocs/mslearn-cosmos-java-sql.git
    
  2. Windows 파일 탐색기를 열고 복제된 리포지토리로 이동 합니다. java_lab 하위 디렉터리를 입력합니다.

    중요

    이 모듈에서 수행하는 모든 작업은 java_lab 하위 디렉터리에 있습니다.

  3. 템플릿에는 Maven pom.xml 파일이 포함되어 있는데, 이는 이미 프로젝트의 필수 종속성을 가져오고 있습니다. 이 파일을 열고 검토하여 다음 종속성을 찾습니다.

    <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-cosmos</artifactId>
        <version>4.8.0</version>
    </dependency>
    

    이 종속성은 Azure Cosmos DB Java SDK의 최신 버전을 가져옵니다. 이 파일을 닫을 수 있습니다.

  4. 다음으로, Hello World를 빌드하여 실행합니다. IDE 또는 터미널을 사용하여 이 프로젝트를 엽니다. 사용 중인 IDE에 따라 java 하위 디렉터리의 pom.xml 파일을 프로젝트로 여는 옵션이 있을 수 있습니다.

    프로젝트가 열리면 src/main/java/com/azure/cosmos/examples/mslearnbasicapp으로 이동한 다음, 개발할 Java 애플리케이션의 템플릿인 CosmosApp.java를 엽니다. 다음과 같이 표시됩니다.

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    public final class CosmosApp {
    
        /** For application to log INFO and ERROR. */
        private static Logger logger = LoggerFactory.getLogger(CosmosApp.class.getSimpleName());
    
        private CosmosApp() {
            // not called
        }
    
        /**
        * Main.
        * @param args Command line arguments
        */
        public static void main(final String[] args) {
            logger.info("Hello World.");
        }
    }
    

    이 애플리케이션 코드는 간단한 "Hello World"를 구현합니다.

  5. IDE에서 Maven 애플리케이션을 빌드하고 실행하는 도구를 제공하는 경우: IDE로 애플리케이션을 빌드하고 실행한 다음 애플리케이션이 터미널에 Hello World를 로그하는지 확인합니다.

  6. 터미널을 사용하여 Maven 애플리케이션을 빌드하고 실행하는 경우: 다음 명령을 실행하여 Maven 프로젝트를 빌드합니다.

    mvn clean package
    

    다음을 실행합니다.

    mvn exec:java -Dexec.mainClass="com.azure.cosmos.examples.mslearnbasicapp.CosmosApp"  
    

    애플리케이션이 다음 출력을 터미널에 로그하는지 확인합니다.

    INFO: Hello World.
    

Azure Cosmos DB에 앱 연결

  1. CosmosApp 클래스 내에서, Azure Cosmos DB 연결 세부 정보를 위해 다음과 같은 정적 클래스 변수를 만듭니다.

    /** Azure Cosmos DB endpoint URI. */
    private static String endpointUri = "<your-cosmosdb-hostname>";
    
    /** Azure Cosmos DB primary key. */
    private static String primaryKey = "<your-cosmosdb-master-key>";
    
  2. Azure Portal로 돌아가서 창으로 이동한 다음 Azure Cosmos DB 엔드포인트 URI 및 기본 키를 복사하여 선행 변수 정의에 붙여넣습니다.

    예를 들어, URI가 https://cosmosacct.documents.azure.com:443/이라면 새 변수 할당은 private static String endpointUri = "https://cosmosacct.documents.azure.com:443/";입니다. 기본 키가 elzirrKCnXlacvh1CRAnQdYVbVLspmYHQyYrhx0PltHi8wn5lHVHFnd1Xm3ad5cn4TUcH4U0MSeHsVykkFPHpQ==라면 새 변수 할당은 private static String primaryKey = "elzirrKCnXlacvh1CRAnQdYVbVLspmYHQyYrhx0PltHi8wn5lHVHFnd1Xm3ad5cn4TUcH4U0MSeHsVykkFPHpQ==";가 됩니다.

CosmosAsyncClient 인스턴스 만들기

이제 Azure Cosmos DB 서비스의 클라이언트 쪽 표현인 CosmosAsyncClient의 인스턴스를 만들 차례입니다. 이 클라이언트는 서비스에 대한 요청을 구성하고 실행하는 데 사용됩니다.

  1. CosmosApp.java에서 CosmosApp 클래스에 다음과 같은 정적 변수 선언을 추가합니다.

    /** Azure Cosmos DB client instance. */
    private static CosmosAsyncClient client;
    
    /** Azure Cosmos DB database instance. */
    private static CosmosAsyncDatabase database;
    
    /** Azure Cosmos DB container instance. */
    private static CosmosAsyncContainer container;
    

    client, database, container 클래스를 Java 파일에 아직 가져오지 않았을 가능성이 가장 높습니다. 이제 이를 처리하는 것이 좋습니다. 일부 IDE에서는 입력한 코드를 기반으로 종속성을 자동으로 가져오는 기능이 있습니다. 여기에서 이 기능을 유용하게 사용할 수 있습니다. 일반적으로 랩에서 코드에 붙여넣을 코드 블록이 제시되는 경우 이 코드가 작동하려면 import 문을 추가해야 한다고 생각하면 됩니다.

  2. 클래스에 인수가 없는 basicOperations 라는 이름의 private void 메서드를 만듭니다.

  3. basicOperations 메서드에서 다음 코드를 추가하여 CosmosAsyncClient 인스턴스를 만들고, Users 데이터베이스가 존재하는지 여부를 확인하는 코드를 포함합니다.

     client = new CosmosClientBuilder()
         .endpoint(endpointUri)
         .key(primaryKey)
         .consistencyLevel(ConsistencyLevel.EVENTUAL)
         .directMode()
         .contentResponseOnWriteEnabled(true)
         .buildAsyncClient();
    
     database = client.getDatabase("Users");
     container = database.getContainer("WebCustomers");            
    
     logger.info("Database and container validation complete");
    
     client.close();
    
  4. 이 시점에서 basicOperations 메서드에는 Azure Cosmos DB와 상호 작용하는 코드를 포함하고 있습니다. 그러나 main에서 이 메서드를 호출하지 않고 있으므로 애플리케이션은 아직도 “Hello World”를 출력합니다. 확인을 위해 IDE에서 CosmosApp.java를 빌드 및 실행하거나 다음을 사용하여 터미널에서 프로그램을 실행합니다.

    mvn clean package
    mvn exec:java -Dexec.mainClass="com.azure.cosmos.examples.mslearnbasicapp.CosmosApp"  
    

    앱이 여전히 다음 출력을 터미널에 로그하는지 확인합니다.

    INFO: Hello World.
    
  5. 다음 코드를 복사하여 main 메서드에 붙여넣어 현재 logger.info("Hello World."); 줄을 덮어씁니다.

    try {
        CosmosApp p = new CosmosApp();
        p.basicOperations();
    } catch (CosmosException e) {
        logger.error("Failed while executing app.", e);
    } finally {
        logger.info("End of demo, press any key to exit.");
    }
    

    이렇게 하면 애플리케이션에서 Azure Cosmos DB 코드가 트리거됩니다.

  6. IDE에서 CosmosApp.java를 빌드하고 실행하거나 터미널에서 다음을 사용하여 프로그램을 실행합니다.

    mvn clean package
    mvn exec:java -Dexec.mainClass="com.azure.cosmos.examples.mslearnbasicapp.CosmosApp"  
    

    터미널에 다량의 로그 메시지가 표시될 수 있으며, 그중 일부는 SDK 자체에 의해 생성되는 것입니다. 메시지를 잘 읽어보고 앱이 다음 출력을 터미널에 로그하는지 확인합니다.

    INFO: Database and container validation complete
    

이 단원에서는 Azure Cosmos DB Java 애플리케이션을 위한 기초 작업을 수행했습니다. Maven 애플리케이션을 설정하고, 기본적인 “Hello World” 프로젝트를 만들고, 이를 확장하여 프로젝트를 Azure Cosmos DB 엔드포인트에 연결했습니다.

  1. Java 애플리케이션을 위한 템플릿이 제공되었습니다. 이 템플릿 리포지토리를 시스템에 복제합니다.

    git clone https://github.com/MicrosoftDocs/mslearn-cosmos-java-sql.git
    
  2. Windows 탐색기를 열고 복제된 리포지토리를 이동합니다. spring_lab 하위 디렉터리를 입력합니다.

    중요

    이 모듈에서 수행하는 모든 작업은 spring_lab 하위 디렉터리에 있습니다.

  3. 템플릿에는 Maven pom.xml이 포함되어 있는데, 이는 이미 프로젝트의 필수 종속성을 가져오고 있습니다. 이 파일을 열고 검토하여 다음 종속성을 찾습니다.

    <dependency>
      <groupId>com.azure</groupId>
      <artifactId>azure-spring-data-cosmos</artifactId>
      <version>3.24.0</version>
    </dependency>
    

    이 종속성은 Spring Data Azure Cosmos DB의 최신 버전을 가져옵니다. 이 파일을 닫을 수 있습니다.

Azure Cosmos DB에 앱 연결

  1. IDE 또는 터미널을 사용하여 이 프로젝트를 엽니다. 사용 중인 IDE에 따라 spring 하위 디렉터리의 pom.xml 파일을 프로젝트로 여는 옵션이 있을 수 있습니다. 프로젝트가 열리면 파일 탐색 도구를 이용해 src/main/resources/로 이동합니다. 이름이 application.properties.rename인 파일이 표시됩니다. Spring Data는 하드 코딩된 구성 매개 변수에서 구성 파일을 강조하여 Spring Data 프로젝트에 대한 구성 파일을 만들고, application.properties.renameapplication.properties로 복사하고, 새 application.properties 파일을 엽니다. 다음과 같은 결과가 표시됩니다.

    cosmos.uri=${ACCOUNT_HOST}
    cosmos.key=${ACCOUNT_KEY}
    cosmos.secondaryKey=${SECONDARY_ACCOUNT_KEY}
    
    dynamic.collection.name=spel-property-collection
    # Populate query metrics
    cosmos.queryMetricsEnabled=true
    

    값을 복사하여 application.properties에 붙여넣거나 IDE 내 환경 변수를 정의하여 ${ACCOUNT_HOST}${ACCOUNT_KEY}를 채웁니다. 다음 단계에서는 이러한 변수에 포함되어야 하는 값을 찾습니다.

  2. Azure Portal로 돌아가서 창으로 이동한 다음 Azure Cosmos DB 엔드포인트 URI 및 기본 키를 복사합니다. 이전 단계에서 설명한 것과 같이 원하는 방법을 사용하여 Azure Cosmos DB 엔드포인트 URI 및 기본 키를 앞서 언급한 변수에 할당합니다.

    예를 들어 URI가 https://cosmosacct.documents.azure.com:443/이고, 엔드포인트 및 기본 키를 application.properties에 붙여넣은 경우 application.properties의 줄은 다음과 같습니다. cosmos.uri=https://cosmosacct.documents.azure.com:443/. 기본 키가 elzirrKCnXlacvh1CRAnQdYVbVLspmYHQyYrhx0PltHi8wn5lHVHFnd1Xm3ad5cn4TUcH4U0MSeHsVykkFPHpQ==인 경우 동일한 프로세스에 따른 새 변수 할당은 다음과 같습니다. cosmos.key=elzirrKCnXlacvh1CRAnQdYVbVLspmYHQyYrhx0PltHi8wn5lHVHFnd1Xm3ad5cn4TUcH4U0MSeHsVykkFPHpQ==.

Azure Cosmos DB 클라이언트 구성

Spring Data Azure Cosmos DB는 시작 시 자동으로 Azure Cosmos DB 클라이언트를 인스턴스화합니다. Azure Cosmos DB 클라이언트는 Azure Cosmos DB 서비스의 클라이언트 측 표현으로 서비스에 대한 요청 실행에 사용됩니다. application.properties에서 가져온 속성과 함께 작성기 메서드 집합을 사용하여 코드에서 인스턴스화되기 전에 Azure Cosmos DB 클라이언트를 구성할 수 있습니다.

  1. CosmosProperties.java를 엽니다. 이 파일은 완전한 형태로 제공되므로 내용만 확인합니다.

    @ConfigurationProperties(prefix = "cosmos")
    public class CosmosProperties {
    
        private String uri;
    
        private String key;
    
        private String secondaryKey;
    
        private boolean queryMetricsEnabled;
    
        public String getUri() {
            return uri;
        }
    
        public void setUri(String uri) {
            this.uri = uri;
        }
    
        public String getKey() {
            return key;
        }
    
        public void setKey(String key) {
            this.key = key;
        }
    
        public String getSecondaryKey() {
            return secondaryKey;
        }
    
        public void setSecondaryKey(String secondaryKey) {
            this.secondaryKey = secondaryKey;
        }
    
        public boolean isQueryMetricsEnabled() {
            return queryMetricsEnabled;
        }
    
        public void setQueryMetricsEnabled(boolean enableQueryMetrics) {
            this.queryMetricsEnabled = enableQueryMetrics;
        }
    }
    

    uri, key, secondaryKey, queryMetricsEnabled 클래스 멤버를 관찰합니다. application.properties에서 CosmosProperties 멤버 이름이 application.properties 속성 이름에 밀접하게 대응하는지 관찰합니다. CosmosProperties 클래스는 애플리케이션의 나머지에 대한 getter 및 setter를 제공하여 application.properties에서의 구성 설정에 액세스합니다. 여기에서 application.properties로부터 구성을 끌어올 코드가 없습니다. Spring Data는 이 파일의 구조를 이해하고 구성 파일을 구문 분석한 이후 자동으로 멤버 변수를 설정합니다.

    Azure Cosmos DB 클라이언트를 구성할 때 이 설정을 계속 활용합니다.

  2. CosmosSampleConfiguration.java에서 CosmosSampleConfiguration 클래스를 확인하고 빈 cosmosClientBuilder 메서드를 찾습니다.

    @Bean
    public CosmosClientBuilder cosmosClientBuilder() {
        return null;
    }
    

    시작 시, Spring Data에서 자동으로 이 메서드를 호출하고, 이 메서드에서 반환하는 CosmosClientBuilder를 얻고, build() 메서드를 호출합니다. 이 시점에서 (내부적으로) CosmosAsyncClient 인스턴스가 CosmosClientBuilder 내에 있는 구성 설정을 기반으로 생성됩니다. 이 메서드를 사용하여 작성기 메서드를 사용하는 CosmosClientBuilder를 구성할 수 있습니다.

  3. @Autowired)를 사용하는 필드 삽입 대신 생성자 삽입을 사용해 properties 변수를 인스턴스화하고 구성 파일에서 구문 분석된 값으로 멤버 변수를 채웁니다. 이렇게 하면 이 클래스의 인스턴스가 만들어질 때 필요한 모든 종속성이 표시되고 나중에 테스트 코드를 쉽게 작성할 수 있습니다.

    //use constructor injection for spring dependencies 
    public CosmosSampleConfiguration(CosmosProperties properties){
        this.properties = properties;
    }
    

    properties를 사용하여 Azure Cosmos DB 계정에 대한 uri 및 키를 가져오고 아래와 같이 cosmosClientBuilder를 구현합니다.

    @Bean
    public CosmosClientBuilder cosmosClientBuilder() {
        DirectConnectionConfig directConnectionConfig = DirectConnectionConfig.getDefaultConfig();
        return new CosmosClientBuilder()
            .endpoint(properties.getUri())
            .key(properties.getKey())
            .directMode(directConnectionConfig);
    }
    

    이 구현은

    1. properties에서 uri 및 키를 끌어옵니다.
    2. 이를 endpointkey 작성기 메서드에 연결합니다.
    3. 추가로 Azure Cosmos DB 서비스에 대한 네트워크 연결을 구성합니다. (직접 모드에서 클라이언트 애플리케이션이 백엔드 Azure Cosmos DB 파티션과 직접 통신합니다.)
  4. CosmosSampleConfiguration.java로 돌아가 getDatabaseName 메서드를 찾습니다.

    @Override
    protected String getDatabaseName() { return ""; }
    

    기본 반환 값을 데이터베이스의 이름인 "Users"로 변경합니다. 이를 통해 Spring Data에서 시작 시 Azure Cosmos DB에 자동으로 연결되고, Users 데이터베이스로 연결됩니다.

  5. WebCustomer.java로 이동합니다. WebCustomer 클래스가 @Container 주석 뒤에 위치합니다.

    @Container(containerName = "", ru = "")
    

    @Container는 2개의 인수를 사용합니다.

    • containerName: Azure Cosmos DB 컨테이너의 이름(WebCustomers)
    • ru: 컨테이너에서 프로비저닝된 처리량입니다. 400RU/s가 Microsoft Learn 연습의 양호한 기본값입니다.

    다음과 같이 사용 사례에 따라 @Container를 사용자 지정합니다.

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @Container(containerName = "WebCustomers", ru = "400")
    public class WebCustomer {
    
  6. 이 시점에서 Spring Data 프로젝트는 Azure Cosmos DB와 상호 작용하도록 설정됩니다. 다음으로, Hello World를 빌드하여 실행합니다. src/main/java/com/azure/cosmos/examples/springexamples으로 이동한 다음, 개발할 Spring Data 애플리케이션의 템플릿인 CosmosSample.java를 엽니다. 다음과 같이 표시됩니다.

    // Copyright (c) Microsoft Corporation. All rights reserved.
    // Licensed under the MIT License.
    package com.azure.cosmos.examples.springexamples;
    
    import com.azure.cosmos.CosmosException;
    import com.azure.cosmos.examples.springexamples.common.CouponsUsed;
    import com.azure.cosmos.examples.springexamples.common.OrderHistory;
    import com.azure.cosmos.examples.springexamples.common.ShippingPreference;
    import com.azure.cosmos.models.CosmosItemResponse;
    import com.azure.cosmos.models.PartitionKey;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import reactor.core.publisher.Flux;
    import reactor.core.publisher.Mono;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    @SpringBootApplication
    public class CosmosSample implements CommandLineRunner {
    
        private final Logger logger = LoggerFactory.getLogger(CosmosSample.class);
    
        private ReactiveWebCustomerRepository reactiveWebCustomerRepository;
    
        //constructor dependency injection
        public CosmosSample(ReactiveWebCustomerRepository reactiveWebCustomerRepository){
            this.reactiveWebCustomerRepository = reactiveWebCustomerRepository;
        }
    
        public void run(String... var1) {
            logger.info("Hello world.");
        }
    }
    

    이 애플리케이션 코드는 간단한 "Hello World"를 구현합니다.

  7. IDE에서 Maven 애플리케이션을 빌드하고 실행하는 도구를 제공하는 경우: IDE로 애플리케이션을 빌드하고 실행한 다음 애플리케이션이 터미널에 Hello World를 로그하는지 확인합니다.

  8. 터미널을 사용하여 Maven 애플리케이션을 빌드하고 실행하는 경우: 다음 명령을 실행하여 Maven 프로젝트를 빌드합니다.

    mvn clean package
    

    다음을 실행합니다.

    mvn spring-boot:run
    

    다른 모든 출력 가운데 애플리케이션이 다음 출력을 터미널에 로그하는지 확인합니다.

    INFO: Hello World.
    

이 단원에서는 Azure Cosmos DB Java 애플리케이션을 위한 기초 작업을 수행했습니다. Maven 애플리케이션을 사용자 지정하고, 기본적인 "Hello World" 프로젝트를 확장하여 Azure Cosmos DB 엔드포인트에 연결했습니다.