[TIL] Prisma 기초

👉🏼 KIM·2024년 11월 28일

TIL

목록 보기
47/54

오늘 공부한것 & 기억하고 싶은 내용

Prisma

  • 데이터베이스와 애플리케이션 사이에서 통역사 역할을 해주는 도구
  • 내가 사용하는 데이터베이스에 맞춰 필요한 파일이나 마이그레이션 파일을 자동으로 생성해주기 때문에 정말 유용함
  • SQL을 몰라도 데이터베이스를 효율적으로 다룰 수 있게 도와줘서 개발 초보자에게도 유용함

Prisma 기능 및 장점

  1. 데이터베이스 스키마 정의
  2. 자동 마이그레이션
  3. 타입 안전성 제공
  4. 다양한 데이터베이스 지원
  5. 빠른 생산성

1. Prisma 설치와 초기화

  • vscode 확장 프로그램에서 "Prisma" 설치하면 도움됨
  • 설치
npm i prisma
  • 초기화
npx prisma init

초기화 결과

  • prisma/schema.prisma 파일 생성: 이 파일에서 데이터베이스의 구조와 규칙(스키마)을 정의.
  • .env 파일 생성: 데이터베이스에 접속하기 위한 DATABASE_URL 환경 변수가 여기에 저장.
  • 중요: .env 파일에는 중요한 정보가 들어 있으므로 절대 깃헙에 올리지 않도록 .gitignore에 포함해야 합니다.

.env 파일 수정

DATABASE_URL="file:./database.db"

2. SQLite와 Prisma

  • 초보자가 배우기엔 SQLite가 쉽고, 로컬에서 실행할 수 있어 추천함
  • 추가로 VSCode에서 SQLite Viewer 확장 프로그램을 설치하면 데이터베이스를 시각적으로 볼 수 있어 편리함

3. Prisma Schema와 Models

  • 애플리케이션 도메인의 엔터티를 나타냅다.
  • 데이터베이스의 테이블(PostgreSQL과 같은 관계형 데이터베이스) 또는 컬렉션(MongoDB)에 매핑
  • 모델(Model)은 데이터베이스에서 테이블과 비슷한 개념으로, 우리가 다룰 데이터를 어떻게 저장할지 정의한다.

Schema 파일 (schema.prisma)

  • schema.prisma는 데이터베이스에 어떤 데이터가 저장될지 설명한다.
model User {
  id 			Int 	@id @default(autoincrement())//기본 키, 자동 증가
  username 		String 	@unique 					.//고유값
  email 		String? @unique						// 선택적 필드 (?)
  password 		String?
  phone 		String? @unique
  githubId 		String? @unique
  avatar 		String?								//이미지 넣을때(깃허브면 프로필 사진 저장 가능)
  createdAt 	DateTime @default(now())			//생성 시간
  updatedAt 	DateTime @updatedAt					//수정 시간
}

<save 시 릴레이션 자동완성 방법>

플러그인 prisma 다운
cmd + shift + p로 JSON settings 파일을 열고

"[prisma]": {
"editor.defaultFormatter": "Prisma.prisma"
}

4. 마이그레이션(Migrations)

  • 스키마 파일을 수정한 후, 데이터베이스에 반영하려면 마이그레이션이 필요하다.
npx prisma migrate dev

Enter a name for the new migration: -> 이름을 정해주고 엔터 (예시: add_user, smstoken)
  • 새로운 마이그레이션 파일을 생성하고 변경 사항을 데이터베이스에 적용
  • 개발 환경에서만 사용! 프로덕션 환경에서는 사용 금지!
  • Prisma는 mpx prisma generate 명령어도 같이 실행한다.

5. Prisma Client

  • Prisma Client는 Prisma가 자동으로 생성해주는 타입 안전한 쿼리 빌더이다.
  • 데이터베이스와 상호작용할 때 사용할 수 있다.
  • 설치
npm install @prisma/client
  • 사용 예시
  import { PrismaClient } from "@prisma/client";
  const db = new PrismaClient();

  async function createUser() {
    await db.user.create({
      data: {
        username: "홍길동",
        phone: "010-1234-5678",
      },
    });
  }

  createUser();

//export default db;

6. Prisma Studio

  • Prisma Studio는 데이터베이스를 시각적으로 관리할 수 있는 UI(편집기)
  • Prisma 스키마 파일에 정의된 모든 모델 목록을 확인하고 데이터베이스를 관리할 수 있다.
  • Client의 어드민을 위한 UI
npx prisma studio
  • http://localhost:5555/ 로 열림
  • 새로운 사용자를 추가하거나 새로운 모델을 만드는 것과 같은 것을 하고 싶다면 schema.prisma 파일을 수정하고 migrate한 다음 변경사항을 studio에 반영하고 싶다면 studio를 끄고 npx prisma studio 재시작하는걸 추천

    schema.prisma 파일 수정
    npx prisma migrate dev로 마이그레이션 적용
    Studio를 다시 실행 (npx prisma studio)

7. Relations

  • Relation는 Prisma 스키마의 두 모델 간의 연결이다.
  • Relation(관계)는 데이터의 구조를 설계하고, 관련된 데이터를 효율적으로 조회하고나 조작할 수 있도록 도와준다.
  • @relation(fields, references) : 관계를 정의하고, 외래 키 필드와 참조되는 모델의 필드를 연결.
model SMSToken {
  // id         Int      @id @default(autoincrement())
  id Int @id @default(autoincrement())
  token      String   @unique
  created_at DateTime @default(now())
  updated_at DateTime @updatedAt
  user       User     @relation(fields: [userId], references: [id])
  userId     Int
}

//user       User 까지만 작성하면 자동완성으로 relation은 나옴!! -편안-

8. onDelete

  • Relations(관계)로 작업을 할 때 꼭 알아야 함.
  • 위 SMSToken 코드를 보면 user는 필수값이다. (물음표가 없기 때문)
  • 필수값인 경우에는 삭제를 못한다.
  • 서로 연관된 모델이 지워질때 삭제가 가능해진다.
  • onDelete 행위는 늘 고려해야한다.
model SMSToken {
  // id         Int      @id @default(autoincrement())
  id Int @id @default(autoincrement())
  token      String   @unique
  created_at DateTime @default(now())
  updated_at DateTime @updatedAt
  user       User     @relation(fields: [userId], references: [id], onDelete: Cascade)
  userId     Int
}

onDelete

Cascade: 참조 레코드를 삭제하면 참조 레코드의 삭제가 트리거된다. (사용자가 삭제됐을때 사용자가 연결된 모든 SMSToken들도 같이 지워진다)
Restrict: 참조 레코드가 있는 경우 삭제를 방지한다.
NoAction: Restrict과 유사하지만 사용 중인 데이터베이스에 따라 다르다.
SetNull: 참조 필드가 NULL로 설정된다. (optional일 때만 정상 작동/사용자가 삭제됐을때 null로 설정)
SetDefault: 참조 필드가 기본값으로 설정된다.

배운점 & 느낀점

초기 설정이 좀 복잡해보이기는 하는데 다른 데이터베이스를 다루는 프로그램(?)보다는 단순하다고 하니 열심히 연습해봐야겠다.
db 초기 설계만 잘끝낸다면 분명 좋은 프로젝트가 완성되지 않을까 하는 기대가 생긴다!

profile
프론트는 순항중 ¿¿

0개의 댓글