다른 Node.js 프레임워크와 마찬가지로 Nest.js는 탄력적이고 다양한 백엔드 서비스를 구축하기 위한 광범위한 도구 세트를 제공합니다. 그러나 Nest.js에서 데이터를 생성, 검색, 업데이트 및 삭제하는 것은 API 개발의 기본 절차이므로 효과적인 구현 전략을 확실히 파악하는 것이 중요합니다.

TypeORM을 활용한 Nest.js CRUD RESTful API를 PostgreSQL 데이터베이스와 함께 생성하는 과정을 학습하여 구축해야 합니다.

Nest.js 시작하기

시작하려면 Nest.js 명령줄 인터페이스 유틸리티를 설치하세요.

 npm i -g @nestjs/cli 

새로운 사업을 시작하는 과정에는 다음 단계에 따라 명령을 실행하여 새로운 벤처를 설립하는 과정이 포함됩니다: 1. 컴퓨터에서 터미널 또는 명령 프롬프트를 엽니다. 2. “프로젝트명”이라는 명령을 입력하고 Enter 키를 누릅니다. 그러면 프로젝트의 지정된 이름으로 새 디렉터리가 생성됩니다. 3. 터미널 또는 명령 프롬프트에 “cd projectname”을 입력하고 Enter 키를 눌러 새로 생성된 디렉토리로 이동합니다. 4. 프로젝트 디렉토리에 들어가면 필요에 따라 cd 명령을 사용하여 디렉토리를 탐색합니다. 5. 이제 이 디렉토리 내에서 프로젝트 작업을 시작할 수 있습니다.

 nest new crud-app 

명령줄 인터페이스에서 가장 적합하다고 생각되는 패키지 관리자를 선택하세요. 이 데모에서는 Node 패키지 매니저인 npm을 사용하겠습니다.

CLI(명령줄 인터페이스)는 애플리케이션을 작동하는 데 필요한 초기 종속성뿐만 아니라 모든 필수 구성 파일을 포함하여 작동하는 Nest.js 프로젝트에 필요한 인프라를 제공합니다.

최종적으로 프로젝트 디렉토리로 이동하여 개발 서버를 시작합니다.

 cd crud-app
npm run start

이 프로젝트의 소스 코드는 GitHub 플랫폼에서 호스팅됩니다.

PostgreSQL 데이터베이스 만들기

또는 클라우드 기반 인스턴스를 사용하는 대신 로컬 PostgreSQL 데이터베이스를 구축할 수도 있습니다. PostgreSQL의 설치 프로세스는 Windows, macOS, Linux를 비롯한 여러 운영 체제에서 액세스할 수 있습니다.

클라우드 기반 PostgreSQL 데이터베이스를 구축하려면

ElephantSQL 으로 이동하여 가입한 후 계정 개요 페이지에 로그인합니다.

⭐ 페이지 왼쪽 상단에 있는 새 인스턴스 만들기 버튼을 클릭하여 애플리케이션의 새 인스턴스를 만듭니다.

데이터베이스 인스턴스를 생성한 후 설정 페이지로 이동하여 미리 제공된 지정된 데이터베이스 URL을 검색합니다.

데이터베이스 연결 구성

.env 파일은 프로젝트의 루트 디렉토리에 위치해야 하며, 데이터베이스 연결 URL은 다음 형식과 유사한 방식으로 입력해야 합니다:

 DATABASE_URL="<your connection url here>" 

 npm install pg typeorm @nestjs/typeorm @nestjs/config 

명령줄 인터페이스 도구를 사용하여 데이터베이스 모듈 생성을 계속 진행하십시오.

 nest g module database 

 import { Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from '../users/models/user.entity';

@Module({
  imports: [
    TypeOrmModule.forRootAsync({
      imports: [ConfigModule],
      inject: [ConfigService],

      useFactory: async (configService: ConfigService) => ({
        type: 'postgres',
        url: configService.get('DATABASE_URL'),
        entities: [User],
        synchronize: true
      }),
    }),
  ],
})

export class DatabaseModule {}

앞서 언급한 데이터베이스 모듈은 TypeORM 모듈을 활용하고 데이터베이스 URL을 포함하여 필요한 연결 매개변수를 지정하여 연결을 쉽게 설정할 수 있습니다.

이 글도 확인해 보세요:  Vite로 React 앱을 설정하는 방법

구성 세부 정보 내의 사용자 엔티티 정의는 PostgreSQL 데이터베이스 테이블에 저장할 데이터의 구조 및 속성 사양을 간략하게 설명합니다.

이 시점에서는 사용자 엔티티가 아직 설정되지 않았으므로 코드에 오류가 발생할 가능성이 높습니다. 그러나 해당 엔티티를 생성하는 과정은 다음 구절에서 설명할 것이므로 걱정하지 마세요.

app.module.ts 파일 업데이트

마지막으로, 데이터베이스 모듈에 필요한 구성을 통합하도록 기본 애플리케이션 모듈을 수정합니다.

 import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { DatabaseModule } from './database/database.module';

@Module({
  imports: [
    ConfigModule.forRoot({
      envFilePath: '.env',
    }),
    DatabaseModule,
  ],

  controllers: [AppController],
  providers: [AppService],
})

export class AppModule {}

사용자 모듈 정의

사용자 모듈은 통합 요소로 기능하며, API의 생성, 읽기, 업데이트 및 삭제(CRUD) 작업의 구현을 용이하게 하는 데 필요한 로직을 포괄하고 감독하는 임무를 맡습니다.

 nest g module users 

명령줄 인터페이스(CLI) 도구를 사용하면 사용자 모듈 생성뿐만 아니라 모든 수정 사항을 고려하여 app.module.ts 파일을 자동으로 업데이트할 수 있습니다. 이렇게 하면 최근에 추가된 ‘사용자’라는 이름의 모듈이 애플리케이션의 전체 모듈 구성에 원활하게 통합됩니다.

사용자 엔티티 생성

TypeORM은 JavaScript 객체를 데이터베이스 내의 관계형 테이블 구조로 변환하여 TypeScript를 사용하여 개발된 애플리케이션에서 데이터베이스를 쉽게 활용할 수 있도록 하는 도구입니다.

TypeORM 라이브러리를 사용하여 사용자 표현을 인스턴스화하면 PostgreSQL 스토리지 내에 유지되는 사용자 정보의 스키마 및 속성을 명확하게 표현할 수 있습니다.

‘models/user.entity.ts’ 파일에 새 엔티티를 생성하는 프로세스에는 기술적 전문 지식이 필요한 여러 단계가 포함됩니다. 먼저 명령줄 인터페이스(CLI) 또는 기타 관련 도구를 사용하여 `users` 디렉토리로 이동합니다. 그런 다음 선호하는 텍스트 편집기를 사용하여 이 디렉터리 내에 있는 `models/user.entity.ts` 파일을 엽니다.파일을 열었으면 필요한 코드를 파일에 삽입합니다. 이 코드에는 엔티티에서 사용하는 모든 필수 모듈 또는 라이브러리에 대한 임포트 문과 사용자 엔티티 자체에 대한 클래스 정의가 포함되어야 합니다. 클래스 정의는 개발 및 배포 중에 적절한 유형 검사를 보장하기 위해 적절한 TypeScript 클래스 및 인터페이스로 장식되어야 합니다.

 import { Entity, PrimaryGeneratedColumn, Column, } from "typeorm";

@Entity()
export class User {
    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    name: string;

    @Column()
    email: string;
}

사용자 엔티티는 데이터베이스에 저장된 사용자 데이터의 아키텍처를 설정하며, 아이디를 기본 키 열로 이름 및 이메일 열과 해당 속성으로 구성됩니다.

이 글도 확인해 보세요:  슬랙에서 나만의 사용자 지정 슬래시 명령 만들기

CRUD API 서비스 생성

다음 명령을 사용하여

 nest g service users 

처리 로직을 관리하는 API 서비스를 생성할 수 있습니다. “user-auth.service.ts”는 Pinterest 클론 프로젝트의 인증 서비스 구현이 포함된 TypeScript 파일입니다. 프로젝트에 Google 로그인 기능을 추가하려면 이 파일을 열고 그 안에 다음 코드를 삽입해야 합니다:

 import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import {User} from './models/user.entity';

@Injectable()
export class UsersService {
  constructor(
    @InjectRepository(User)
    private userRepository: Repository<User>,
  ) {}

  async findAll(): Promise<User[]> {
    return this.userRepository.find();
  }

  async findOne(id: number): Promise<User> {
    return this.userRepository.findOne({ where: { id } });
  }

  async create(user: Partial<User>): Promise<User> {
    const newuser = this.userRepository.create(user);
    return this.userRepository.save(newuser);
  }

  async update(id: number, user: Partial<User>): Promise<User> {
    await this.userRepository.update(id, user);
    return this.userRepository.findOne({ where: { id } });
  }

  async delete(id: number): Promise<void> {
    await this.userRepository.delete(id);
  }
}

UsersService 클래스에는 CRUD 작업을 관리하기 위한 여러 API 메서드가 포함되어 있습니다. 이러한 메서드는 모든 사용자 데이터 검색, 고유 식별자를 통해 특정 사용자 찾기, 새로운 사용자 생성, 이미 존재하는 사용자 수정, 리포지토리에서 특정 사용자 정보 삭제 등으로 구성됩니다.

API 컨트롤러 정의

사용자 관련 활동과 관련된 API 엔드포인트의 관리를 감독하기 위해 컨트롤러를 개발해야 합니다.

 nest g controller users 

UsersService) {} @Post(‘register’) 비동기 등록(@Request() req): Promise { const user = new User({ 이메일: req.body.email, password: req.body.password, name: req.body.name, age: req.body.age,

 import { Controller, Get, Post, Body, Put, Param, Delete, NotFoundException, HttpCode } from '@nestjs/common';
import { UsersService } from './users.service';
import { User } from './models/user.entity';

@Controller('api/users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @Get()
  async findAll(): Promise<User[]> {
    return this.usersService.findAll();
  }

  @Post()
  @HttpCode(201)
  async create(@Body() user: User): Promise<User> {
    const createdUser = await this.usersService.create(user);
    return createdUser;
  }

  @Put(':id')
  async update (@Param('id') id: number, @Body() user: User): Promise<any> {
    await this.usersService.update(id, user);
    return { message: 'User updated successfully' };
  }

  @Delete(':id')
  async delete(@Param('id') id: number): Promise<any> {
    const user = await this.usersService.findOne(id);

    if (!user) {
      throw new NotFoundException('User does not exist!');
    }

    await this.usersService.delete(id);
    return { message: 'User deleted successfully' };
  }
}

컨트롤러는 사용자 작업과 관련된 애플리케이션 프로그래밍 인터페이스(API) 엔드포인트를 감독할 책임이 있습니다. GET 요청을 처리하여 모든 사용자를 검색하고, POST 요청을 통해 신규 사용자를 생성하며, PUT 요청을 통해 기존 사용자를 업데이트하고, DELETE 요청을 수신하면 사용자를 삭제합니다.

이 글도 확인해 보세요:  자바스크립트에서 Intl API를 사용하는 방법

이 컨트롤러는 사용자 서비스 구현 및 사용자 엔티티와의 상호 작용을 통해 데이터베이스 내에 저장된 사용자 및 관련 데이터와 관련된 모든 운영 작업을 처리하기 위한 포괄적인 인터페이스를 제공합니다.

users.module.ts 파일 업데이트

`사용자` 모델과 데이터베이스에 연결할 수 있는 `TypeOrmModule`에 필요한 가져오기 문을 추가하여 `user.entity.ts` 파일을 업데이트하세요.다음은 수정 후의 모습에 대한 예시입니다: “`타입스크립트 ‘typeorm’에서 { Entity, PrimaryGeneratedColumn, Column }을 가져옵니다; ‘./user.controller’에서 { User }를 가져옵니다; @Entity() 사용자 클래스 내보내기 { PrimaryGeneratedColumn() id: 숫자; @Column() firstName: 문자열; @Column() 성: 문자열; @Column() 이메일: 문자열 } “` 다음으로, `src

 import { Module } from '@nestjs/common';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './models/user.entity';

@Module({
  imports: [TypeOrmModule.forFeature([User])],
  controllers: [UsersController],
  providers: [UsersService]
})

export class UsersModule {}

에 `user.controller.ts`라는 새 파일을 생성합니다. 마지막으로, 개발 서버를 활성화하여 Postman을 통해 CRUD 작업을 평가해 보세요.

 npm run start 

서버는 포트 3000에서 시작되며, http://localhost:3000/api/users 에서 API 요청을 보낼 수 있습니다.

Nest.js로 백엔드 애플리케이션 구축

Nest.js를 활용하면 기본 REST API 또는 다각적인 웹 애플리케이션 개발 등 신뢰할 수 있고 탄력적인 백엔드 플랫폼을 구축하는 데 기여하는 광범위한 기능과 용량을 생성할 수 있습니다.

Nest.js는 Express.js에 비해 프로젝트 생성을 위한 보다 체계적인 방법론을 제공합니다. 따라서 개발자는 잘 조직화된 모듈식 아키텍처 패턴으로 인해 복잡한 애플리케이션을 쉽게 구성, 확장 및 유지할 수 있습니다.

By 박준영

업계에서 7년간 경력을 쌓은 숙련된 iOS 개발자인 박준영님은 원활하고 매끄러운 사용자 경험을 만드는 데 전념하고 있습니다. 애플(Apple) 생태계에 능숙한 준영님은 획기적인 솔루션을 통해 지속적으로 기술 혁신의 한계를 뛰어넘고 있습니다. 소프트웨어 엔지니어링에 대한 탄탄한 지식과 세심한 접근 방식은 독자에게 실용적이면서도 세련된 콘텐츠를 제공하는 데 기여합니다.