-
Notifications
You must be signed in to change notification settings - Fork 3
Prisma, PostgreSQL 선택의 이유
- 이 문서는 Prisma와 TypeORM, PostgreSQL과 MySQL을 비교하고, 프로젝트 요구사항에 적합한 기술 스택을 선정한 이유를 다룹니다.
- ORM과 데이터베이스의 장단점을 분석하여 선택 과정을 명확히 하고, 관련 설계와 문제 해결 과정을 기록합니다.
타입 안전성
ASK-IT은 개발언어로 TypeScript를 사용합니다. Prisma는 TypeScript 기반 애플리케이션에서 데이터베이스와의 상호작용을 타입 안전하게 만들어 줍니다.
재사용성
ASK-IT은 프레임워크로 NESTJS를 사용합니다. Prisma는 Prisma client를 NestJs의 의존성 주입과 결합하여 각 서비스에 Prisma Client를 재사용성 높은 형태로 주입이 가능합니다.
UUID
ASK-IT 서비스에서는 session의 id 등에 UUID를 사용하고 있습니다. PostgreSQL은 UUID 타입을 지원하기 때문에 선택하였습니다.
다대다, 일대다
ASK-IT 서비스는 session과 user 등이 복잡한 관계를 가집니다. PostgreSQL은 복잡한 관계형 데이터를 처리하는데 있어 많은 장점이 있어 선택하였습니다.
-
스키마 정의 방식의 차이
-
Prisma의 선언적 스키마
Prisma는 직관적인 DSL(Domain Specific Language)을 사용합니다.
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? published Boolean @default(false) authorId Int? author User? @relation(fields: [authorId], references: [id]) }
이렇게 명확하고 간결한 문법 덕분에 러닝 커브가 낮을 것이라고 생각했습니다.
-
TypeORM의 데코레이터 기반 접근
TypeORM은 Typescript 데코레이터를 활용합니다.
@Entity() export class User { @PrimaryGeneratedColumn() id : number @Column({ nullable: true }) name: string @Column({ unique: true }) email: string @OneToMany((type) => Post, (post) => post.author) posts: Post[] } @Entity() export class Post { @PrimaryGeneratedColumn() id: number @Column() title: string @Column({ nullable: true }) content: string @Column({ default: false }) published: boolean @ManyToOne((type) => User, (user) => user.posts) author: User }
-
-
타입 안전성 비교
-
Prisma의 강력한 타입 체크
Prisma는 컴파일 타임에 전체적인 타입 안전성을 제공합니다.
const posts = await prisma.post.findMany({ select: { id: true, title: true, } }); // 컴파일 타임에 오류 감지 const post = posts[0]; console.log(post.content); // Error: Property 'content' does not exist
-
TypeORM의 제한적 타입 체크
TypeORM은 기본적인 TypeScript 타입 체크만 제공합니다:
const posts = await repository.find({ select: ['id', 'title'] }); // 런타임 에러 가능성 const post = posts[0]; console.log(post.content); // 컴파일은 되지만 런타임 에러 발생
핵심 차이점:
- Prisma는 쿼리 결과의 타입을 정확하게 추론
- TypeORM은 선택된 필드에 대한 타입 안전성을 보장하지 못함
TypeORM과 비교되는 위와 같은 Prisma의 장점을 생각했을 때, 6주라는 짧은 기간동안 빠르게 서비스를 완성하기 위해서는 Prisma를 도입하는 것이 이득이라 판단 되었습니다.
-
PostgreSQL과 Prisma를 사용함으로써 데이터 모델링 및 쿼리 작성에 소요되는 시간을 크게 단축시켰고, 이를 통해 빠른 개발 속도를 달성할 수 있었습니다. Prisma는 복잡한 데이터 관계를 직관적으로 처리할 수 있게 해주어 서비스의 복잡한 데이터 구조도 안정적으로 관리할 수 있었습니다. 이 덕분에 서비스가 문제 없이 원활하게 동작할 수 있었으며, 개발 효율성과 시스템 안정성을 동시에 향상시킬 수 있었습니다.