37.백엔드에 Prisma를 사용한 데이터베이스 관리, Nest.js와 Prisma를 사용한 데이터 모델링

현대의 웹 애플리케이션에서 데이터베이스 관리와 데이터 모델링은 매우 중요한 부분입니다. 특히, Nest.jsPrisma를 조합하면 효율적인 백엔드 개발과 데이터 관리를 할 수 있습니다. 이 글에서는 Prisma의 기본 개념, Nest.js와의 연동 방법, 데이터 모델링의 기초를 다루고 예제를 통해 이를 보여주도록 하겠습니다.

1. Prisma 개요

Prisma는 개발자가 데이터를 쉽게 관리하고 변형할 수 있도록 도와주는 오픈 소스 ORM(Object Relational Mapping) 도구입니다. JavaScript와 TypeScript 환경에서 강력한 데이터베이스 접근을 제공하며, SQL 데이터베이스를 안전하고 효율적으로 사용할 수 있게 해줍니다. Prisma는 데이터베이스를 스키마 기반으로 정의할 수 있게 해주며, 개발자가 데이터베이스 변경 사항을 쉽게 마이그레이션할 수 있도록 도와줍니다.

1.1 Prisma의 주요 기능

  • Type Safety: TypeScript와의 통합으로 얻는 타입 안전성은 런타임 오류를 줄여줍니다.
  • 생산성 향상: Prisma Client를 통한 간편한 쿼리 작성으로 생산성이 극대화됩니다.
  • Migrations: Prisma Migrate를 사용하면 스키마의 변경 이력을 관리할 수 있어 쉽게 마이그레이션을 수행할 수 있습니다.
  • 생태계 통합: GraphQL, REST API와 쉽게 통합되며, 다양한 데이터베이스에 대한 지원을 제공합니다.

2. Nest.js 소개

Nest.js는 현대적인 Node.js 서버 측 애플리케이션을 만들기 위한 강력한 프레임워크입니다. Angular에서 영감을 받아 모듈화와 의존성 주입을 통해 애플리케이션의 구조를 개선하는 데 중점을 둡니다. Nest.js는 Express.js와 Fastify를 기본적으로 지원하며, GraphQL, WebSocket, RESTful API 기능을 제공합니다.

2.1 Nest.js의 장점

  • 모듈화: Nest.js는 모듈화를 통해 코드의 가독성과 재사용성을 향상시킵니다.
  • 의존성 주입: 효율적인 의존성 주입 패턴을 통해 테스트와 유지보수가 용이합니다.
  • 확장성: 다양한 라이브러리와 외부 모듈과 통합이 쉽습니다.
  • 타입스크립트 지원: Nest.js는 TypeScript로 작성되어 타입 안전성을 제공합니다.

3. Nest.js와 Prisma 연동하기

이제 Nest.js와 Prisma를 함께 사용할 준비가 되었습니다. 다음 절차를 통해 프로젝트를 설정하고 데이터베이스와의 기본적인 상호작용을 구성해 보겠습니다.

3.1 프로젝트 셋업

  1. Node.js와 Nest.js CLI를 설치합니다:
  2. npm install -g @nestjs/cli
  3. Nest.js 프로젝트를 생성합니다:
  4. nest new prisma-nest-example
  5. 생성된 프로젝트 폴더로 이동합니다:
  6. cd prisma-nest-example
  7. Prisma를 설치합니다:
  8. npm install prisma --save-dev
    npx prisma init

3.2 Prisma 스키마 정의

Prisma의 스키마 파일인 schema.prisma에서 데이터베이스 모델을 정의합니다. 이 예제에서는 간단한 사용자 모델을 만들어 보겠습니다:

model User {
  id        Int      @id @default(autoincrement())
  name      String
  email     String   @unique
  posts     Post[]
}

model Post {
  id        Int      @id @default(autoincrement())
  title     String
  content   String
  authorId  Int
  author    User     @relation(fields: [authorId], references: [id])
}

3.3 마이그레이션

다음으로 Prisma Migrate 기능을 사용하여 데이터베이스에 모델을 반영합니다:

npx prisma migrate dev --name init

이 명령어는 데이터베이스에 init이라는 이름으로 마이그레이션을 생성하고, 스키마를 반영합니다.

3.4 Prisma Client 생성

Prisma Client를 생성하여 데이터베이스와 상호작용할 수 있도록 설정합니다:

npx prisma generate

4. 서비스 및 컨트롤러 생성

Nest.js에서는 서비스와 컨트롤러를 생성하여 비즈니스 로직과 라우팅을 관리합니다. 이를 통해 데이터를 CRUD하는 API를 만들 수 있습니다.

4.1 사용자 서비스 생성

nest generate service users

생성된 users.service.ts 파일을 열고 다음과 같이 Prisma Client를 주입합니다:

import { Injectable } from '@nestjs/common';
import { PrismaService } from './prisma.service';
import { User, Post } from '@prisma/client';

@Injectable()
export class UsersService {
  constructor(private prisma: PrismaService) {}

  async createUser(data: { name: string; email: string }): Promise {
    return this.prisma.user.create({ data });
  }

  async getAllUsers(): Promise {
    return this.prisma.user.findMany();
  }

  // 추가적인 메서드들...
}

4.2 사용자 컨트롤러 생성

nest generate controller users

생성된 users.controller.ts 파일을 열고 다음과 같이 구현합니다:

import { Controller, Get, Post, Body } from '@nestjs/common';
import { UsersService } from './users.service';
import { User } from '@prisma/client';

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

  @Post()
  async createUser(@Body() body: { name: string; email: string }): Promise {
    return this.usersService.createUser(body);
  }

  @Get()
  async getAllUsers(): Promise {
    return this.usersService.getAllUsers();
  }

  // 추가적인 핸들러들...
}

5. API 테스트

Nest.js를 실행하면 기본적으로 http://localhost:3000에서 API를 사용할 수 있습니다. Postman이나 다른 HTTP 클라이언트를 사용하여 사용자를 생성하고 조회해보세요.

5.1 사용자 생성

POST 요청을 http://localhost:3000/users에 보내어 사용자 데이터를 전송합니다.

5.2 모든 사용자 조회

GET 요청을 http://localhost:3000/users에 보내어 모든 사용자의 정보를 가져옵니다.

6. 데이터 모델링의 중요성

효율적인 데이터 모델링은 웹 애플리케이션이 성공적으로 기능하도록 보장하는 핵심 요소입니다. Prisma와 Nest.js를 사용하여 좋은 데이터 모델링을 구현하는 것은 프로젝트의 확장성과 성능을 높이는 데 기여합니다.

6.1 데이터 정규화

데이터 정규화는 데이터 중복을 줄이고 데이터 무결성을 유지하는 데 도움이 됩니다. 이를 통해 나중에 수정할 때 발생할 수 있는 오류를 줄일 수 있습니다.

6.2 관계 정의

데이터베이스에서의 관계 정의는 효율적인 쿼리를 가능하게 하며, 데이터 간의 상호작용을 쉽게 합니다. Prisma에서는 관계를 쉽게 정의할 수 있어 이러한 작업이 간편해집니다.

7. 결론

Nest.js와 Prisma의 조합은 모던 웹 애플리케이션 개발에 있어 매우 유용한 도구입니다. TypeScript의 이점을 활용하면서 효율적인 데이터베이스 관리와 데이터 모델링을 할 수 있게 해줍니다. 이 글에서는 기본적인 설정과 데이터 모델링 방법을 다루었지만, 실제 프로젝트에서는 더 많은 기능과 패턴을 적용할 수 있습니다. 이 프레임워크를 통해 여러분의 백엔드 개발에 많은 도움이 됐기를 바랍니다.

8. 참고 자료