Skip to content

TypeORM VS Prisma

Youngho Kim edited this page Nov 23, 2022 · 5 revisions
  • ์ž‘์„ฑ์ž: J159_์ด์ง„์šฐ

1. ORM (Object Relation Mapping: ๊ฐ์ฒด ๊ด€๊ณ„ ๋งคํ•‘)

1.1. ORM์ด๋ž€

  • ๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ๋งคํ•‘(์—ฐ๊ฒฐ)ํ•ด์ฃผ๋Š” ๊ฒƒ์„ ์˜๋ฏธ
    • ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ๊ฐ์ฒด ๋ชจ๋ธ๊ณผ ๊ด€๊ณ„ํ˜• ๋ชจ๋ธ ๊ฐ„์— ๋ถˆ์ผ์น˜๊ฐ€ ์กด์žฌํ•˜๊ฒŒ ๋จ
    • ORM์„ ํ†ตํ•ด ๊ฐ์ฒด ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ SQL์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜์—ฌ ๋ถˆ์ผ์น˜๋ฅผ ํ•ด๊ฒฐํ•จ
  • ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ๊ฐ„์ ‘์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฃธ
    • DB <= ORM(Mapping) => Object ํ•„๋“œ

1.2. ORM์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

  • ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ์ฝ”๋“œ๋กœ ์ธํ•ด ๋” ์ง๊ด€์ ์ด๊ณ  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์คŒ
  • ์žฌ์‚ฌ์šฉ ๋ฐ ์œ ์ง€๋ณด์ˆ˜์˜ ํŽธ๋ฆฌ์„ฑ ์ฆ๊ฐ€
  • DBMS์— ๋Œ€ํ•œ ์ข…์†์„ฑ์ด ์ค„์–ด๋“ฆ
๐Ÿ’ก **๋‹จ, ์™„๋ฒฝํ•˜๊ฒŒ ORM์œผ๋กœ๋งŒ ์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ๋Š” ์–ด๋ ค์›€**

ORM ์ •๋ฆฌ


2. TypeORM

2.1. TypeORM์ด๋ž€

  • Node.js ๋“ฑ๊ณผ ๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ JavaScript, TypeScript์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ORM

2.2. TypeORM์˜ ์žฅ์ 

  • ํƒ€ ORM๊ณผ ๋‹ฌ๋ฆฌ ์•กํ‹ฐ๋ธŒ ๋ ˆ์ฝ”๋“œ ํŒจํ„ด๊ณผ ๋ฐ์ดํ„ฐ ๋งคํผ ํŒจํ„ด์„ ๋ชจ๋‘ ์ง€์›
  • ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋ฅผ ์ง€์› (MariaDB,NOSQL ๋“ฑ)

3. Prisma

3.1. Prisma๋ž€

3.2. Prisma์˜ ์žฅ์ 

  • Prisma Studio๋ผ๋Š” DB ์ ‘๊ทผ GUI๋ฅผ ์ œ๊ณตํ•จ
  • GraphQL์˜ ์žฅ์ 
    • HTTP ์š”์ฒญ ํšŸ์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Œ
    • HTTP ์‘๋‹ต ์‚ฌ์ด์ฆˆ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Œ
    • API์˜ request/response์— ๋น„๊ต์  ๋œ ์˜์กดํ•  ์ˆ˜ ์žˆ์Œ

์ฐธ๊ณ 1, ์ฐธ๊ณ 2


๐Ÿ’ก **๋ฐฐ๊ฒฝ : ๋ฐฑ์—”๋“œ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” NestJS + express๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •๋œ ์ƒํƒœ์—์„œ ORM ์‚ฌ์šฉ์— ๋Œ€ํ•ด ์˜๋…ผํ•˜์˜€์Œ**

4. ๊ณ ๋ ค์‚ฌํ•ญ

4.1. ์†๋„

  • Fluent API๋ฅผ ํ†ตํ•ด Join์„ ํ•  ๊ฒฝ์šฐ ์—ฌ๋Ÿฌ ์ฟผ๋ฆฌ๋กœ ๋ถ„๋ฆฌ๋˜์„œ ํ˜ธ์ถœ๋œ๋‹ค๊ณ  ํ•จ
    • ex) member ํ…Œ์ด๋ธ”๊ณผ Team ํ…Œ์ด๋ธ”์„ Joinํ•  ๊ฒฝ์šฐ ์ด 2๋ฒˆ์˜ ์งˆ์˜๊ฐ€ ์‹คํ–‰๋จ
  • ์•„๋ž˜ ์ถœ์ฒ˜์—์„œ 10000๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•œ ๊ฒƒ์„ ์ฐธ๊ณ ํ•˜์˜€์Œ
    • Prisma์˜ ๊ฒฝ์šฐ 180-240ms, TypeORM์˜ ๊ฒฝ์šฐ 90-120ms๊ฐ€ ๊ฑธ๋ ธ์Œ
    • ์ถœ์ฒ˜

4.2. ๊ณผ๋„ํ•œ ๋Ÿฌ๋‹์ปค๋ธŒ ์šฐ๋ ค

  • ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์ด ๋„ˆ๋ฌด ๋งŽ์Œ
    • Prisma์˜ ๊ฒฝ์šฐ ํ™•์‹คํ•˜๊ฒŒ Prisma Studio์™€ ๊ฐ™์ด ํŽธ๋ฆฌํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด์ฃผ์ง€๋งŒ ๊ทธ๋งŒํผ ๋Ÿฌ๋‹์ปค๋ธŒ๊ฐ€ ์ฆ๊ฐ€ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์˜€์Œ
    • ex) ๋ณ„๋„์˜ Schema ์ •์˜์–ด ์กด์žฌ โ‡’ Schema ์ •์˜์–ด ํ•™์Šต
  • ์ถ”๊ฐ€์ ์œผ๋กœ GraphQL ํ•™์Šต์ด ํ•„์š”ํ•จ
    • Prisma๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„  GraphQL ์—ญ์‹œ ํ•™์Šตํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋ถ€๋‹ด๊ฐ์ด ์žˆ์—ˆ์Œ
  • ์šฐ๋ฆฌ ํŒ€์› ์ค‘ Prisma์™€ GraphQL์„ ์‚ฌ์šฉํ•ด๋ณธ ํŒ€์›์ด ์—†์—ˆ์Œ
    • TypeORM์€ ๋‚ด๊ฐ€ ์ง€๋‚œ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•ด๋ณธ ๊ฒฝํ—˜์ด ์žˆ์—ˆ์Œ

4.3. ๋ถ€๊ฐ€์ ์ธ ์ด์œ 

  • ํ™”์ดํŠธ๋ณด๋“œ์˜ ๊ฐ์ฒด(๋“œ๋กœ์ž‰, ํฌ์ŠคํŠธ์ž‡, ๋„ํ˜• ๋“ฑ)๋ฅผ ์–ด๋–ป๊ฒŒ ์ €์žฅํ•  ๊ฒƒ์ธ์ง€ ํ™•์ •๋˜์ง€ ์•Š์•˜์Œ
    • GraphQL์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด, File ์ „์†ก๊ณผ ๊ฐ™์ด Text๋กœ๋Š” ์ฒ˜๋ฆฌํ•˜๊ธฐ ํž˜๋“ค ๊ฒฝ์šฐ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์•ผํ•จ
  • GraphQL์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ณ ์ •๋œ ์š”์ฒญ๊ณผ ์‘๋‹ต๋งŒ ํ•„์š”ํ•  ๋•Œ์—๋Š” query๋กœ ์ธํ•ด ์š”์ฒญ์˜ ํฌ๊ธฐ๊ฐ€ Restful๋ณด๋‹ค ์ปค์งˆ ์ˆ˜ ์žˆ์Œ
  • Prisma์˜ ๊ฒฝ์šฐ DateTime์˜ TimeZone ์˜ต์…˜์ด ์กด์žฌํ•˜์ง€ ์•Š์Œ (๋ณ„๋„ ๊ตฌํ˜„ํ•ด์•ผํ•จ)
  • TypeORM์˜ ๊ฒฝ์šฐ, NestJS์˜ Default ORM์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ณด๋‹ค ๋งŽ์€ Reference๋“ค์ด ์กด์žฌํ•จ

4.4. ๊ฒฐ๋ก  : TypeORM์„ ์„ ํƒ

  1. โ€˜๋ถ€๋„๋Ÿผโ€™์ด๋ผ๋Š” ํ”„๋กœ์ ํŠธ๋Š” ์‹ค์‹œ๊ฐ„ ๊ณต์œ  ํŽธ์ง‘ ๊ธฐ๋Šฅ์ด ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— โ€˜๋ฐ˜์‘ ์†๋„โ€™๊ฐ€ ์ค‘์š”ํ•œ ๊ณ ๋ ค์‚ฌํ•ญ ์ค‘ ํ•˜๋‚˜์ด๋‹ค.
    • ERD ์„ค๊ณ„ ์ƒ Join์ด ๋นˆ๋ฒˆํ•˜๊ฒŒ ์ผ์–ด๋‚  ๊ฒƒ์ด๊ณ , ์ด๋ฅผ ๊ณ ๋ คํ•œ๋‹ค๋ฉด Join์„ ํ…Œ์ด๋ธ” ํ•˜๋‚˜ ๋‹น ์†๋„๊ฐ€ ๋ฐฐ๋กœ ๋Š˜์–ด๋‚˜๋Š” Prisma ๋ณด๋‹ค๋Š” TypeORM์ด ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์— ์ ํ•ฉํ•  ๊ฒƒ์ด๋ผ๊ณ  ํŒ๋‹จํ•˜์˜€๋‹ค.
  2. 6์ฃผ ๊ฐ„ ์ง„ํ–‰ํ•˜๋Š” ํ”„๋กœ์ ํŠธ์—์„œ Prisma์™€ GraphQL์„ ํ•™์Šตํ•˜๋ฉฐ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ๋ถ€๋‹ด์ด ๋  ์ˆ˜ ์žˆ๋‹ค.
    • NestJS์™€ ORM ๋‘ ๊ฐ€์ง€ ๋ชจ๋‘ ํ•™์Šตํ•ด์•ผ ํ•˜๋Š” ํŒ€์›๋“ค๋„ ์žˆ์—ˆ๋Š”๋ฐ, TypeORM์— ๋น„ํ•ด ๋Ÿฌ๋‹์ปค๋ธŒ๊ฐ€ ๋†’๋‹ค๊ณ  ํŒ๋‹จ๋˜๋Š” Prisma์™€ GraphQL์„ ์ถ”๊ฐ€๋กœ ํ•™์Šตํ•˜๋ฉฐ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ๋ถ€๋‹ด์ด ๋œ๋‹ค๊ณ  ํŒ๋‹จํ•˜์˜€๋‹ค.
  3. ๊ธฐํƒ€ ๋ถ€๊ฐ€์ ์ธ ์ด์œ ๋ฅผ ํฌํ•จํ•ด์„œ ๊ณ ๋ฏผํ•œ ๊ฒฐ๊ณผ ์šฐ๋ฆฌ๋Š” TypeORM์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜์˜€๋‹ค.

๐Ÿ“š ๊ทธ๋ผ์šด๋“œ ๋ฃฐ

โœ๏ธ ์ปจ๋ฒค์…˜

๐Ÿง‘โ€๐Ÿซ ๋ฉ˜ํ† ๋ง

๐Ÿ“ ์• ์ž์ผ ํ”„๋กœ์„ธ์Šค

๊ธฐํš
๋ฐ์ผ๋ฆฌ ์Šคํฌ๋Ÿผ
์Šคํ”„๋ฆฐํŠธ ๋ฆฌ๋ทฐ
์Šคํ”„๋ฆฐํŠธ ํšŒ๊ณ 
ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…
๊ธฐํƒ€ ์‚ฐ์ถœ๋ฌผ

๐Ÿ“– ๊ธฐ์ˆ ๋ฌธ์„œ

Week2
Week3
Week4
Week5

๐Ÿ—‚ ์ฐธ๊ณ ๋ฌธ์„œ

Clone this wiki locally