Nest.js를 배워보자/4. NestJS에서 데이터베이스 연결하기 — Prisma 기반 실습

Prisma 스키마 설계

_Blue_Sky_ 2025. 12. 2. 12:09
728x90

 


1. 📝 schema.prisma 파일 구조 다시 보기

Prisma 프로젝트를 초기화하면 생성되는 prisma/schema.prisma 파일은 Prisma의 핵심입니다. 이 파일은 크게 세 블록으로 구성됩니다.

  1. generator 블록: 데이터베이스와 통신할 Prisma Client를 어떻게 생성할지 정의합니다.
  2. datasource 블록: 사용하려는 데이터베이스 종류(provider)와 연결 URL을 정의합니다.
  3. model 블록: 데이터베이스의 테이블 구조를 정의합니다. (가장 중요한 부분)
 
// prisma/schema.prisma

// 1. generator (Prisma Client 설정)
generator client {
  provider = "prisma-client-js"
}

// 2. datasource (DB 연결 설정)
datasource db {
  provider = "mysql" // 또는 "postgresql", "sqlite" 등
  url      = env("DATABASE_URL")
}

// 3. model (테이블 구조 정의) - 여기서부터가 핵심입니다.
// ...
728x90

2. 🧱 데이터 모델(Model) 정의

model 블록 내부에 데이터베이스의 테이블에 해당하는 모델을 정의합니다. 각 모델은 테이블 이름이 되고, 모델 내부의 속성들은 테이블의 컬럼(Field)이 됩니다.

기본 모델 예시: User

 
model User {
  // 1. ID 필드: 기본 키(Primary Key) 설정
  id      Int      @id @default(autoincrement()) // 정수형, 기본 키, 자동 증가
  
  // 2. 일반 필드: 타입과 제약 조건 설정
  email   String   @unique // 문자열, 유일성 제약(Unique)
  name    String? // 문자열, Null 허용 가능(?)
  
  // 3. 날짜 필드
  createdAt DateTime @default(now()) // 날짜/시간, 생성 시점 자동 입력
  updatedAt DateTime @updatedAt // 날짜/시간, 데이터 변경 시 자동 업데이트
  
  // (아래 4번에서 관계 설정)
  posts   Post[] // User와 Post 간의 1:N 관계 정의 (Post 모델이 정의되어야 함)
}

3. 🧩 주요 필드 타입 및 속성(Attribute)

타입 (Prisma Scalar Type) 설명 SQL 타입 예시
String 문자열 데이터 VARCHAR, TEXT
Int 정수 INT
Float 실수 FLOAT
Boolean 참/거짓 BOOLEAN
DateTime 날짜 및 시간 DATETIME, TIMESTAMP
Json JSON 객체 JSON
속성 (Attribute) 설명
@id 해당 필드를 기본 키 (Primary Key)로 설정합니다.
@unique 해당 필드의 값이 유일(Unique)해야 함을 강제합니다.
@default(값) 데이터 생성 시 값이 제공되지 않으면 기본값을 설정합니다. (예: now(), autoincrement())
@updatedAt 데이터가 업데이트될 때마다 현재 시각으로 자동 업데이트됩니다.
? (타입 뒤) 해당 필드가 NULL 값을 가질 수 있음을 나타냅니다.

4. 🔗 모델 간 관계(Relation) 설정

Prisma는 모델 간의 관계(1:1, 1:N, N:M)를 명시적으로 정의합니다. 관계 설정은 외래 키(Foreign Key) 필드와 관계 필드의 두 부분으로 이루어집니다.

1:N (일대다) 관계 예시: User와 Post

  1. Post 모델 (N 쪽): User에 대한 외래 키 필드관계 필드를 정의합니다. 
     
    model Post {
      id        Int      @id @default(autoincrement())
      title     String
      content   String?
    
      // 💡 외래 키 필드 (실제 DB 컬럼)
      authorId  Int 
    
      // 💡 관계 필드 (Prisma Client에서 사용. DB에는 생성되지 않음)
      author    User     @relation(fields: [authorId], references: [id])
    
      // ...
    }
    
  2. User 모델 (1 쪽): Post 배열을 추가하여 역방향 접근을 정의합니다.

    model User {
      // ...
      posts   Post[] // Post 모델과의 1:N 관계를 나타냅니다.
    }
    

@relation 속성은 관계의 구체적인 설정(어떤 필드를 외래 키로 사용할지)을 명시합니다.


728x90

5. 🛠️ 스키마 변경 적용: 마이그레이션

스키마 설계를 완료하면, schema.prisma의 내용을 실제 데이터베이스에 반영해야 합니다. 

# 새로운 마이그레이션 파일 생성 및 DB에 적용
npx prisma migrate dev --name init

이 명령은:

  1. 현재 스키마 상태를 기반으로 마이그레이션 파일을 생성하고 (prisma/migrations 폴더).
  2. Prisma Client를 업데이트하고 (다음 주제에서 자세히 다룰 내용).
  3. 데이터베이스에 테이블을 실제로 생성합니다.
728x90