NestJS를 사용한 모험: API 구축. 1 부

내가 사람들을 가르칠 만큼 충분히 알고 있는지 확신이 서지 않기 때문에 이것은 정확히 튜토리얼이 될 수는 없지만 앱을 구축하는 프로세스를 문서화하고 싶었고 이에 대한 기사를 작성하는 것이 도움이 될 것이라고 생각했습니다. 아마도 그것을 읽는 사람들을 도울 것입니다. 나는 모든 것을 아주 자세하게 설명하지는 않을 것입니다. 당신이 뭔가를 이해하지 못하거나 내가 중요한 것을 놓쳤다고 생각하는 경우 알려주세요. 그러나 대부분의 경우 모든 것이 매우 명확하게 설명되어 있기 때문에 Nest documentation을 읽는 것이 좋습니다. . Nest를 학습할 때 사용한 또 다른 유용한 리소스는 Marcin Wanago의 블로그 게시물 시리즈였습니다. API with nestjs

최종 앱은 아마도 시간이 지남에 따라 발전하겠지만 포함할 몇 가지 사항은 다음과 같습니다.
  • 인증 및 권한 부여
  • 변형 및 재고 위치가 다른 제품(창고, 매장)
  • MercadoLibre(아르헨티나의 대규모 온라인 마켓플레이스)와 통합
  • MercadoPago를 통한 결제.

  • 이 앱은 중고 서점을 위한 하나의 관리 시스템이자 온라인 상점이 될 것입니다. 제가 한 곳에서 일하고 이와 같은 것이 있으면 일상 업무가 훨씬 쉬워질 것이기 때문입니다. 내가 사용할 주요 기술은 다음과 같습니다.
  • NestJs
  • PostgreSQL
  • 레디스
  • 타자기
  • 그래프QL

  • 그 과정에서 Admin Frontend도 구축할 것입니다.

    이 문서에서는 프로젝트를 설정하여 시작합니다.

    먼저 새로운 Nest 앱을 생성해 보겠습니다.
    nest new {app_name}
    Nest CLI가 설치되어 있지 않은 경우 다음을 사용하여 설치할 수 있습니다.

    npm i -g @nestjs/cli
    상용구 코드를 작성하는 데 소요되는 시간을 줄이기 위해 생성기가 많기 때문에 중첩 응용 프로그램을 시작하는 가장 쉬운 방법입니다. Nest CLI는 어떤 패키지 관리자를 사용할지 묻습니다. 저는 yarn를 선택하겠습니다.

    이제 사용할 첫 번째 패키지를 추가해 보겠습니다.

    yarn add @nestjs/config @nestjs/graphql @nestjs/apollo @nestjs/typeorm apollo-server-express graphql typeorm pg
    


    GraphQl 및 TypeORM을 설정하려면 app.module.ts 파일에 다음을 추가해야 합니다.

    @Module({
      imports: [
        ConfigModule.forRoot({
          isGlobal: true,
        }),
        TypeOrmModule.forRootAsync({
          inject: [ConfigService],
          useFactory: (configService: ConfigService) => ({
            url: configService.get('POSTGRES_URL'),
            // here we will need to add every entity we create
            entities: [],
            type: 'postgres',
            synchronize: true,
          }),
        }),
        GraphQLModule.forRootAsync<ApolloDriverConfig>({
          driver: ApolloDriver,
          inject: [ConfigService],
          useFactory: (configService: ConfigService) => ({
            playground: true,
            debug: true,
            autoSchemaFile: path.join(process.cwd(), 'src/graphql/schema.gql'),
          }),
        }),
      ],
      controllers: [AppController],
      providers: [AppService],
    })
    export class AppModule {}
    


    우리가 가져오는 첫 번째 모듈은 .env 파일에서 정보를 가져올 수 있는 ConfigModule이며, 다른 모듈에서 가져올 필요가 없도록 전역으로 만듭니다. 그런 다음 postgresql을 사용할 수 있도록 TypeOrmModule을 설정합니다. syncronize: true는 TypeOrm이 우리가 정의한 엔티티로 DB 스키마를 최신 상태로 유지하려고 시도함을 의미합니다. 이는 마이그레이션을 사용해야 하는 프로덕션에서는 권장되지 않습니다.

    GraphQL의 경우 Code First 접근 방식을 사용할 것이므로 모듈 구성에 autoSchemaFile 옵션이 있습니다. 이렇게 하면 Nest가 GraphQL 데코레이터로 장식된 클래스 및 해당 속성에 대한 코드를 스캔하고 자동으로 스키마를 생성합니다.

    앱을 시작하기 전에 Postgres Db를 설정해야 합니다. 이를 위해 Docker Compose를 사용하고 프로젝트 루트 디렉토리에 docker-compose.yml 파일을 생성하겠습니다. 그리고 내부에 다음을 추가하십시오.

    version: '3'
    
    services:
      postgres:
        image: postgres:14
        container_name: postgres_db
        restart: unless-stopped
        volumes:
          - ./postgres:/var/lib/postgresql/data
        ports:
          - "5432:5432"
        environment:
          POSTGRES_DB: postgres
          POSTGRES_PASSWORD: postgres
    


    docker Compose 사용법을 알고 있다면 개발용 데이터베이스를 설정하는 가장 쉬운 방법 중 하나입니다. 그렇지 않은 경우 항상 컴퓨터에 Postgres를 설치할 수 있습니다.

    다음을 실행하는 첫 번째 리졸버를 만들어 보겠습니다.
    nest g resolver app --flat
    내부에 다음을 추가하십시오.

    import { Resolver, Query } from '@nestjs/graphql';
    
    @Resolver()
    export class AppResolver {
      @Query(() => String)
      hello() {
        return 'hello world';
      }
    }
    


    이 모든 작업이 완료되면 yarn start:dev를 실행하고 localhost:3000/graphql로 이동하여 graphql 플레이그라운드에서 hello 쿼리를 실행할 수 있습니다.



    이 저장소에서 코드를 찾아볼 수 있습니다. nest-adventures

    지금은 여기까지입니다. 다음 게시물에서는 제품 및 관련 기능을 추가할 것입니다.

    읽어 주셔서 감사합니다. 이것은 내가 작성한 첫 번째 게시물이므로 개선 방법에 대한 의견이나 마음에 들면 매우 감사하겠습니다.

    좋은 웹페이지 즐겨찾기