TIL/개인 TIL

TIL :: Prisma

두캔두잇 2023. 11. 15. 14:22

평소에 자주 사용하던 ORM에는 Sequelize와 TypeORM과 같은 것들을 사용했는데, 최근 여러 회사에서도 Prisma를 사용하는 곳이 많은것 같아서 공부하고 사용하게 되었다. 

 

우선 Prisma가 무엇인가? 라고 하면 최근 많이 사용하고 있는 ORM이고 REST API, GraphQL 등 모든 곳에서 사용이 가능하다.

그리고 사용하면서 느낀 점은, 모델을 정의하고 타입들을 다 지정해주면서 안전하게 데이터를 가지고 올 수 있고, 코드를 적으며 스키마에서 적용했던 타입들이 아닐때에는 바로 오류를 반환해서 타입안정성이 정말 좋다고 느꼈다.

 

일단은 사용을 하기위해선

 

1. 초기 세팅

 npm install prisma —save-dev 

라이브러리를 다운받아주고,  그 다음 prisma init 을 하게 되면 평소와는 다르게 .env 파일이 자동으로 생성되는 것을 볼  수가 있다.

.env파일

env파일에 들어가보면 이렇게 나와있을건데 알아보기 쉽게 한글로 적어두었다. 사용자 이름에는 예) admin, 비밀번호는 예)1234 이렇게 적고 localhost쪽은 알맞게 포트를 설정해주면된다. 나는 docker를 사용해 postgreSQL로 해서 자주쓰는 포트 5432로 적어두었다.

그리고 나서 뒤쪽에 DB이름쪽에만 목적성에 맞는 이름으로 설정을 해주면 셋팅은 끝이다.

 

2. Schema 설정

prisma라는 폴더안에 schema.prisma 라는 파일이 있을 껀데, 안에 들어가보면

 

이렇게 설정이 되어있을 것이다. 여기에서는 아무것도 만질 필요가 없고  데이터소스 아래쪽에서 모델을 만들어서 사용하면 된다.

 

3. Model 설정

모델을 설정하는 것도 그렇게 어렵지 않다. 한 가지 예시를 통해 설명을 해보겠다.

model User {
  id         String    @id @default(uuid())
  name       String    @db.VarChar(255)
  nickname   String    @db.VarChar(255)
  createdAt  DateTime  @default(now()) @map("created_at")
  updatedAt  DateTime  @updatedAt() @map("updated_at")
  }

 

임의적으로 User라는 모델을 하나 만들었다. 각 하나씩 설명을 해보자면,

id 는 고유한 값이기 때문에  @id 라고 타입지정을 하고 @default를 해준다. 그리고 2가지의 방법이 있는데,

한 가지는 id를 INT 정수타입으로 한 뒤 @default(autoincrement()) 로 하는 방법이 있고,

다른 방법은 위에와 같이 String 타입으로 주고 uuid 로 한 방법이다. 이 두가지는 같다고 생각하면 된다. 하지만 INT(정수타입) 으로 할 때에는 반드시 디폴트뒤에 autoincrement를 해줘야 한다는 것이다. 

 

그 다음에는 name, nickname을 보면 뒤에 String타입으로 설정을 하고 @db.VarChar(255) 를 해주었는데, 사실 없어도 작동하는데 있어서는 문제될게 없지만 사용한 이유는 저렇게 Varchar타입으로 하지않으면 Text 타입으로 설정이 되는데 메모리,비용적인 문제에서 크기를 제한하는 Varchar타입이 훨씬 괜찮다고 생각하여 저렇게 설정을 해준 것 이다.

 

createdAt과 updatedAt이 남았는데 시간과 관련이 있으므로 DateTime 타입으로 지정을 해준다. 그리고 현재의 시간 @default(now)를 해주는데 왜 updatedAt에서는 안하느냐? 라고 생각이 들 수 있다. 그건 @updatedAt() 이라는 타입에 자동적으로 포함이 되어있기 때문에 updatedAt은 따로 @updatedAt 를 해주었다. 

 

마지막으로 @map의 기능이 무엇이냐면 현재 모델을 정의한 곳에서 컬럼들을 보면 createdAt , updatedAt 이렇게 카멜케이스로 적혀져 있다. 하지만 @map을 사용함으로써 실제 DB에 저장되는 컬럼을 수정할 수 있는 것이다. 그래서 @map("created_at")  이렇게 적어둔 이유가 모델쪽에서는 createdAt 이라고 카멜케이스로 되어있지만, 내 데이터베이스에서는 created_at 이렇게 저장하기 위해서 사용했다고 생각하면된다. 한 마디로 데이터베이스에 저장되는 이름을 재정의 한다고 생각하면 된다.

 

이로써 가볍게 Prisma를 사용하는 방법을 마무리할까 한다. 다양한 기능들과 좀 더 딥한 기능들은 공식문서를 참고하면서 공부하면 더 편할 것이다.

 


내가 생각하는 Prisma의 큰 장점

 

Model에서 타입지정한 것과 실제 비즈니스 로직에서 차이가 있다면 바로 오류를 반환한다. 그렇기 때문에 타입에 대한 안정성이 좋다고 생각하여서 오류를 보면서 하나씩 접근해가며 좋은 코드들을 만들 수 있을 것 같다.

 

예) 모델에서 name은 varchar 타입으로 하고 실제 서비스로직에서는 findUnique로 찾으려는 경우 에러가 반환된다. 

 

왜냐하면 prisma.user.findUnique로 찾는데 실제 모델에 있는 name은 유니크로 설정하지 않았기 때문

 

해결하기 위해서는 name 에  @unique를 해주고 

 

prisma db push 를 해준뒤 prisma generate를 무조건 해줘야 정상적으로 반영되고 오류가 해결 될 것이다.

 

한 마디로 스키마 파일에 변경이 있다면 prisma generate 명령을 실행해서 변경사항을 무조건 prisma에 반영을 해줘야 한다.