NestJS의 NoSQL Azure 테이블 스토리지 소개🚀

Originally published on the Trilon Blog on September 17, 2019.


본고에서 우리는 새로운 @nestjs/azure-database 라이브러리를 사용하여 몇 분 안에 Azure 테이블 저장소를 우리의 NestJS 응용 프로그램에 추가하는 방법을 연구할 것이다!
익숙하지 않은 경우NestJS, TypeScript 노드입니다.js 프레임워크는 기업급의 효율적이고 확장 가능한 노드를 구축하는 데 도움을 줍니다.js 응용 프로그램.

Azure 테이블 스토리지란 무엇입니까?


Azure Table Storage는 대량의 반구조화된 데이터 세트를 사용하는 NoSQL 키 값 저장소입니다.
표 저장소를 사용하면 유연한 데이터 패턴이 필요한 대규모 확장 가능한 응용 프로그램을 만들 수 있습니다.또한 OData 기반 질의를 수행하고 JSON 서열화 데이터를 사용할 수도 있습니다.
Azure 테이블 스토리지를 사용하여 수 PB의 반구조화된 데이터를 저장하고 비용을 절감합니다.
많은 로컬 또는 클라우드 기반 데이터 저장소와 다릅니다.
  • 테이블 저장소는 데이터 집합을 수동으로 분할할 필요가 없는 상황에서 확장할 수 있습니다.
  • 가용성도 문제없습니다!
  • 지리적 군더더기 저장소를 사용하여 저장된 데이터는 한 구역에서 세 번, 수백 마일 떨어진 다른 구역에서 세 번 복제한다.
  • NestJS 응용 프로그램에 테이블 저장소를 사용하는 방법에 대해 자세히 알아보겠습니다!

    설정 가져오기


    NOTE: In this demonstration, we'll be showcasing a new NestJS application generated by the CLI, but if you prefer to use an existing NestJS application - feel free - and just skip ahead!


    새 NestJS 애플리케이션 생성


    프레젠테이션을 위해 최신 NestJS CLI가 설치되어 있는지 확인하고 새 응용 프로그램을 만듭니다.
    $ npm i -g @nestjs/cli
    $ nest new PROJECT_NAME
    
    이제 새로 만든 디렉토리에 들어가서 IDE를 엽니다.이제 NestJS 어플리케이션이 간단하게 생성되었습니다.

    Azure 스토리지 계정 설정


    Table Storage를 사용하려면 Azure 스토리지 계정을 만들어야 합니다.이 작업을 수행할 수 있습니다step by step guide.
    스토리지 계정을 생성한 후에는 SDK에 사용할 접속 문자열을 복사해야 합니다.Azure Portal 에서 Dashboard>Storage>your Storage account로 이동합니다.

    설정 탭의 액세스 키에서 얻은 스토리지 계정 이름과 접속 문자열을 기록합니다.

    TIP: The connection string should start with DefaultEndpointsProtocol=


    NestJS Azure 스토리지 설치


    이제 NPM에서 SDKcd를 설치해야 합니다.
    $ npm i --save @nestjs/azure-database dotenv
    

    We also install the dotenv package that allows us to deal with environment variables.


    그런 다음 라는 파일을 만듭니다.env에는 다음과 같은 내용이 있습니다.
    AZURE_STORAGE_CONNECTION_STRING="<the connection string we copied from previous step>"
    
    마찬가지로 중요한 것은: @nestjs/azure-database 파일을 .env 에 추가해야 한다는 것입니다!.gitignore 파일을 Git에서 버전 제어할 수 없습니다..env 파일을 만들고 준비가 완료되면 .env 파일에 대한 다음 호출이 포함됩니다.
    if (process.env.NODE_ENV !== 'production') require('dotenv').config();
    

    TIP: This line must be added before any other imports in the src/main.ts file!


    우리의 설정은 이미 준비가 되었다.응용 프로그램의 논리를 실현합시다.

    비즈니스 논리 준비


    NestJS의 Azure 테이블 저장소는 객체 관계 매핑(ORM) 설계 모델을 지원합니다. 이것은 기본적으로 저희 코드에서 데이터베이스에 접근하는'구조적'방식입니다. 실제 SQL 코드를 작성하는 것이 아니라 API를 사용할 수 있습니다.
    이러한 디자인 모델을 실현하기 위해서는 각 기능에 대해 다음과 같은 구성 요소를 만들어야 한다.
  • src/main.ts(또는 데이터 전송 객체)
  • 이것은 우리의 데이터를 나타내는 대상이다.DTO는 주로 HTTP 서비스와 브라우저 간의 데이터 등 애플리케이션 서비스 간에 데이터를 전송하는 데 사용됩니다.
  • DTO
  • 이것은 기본적으로 표 모드에 비치는 종류이다.
  • Entity
  • 이것은 데이터베이스와 통신하는 구성 요소이다.
  • 우선 NestJS 기능 모듈을 만듭니다. 그 중에서 우리의 기능 업무 논리를 위탁 관리할 것입니다.NestJS CLI를 사용하여 Repository 기능을 생성합니다.
    $ nest generate module cat
    

    NOTE: We will come back to our generated module at the end of the process.


    DTO 회사

    Cat 기능의 첫 번째 구성 요소는 DTO입니다.Cat라는 파일에서 다음과 같은 클래스를 만들었습니다.
    export class CatDTO {
      name: string;
      age: number;
    }
    

    실체


    다음으로 우리는 하나cat.dto.ts가 필요하다.이를 위해 Entity 라는 파일을 만들고 cat.entity.ts 에서 제공하는 장식기를 사용하여 모델을 설명합니다.
    실체
    대표
    요구했어@nestjs/azure-database솔리드 @EntityPartitionKey(value: string)맞다PartitionKey솔리드 @EntityRowKey(value: string)맞다RowKey기호 32비트 정수 값 있음@EntityInt32(value?: string)64비트 정수 기호 있음@EntityInt64(value?: string)바이너리 (blob) 데이터@EntityBinary(value?: string) @EntityBoolean(value?: string) 또는 truefalse문자 데이터@EntityString(value?: string)15위 정밀도의 부동 소수점@EntityDouble(value?: string)하루 중 시간

    Note: The API might slightly change in the stable release.


    예를 들어, 다음 솔리드의 형태는 다음과 같습니다.
    import {
      EntityPartitionKey,
      EntityRowKey,
      EntityString,
      EntityIn32
    } from '@nestjs/azure-database';
    
    @EntityPartitionKey('CatID')
    @EntityRowKey('CatName')
    export class Cat {
      @EntityString() name: string;
      @EntityIn32() age: number;
    }
    
    @EntityDateTime(value?: string) 엔티티는 Azure 테이블 스토리지의 다음 아키텍처로 자동으로 변환됩니다.
    {
      "PartitionKey": { "_": "CatID", "$": "Edm.String" },
      "RowKey": { "_": "CatName", "$": "Edm.String" },
      "name": { "_": undefined, "$": "Edm.String" },
      "age": { "_": undefined, "$": "Edm.Int32" }
    }
    

    저장소


    DTO와 실체 다음에 Cat 실체와 관련된 모든 CRUD 작업을 추상화하는 Cat 서비스를 만들어야 합니다.이 서비스는 Azure 테이블 스토리지Cat를 사용합니다.
    NestJS CLI를 사용하여 서비스를 생성합니다.
    $ nest generate service cat
    
    생성된 Repository 에서 가져오기cat.service.ts 및 이전 단계에서 생성된 Repository 엔티티 정의를 제공합니다.
    import { Injectable } from '@nestjs/common';
    import { Repository, InjectRepository } from '@nestjs/azure-database';
    import { Cat } from './cat.entity';
    
    @Injectable()
    export class CatService {
      constructor(
        @InjectRepository(Cat)
        private readonly catRepository: Repository<Cat>,
      ) {}
    
      // ... other code ...
    
    Azure 테이블 스토리지Cat 인터페이스는 다양한 CRUD(Repository, Create, ReadUpdate 작업을 관리하는 데 사용되는 일련의 공공 API와 유형을 제공합니다.Delete SDK를 사용하여 각기 다른 작업을 수행하는 방법을 살펴보겠습니다.

    다음 방법을 사용합니다.

  • @nestjs/azure-database 새 엔티티를 작성합니다.
  • create(entity: T): Promise<T>주어진 질의와 일치하는 모든 엔티티를 찾습니다(질의가 제공되지 않으면 모든 엔티티를 반환합니다).
  • findAll(tableQuery?: azure.TableQuery, currentToken?: azure.TableService.TableContinuationToken): Promise<AzureTableStorageResultList<T>> 행 키를 사용하여 엔티티를 찾습니다.
  • find(rowKey: string, entity: Partial<T>): Promise<T> 엔티티를 업데이트합니다.이것은 부분 업데이트를 진행할 것이다.
  • update(rowKey: string, entity: Partial<T>): Promise<T> 솔리드의 행 키를 사용하여 솔리드를 삭제합니다.
  • 다음은 이러한 구현의 예입니다.


    import { Injectable } from '@nestjs/common';
    import { Repository, InjectRepository } from '@nestjs/azure-database';
    import { Cat } from './cat.entity';
    
    @Injectable()
    export class CatService {
      constructor(
        @InjectRepository(Cat)
        private readonly catRepository: Repository<Cat>,
      ) {}
    
      // find one cat entitu by its rowKey
      async find(rowKey: string, cat: Cat): Promise<Cat> {
        return this.catRepository.find(rowKey, cat);
      }
    
      // find all cat entities
      async findAll(): Promise<AzureTableStorageResultList<Cat>> {
        return this.catRepository.findAll();
      }
    
      // create a new cat entity
      async create(cat: Cat): Promise<Cat> {
        return this.catRepository.create(cat);
      }
    
      // update the a cat entity by its rowKey
      async update(rowKey: string, cat: Partial<Cat>): Promise<Cat> {
        return this.catRepository.update(rowKey, cat);
      }
    
      // delete a cat entity by its rowKey
      async delete(rowKey: string, cat: Cat): Promise<AzureTableStorageResponse> {
        return this.catRepository.delete(rowKey, cat);
      }
    }
    

    컨트롤러


    마지막 단계는 HTTP 요청을 처리하는 NestJS 컨트롤러를 구현하는 것입니다.NestJS CLI를 사용하여 이러한 컨트롤러를 만듭니다.
    $ nest generate controller cat
    
    컨트롤러의 실현은 매우 간단합니다. 아마도 응용 프로그램의 업무 수요에 달려 있을 것입니다.다음은 구현 예제입니다.
    import {
      Body,
      Controller,
      Delete,
      Get,
      Param,
      Post,
      Put,
      UnprocessableEntityException,
      NotFoundException,
      Patch
    } from '@nestjs/common';
    import { CatDto } from './cat.dto';
    import { Cat } from './cat.entity';
    import { CatService } from './cat.service';
    
    @Controller('cats')
    export class CatController {
      constructor(private readonly catService: CatService) {}
    
      @Get()
      async getAllCats() {
        return await this.catService.findAll();
      }
    
      @Get(':rowKey')
      async getCat(@Param('rowKey') rowKey) {
        try {
          return await this.catService.find(rowKey, new Cat());
        } catch (error) {
          // Entity not found
          throw new NotFoundException(error);
        }
      }
    
      @Post()
      async createCat(
        @Body()
        catData: CatDto,
      ) {
        try {
          const cat = new Cat();
          // Disclaimer: Assign only the properties you are expecting!
          Object.assign(cat, catData);
    
          return await this.catService.create(cat);
        } catch (error) {
          throw new UnprocessableEntityException(error);
        }
      }
    
      @Put(':rowKey')
      async saveCat(@Param('rowKey') rowKey, @Body() catData: CatDto) {
        try {
          const cat = new Cat();
          // Disclaimer: Assign only the properties you are expecting!
          Object.assign(cat, catData);
    
          return await this.catService.update(rowKey, cat);
        } catch (error) {
          throw new UnprocessableEntityException(error);
        }
      }
    
      @Patch(':rowKey')
      async updateCatDetails(@Param('rowKey') rowKey, @Body() catData: Partial<CatDto>) {
        try {
          const cat = new Cat();
          // Disclaimer: Assign only the properties you are expecting!
          Object.assign(cat, catData);
    
          return await this.catService.update(rowKey, cat);
        } catch (error) {
          throw new UnprocessableEntityException(error);
        }
      }
    
      @Delete(':rowKey')
      async deleteDelete(@Param('rowKey') rowKey) {
        try {
          const response = await this.catService.delete(rowKey, new Cat());
    
          if (response.statusCode === 204) {
            return null;
          } else {
            throw new UnprocessableEntityException(response);
          }
        } catch (error) {
          throw new UnprocessableEntityException(error);
        }
      }
    }
    

    모든 것을 한데 모으다


    우리는 이미 delete(rowKey: string, entity: T): Promise<AzureTableStorageResponse> 기능의 실현을 완성했다.마지막 단계에서 이전에 만든 Nest feature moduleCat 내부 가져오기AzureTableStorageModule가 필요합니다.
    import { Module } from '@nestjs/common';
    import { AzureTableStorageModule } from '@nestjs/azure-database';
    import { CatController } from './cat.controller';
    import { CatService } from './cat.service';
    import { Cat } from './cat.entity';
    
    @Module({
      imports: [AzureTableStorageModule.forFeature(Cat)],
      providers: [CatService],
      controllers: [CatController],
    })
    export class CatModule {}
    
    cat.module.ts 모듈은 다음과 같은 몇 가지 옵션 매개변수를 수용합니다.
    AzureTableStorageModule.forFeature(Cat, {
      table: 'AnotherTableName',
      createTableIfNotExists: true,
    })
    
  • AzureTableStorageModule: 테이블의 이름입니다.제공되지 않으면 Cat 엔티티 이름이 테이블 이름으로 사용됩니다
  • .
  • table: string: 테이블이 없으면 자동으로 생성됩니까?
  • 만약createTableIfNotExists: boolean 응용 프로그램이 시작되는 동안 테이블을 만듭니다.
  • 만약true 테이블을 만들지 않습니다.조회하기 전에, 당신은 반드시 스스로 표를 만들어야 합니다!
  • 어쨌든


    우리는 방금 우리의 응용 프로그램에 새로운 false 기능을 실현했다. 이것은 Cat 공식 소프트웨어 패키지를 사용하여 Azure 테이블 저장소에 대한 지원을 추가한다.NestJS의 모듈화 시스템이 있으면 우리는 그것을 설치하고 우리의 응용 프로그램으로 그것을 설정할 수 있다. 마치 로컬 Nest 기능과 같다!
    서버가 없는 Azureread more here NestJS 응용 프로그램에 대한 자세한 내용을 알고 싶으시면

    회사 명 / azure 데이터베이스


    Nest framework(node.js)의 Azure 데이터베이스(테이블 저장소 등) 모듈☁️



    효율적이고 확장 가능한 서버 측 응용 프로그램을 구축하는 데 사용되는 점진적 Node.js 프레임워크.










    묘사


    Table Storage 프레임워크(node.js)의 Azure 데이터베이스(Cosmos DB, Nest 및 그 이상) 모듈

    지도의


    시작 방법 이해 Azure table storage for NestJS

    설치 전


    테이블 스토리지용
  • 스토리지 계정 및 리소스 생성read more
  • 의 경우 Table Storage 에서 Dashboard>Storage>your Storage 계정으로 이동합니다.
  • 설정 탭의 스토리지 계정 이름과 연결 문자열을 기록합니다.
  • Cosmos DB의 경우
  • Cosmos DB 계정 및 리소스 생성Azure Portal
  • 의 경우 read more 에서 Dashboard > Azure Cosmos DB> Cosmos DB 계정으로 이동합니다.
  • 설정 탭 아래의 키에서 받은 URI 및 주 키를 기록합니다.
  • 설치


    $npm i-@nestjs/azure 데이터베이스 저장

    활용단어참조


    Azure 테이블 스토리지 지원

  • 기존 생성 또는 업데이트...
  • Cosmos DB

    좋은 웹페이지 즐겨찾기