Skip to content

Prisma, PostgreSQL 선택의 이유

shl0501 edited this page Dec 1, 2024 · 1 revision

📄 Prisma와 TypeORM, PostgreSQL과 MySQL 비교 및 선택

  • 이 문서는 Prisma와 TypeORM, PostgreSQL과 MySQL을 비교하고, 프로젝트 요구사항에 적합한 기술 스택을 선정한 이유를 다룹니다.
  • ORM과 데이터베이스의 장단점을 분석하여 선택 과정을 명확히 하고, 관련 설계와 문제 해결 과정을 기록합니다.

🧩 배경 및 필요성

Prisma를 선택한 이유

타입 안전성

ASK-IT은 개발언어로 TypeScript를 사용합니다. Prisma는 TypeScript 기반 애플리케이션에서 데이터베이스와의 상호작용을 타입 안전하게 만들어 줍니다.

재사용성

ASK-IT은 프레임워크로 NESTJS를 사용합니다. Prisma는 Prisma client를 NestJs의 의존성 주입과 결합하여 각 서비스에 Prisma Client를 재사용성 높은 형태로 주입이 가능합니다.

PostgreSQL을 선택한 이유

UUID

ASK-IT 서비스에서는 session의 id 등에 UUID를 사용하고 있습니다. PostgreSQL은 UUID 타입을 지원하기 때문에 선택하였습니다.

다대다, 일대다

ASK-IT 서비스는 session과 user 등이 복잡한 관계를 가집니다. PostgreSQL은 복잡한 관계형 데이터를 처리하는데 있어 많은 장점이 있어 선택하였습니다.

🔍 기술적 분석 및 비교

Typeorm vs Prisma

  1. 스키마 정의 방식의 차이

    • 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
      
      }
  2. 타입 안전성 비교

    • 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는 복잡한 데이터 관계를 직관적으로 처리할 수 있게 해주어 서비스의 복잡한 데이터 구조도 안정적으로 관리할 수 있었습니다. 이 덕분에 서비스가 문제 없이 원활하게 동작할 수 있었으며, 개발 효율성과 시스템 안정성을 동시에 향상시킬 수 있었습니다.

Clone this wiki locally