-
Notifications
You must be signed in to change notification settings - Fork 1
TypeORM VS Prisma
Youngho Kim edited this page Nov 23, 2022
·
5 revisions
- ์์ฑ์: J159_์ด์ง์ฐ
- ๊ฐ์ฒด์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ๋งคํ(์ฐ๊ฒฐ)ํด์ฃผ๋ ๊ฒ์ ์๋ฏธ
- ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํด๋์ค๋ฅผ ์ฌ์ฉํ๊ณ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ํ ์ด๋ธ์ ์ฌ์ฉํ๋๋ฐ, ๊ฐ์ฒด ๋ชจ๋ธ๊ณผ ๊ด๊ณํ ๋ชจ๋ธ ๊ฐ์ ๋ถ์ผ์น๊ฐ ์กด์ฌํ๊ฒ ๋จ
- ORM์ ํตํด ๊ฐ์ฒด ๊ฐ์ ๊ด๊ณ๋ฅผ ๋ฐํ์ผ๋ก SQL์ ์๋์ผ๋ก ์์ฑํ์ฌ ๋ถ์ผ์น๋ฅผ ํด๊ฒฐํจ
- ๊ฐ์ฒด๋ฅผ ํตํด ๊ฐ์ ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฐ์ฒด๋ฅผ ๋ค๋ฃธ
- DB <= ORM(Mapping) => Object ํ๋
- ๊ฐ์ฒด ์งํฅ์ ์ธ ์ฝ๋๋ก ์ธํด ๋ ์ง๊ด์ ์ด๊ณ ๋น์ฆ๋์ค ๋ก์ง์ ์ง์คํ ์ ์๊ฒ ํด์ค
- ์ฌ์ฌ์ฉ ๋ฐ ์ ์ง๋ณด์์ ํธ๋ฆฌ์ฑ ์ฆ๊ฐ
- DBMS์ ๋ํ ์ข ์์ฑ์ด ์ค์ด๋ฆ
- Node.js ๋ฑ๊ณผ ๊ฐ์ ํ๋ซํผ์์ JavaScript, TypeScript์ ํจ๊ป ์ฌ์ฉํ ์ ์๋ ORM
- ํ ORM๊ณผ ๋ฌ๋ฆฌ ์กํฐ๋ธ ๋ ์ฝ๋ ํจํด๊ณผ ๋ฐ์ดํฐ ๋งคํผ ํจํด์ ๋ชจ๋ ์ง์
- ๋ค์ํ ๋ฐ์ดํฐ ๋ฒ ์ด์ค๋ฅผ ์ง์ (MariaDB,NOSQL ๋ฑ)
- ๊ธฐ์กด ORM๊ณผ ๊ทผ๋ณธ์ ์ผ๋ก ๋ค๋ฅธ ORM, ๊ธฐ์กด ORM์ด ๊ฒช๋ ๋ง์ ๋ฌธ์ ๋ค์ ๊ฒช์ง ์์
- GraphQL ์คํค๋ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก DB๋ฅผ ์๋์์ฑํจ
- ๊ตฌ์ฑ ์์
- schema : model์ ์ ์ํจ
- introspect :
npx prisma introspect
๋ฅผ ํตํด ๊ธฐ์กด์ DB ๊ตฌ์กฐ๋ฅผ ์๋์ผ๋ก schema๋ก ๋ถ๋ฌ์ค๋ ๊ธฐ๋ฅ - migrate : DB๋ฅผ ๋ณ๊ฒฝํ๋ ๊ธฐ๋ฅ
- client : ๋ฐ์ดํฐ์ ๋ง์ถฐ ์๋ ์์ฑ๋๋ ์ฟผ๋ฆฌ์์ฑ๊ธฐ, schema๋ฅผ ๊ธฐ๋ฐ์ผ๋กย DB์ ์์ฒญ
- studio : GUI๋ก ์ง์ํ๋ DB ํธ์ง๊ธฐ
- Prisma Studio๋ผ๋ DB ์ ๊ทผ GUI๋ฅผ ์ ๊ณตํจ
- GraphQL์ ์ฅ์
- HTTP ์์ฒญ ํ์๋ฅผ ์ค์ผ ์ ์์
- HTTP ์๋ต ์ฌ์ด์ฆ๋ฅผ ์ค์ผ ์ ์์
- API์ request/response์ ๋น๊ต์ ๋ ์์กดํ ์ ์์
๐ก **๋ฐฐ๊ฒฝ : ๋ฐฑ์๋ ํ๋ ์์ํฌ๋ NestJS + express๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ๋ ์ํ์์ ORM ์ฌ์ฉ์ ๋ํด ์๋ ผํ์์**
- Fluent API๋ฅผ ํตํด Join์ ํ ๊ฒฝ์ฐ ์ฌ๋ฌ ์ฟผ๋ฆฌ๋ก ๋ถ๋ฆฌ๋์ ํธ์ถ๋๋ค๊ณ ํจ
- ex) member ํ ์ด๋ธ๊ณผ Team ํ ์ด๋ธ์ Joinํ ๊ฒฝ์ฐ ์ด 2๋ฒ์ ์ง์๊ฐ ์คํ๋จ
- ์๋ ์ถ์ฒ์์ 10000๊ฐ์ ๋ฐ์ดํฐ๋ก ํ
์คํธ๋ฅผ ์งํํ ๊ฒ์ ์ฐธ๊ณ ํ์์
- Prisma์ ๊ฒฝ์ฐ 180-240ms, TypeORM์ ๊ฒฝ์ฐ 90-120ms๊ฐ ๊ฑธ๋ ธ์
- ์ถ์ฒ
- ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ด ๋๋ฌด ๋ง์
- Prisma์ ๊ฒฝ์ฐ ํ์คํ๊ฒ Prisma Studio์ ๊ฐ์ด ํธ๋ฆฌํ ๊ธฐ๋ฅ์ ์ ๊ณตํด์ฃผ์ง๋ง ๊ทธ๋งํผ ๋ฌ๋์ปค๋ธ๊ฐ ์ฆ๊ฐํ๋ค๊ณ ์๊ฐํ์์
- ex) ๋ณ๋์ Schema ์ ์์ด ์กด์ฌ โ Schema ์ ์์ด ํ์ต
- ์ถ๊ฐ์ ์ผ๋ก GraphQL ํ์ต์ด ํ์ํจ
- Prisma๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ GraphQL ์ญ์ ํ์ตํด์ผ ํ๋ค๋ ๋ถ๋ด๊ฐ์ด ์์์
-
์ฐ๋ฆฌ ํ์ ์ค Prisma์ GraphQL์ ์ฌ์ฉํด๋ณธ ํ์์ด ์์์
- TypeORM์ ๋ด๊ฐ ์ง๋ ํ๋ก์ ํธ์์ ์ฌ์ฉํด๋ณธ ๊ฒฝํ์ด ์์์
- ํ์ดํธ๋ณด๋์ ๊ฐ์ฒด(๋๋ก์, ํฌ์คํธ์, ๋ํ ๋ฑ)๋ฅผ ์ด๋ป๊ฒ ์ ์ฅํ ๊ฒ์ธ์ง ํ์ ๋์ง ์์์
- GraphQL์ ์ฌ์ฉํ๊ฒ ๋๋ฉด, File ์ ์ก๊ณผ ๊ฐ์ด Text๋ก๋ ์ฒ๋ฆฌํ๊ธฐ ํ๋ค ๊ฒฝ์ฐ ์ง์ ๊ตฌํํด์ผํจ
- GraphQL์ ์ฌ์ฉํ๋ฉด ๊ณ ์ ๋ ์์ฒญ๊ณผ ์๋ต๋ง ํ์ํ ๋์๋ query๋ก ์ธํด ์์ฒญ์ ํฌ๊ธฐ๊ฐ Restful๋ณด๋ค ์ปค์ง ์ ์์
- Prisma์ ๊ฒฝ์ฐ DateTime์ TimeZone ์ต์ ์ด ์กด์ฌํ์ง ์์ (๋ณ๋ ๊ตฌํํด์ผํจ)
- TypeORM์ ๊ฒฝ์ฐ, NestJS์ Default ORM์ด๊ธฐ ๋๋ฌธ์ ๋ณด๋ค ๋ง์ Reference๋ค์ด ์กด์ฌํจ
- โ๋ถ๋๋ผโ์ด๋ผ๋ ํ๋ก์ ํธ๋ ์ค์๊ฐ ๊ณต์ ํธ์ง ๊ธฐ๋ฅ์ด ๋งค์ฐ ์ค์ํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ โ๋ฐ์ ์๋โ๊ฐ ์ค์ํ ๊ณ ๋ ค์ฌํญ ์ค ํ๋์ด๋ค.
- ERD ์ค๊ณ ์ Join์ด ๋น๋ฒํ๊ฒ ์ผ์ด๋ ๊ฒ์ด๊ณ , ์ด๋ฅผ ๊ณ ๋ คํ๋ค๋ฉด Join์ ํ ์ด๋ธ ํ๋ ๋น ์๋๊ฐ ๋ฐฐ๋ก ๋์ด๋๋ Prisma ๋ณด๋ค๋ TypeORM์ด ์ฐ๋ฆฌ ํ๋ก์ ํธ์ ์ ํฉํ ๊ฒ์ด๋ผ๊ณ ํ๋จํ์๋ค.
- 6์ฃผ ๊ฐ ์งํํ๋ ํ๋ก์ ํธ์์ Prisma์ GraphQL์ ํ์ตํ๋ฉฐ ๊ตฌํํ๋ ๊ฒ์ ๋ถ๋ด์ด ๋ ์ ์๋ค.
- NestJS์ ORM ๋ ๊ฐ์ง ๋ชจ๋ ํ์ตํด์ผ ํ๋ ํ์๋ค๋ ์์๋๋ฐ, TypeORM์ ๋นํด ๋ฌ๋์ปค๋ธ๊ฐ ๋๋ค๊ณ ํ๋จ๋๋ Prisma์ GraphQL์ ์ถ๊ฐ๋ก ํ์ตํ๋ฉฐ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ ๊ฒ์ ๋ถ๋ด์ด ๋๋ค๊ณ ํ๋จํ์๋ค.
- ๊ธฐํ ๋ถ๊ฐ์ ์ธ ์ด์ ๋ฅผ ํฌํจํด์ ๊ณ ๋ฏผํ ๊ฒฐ๊ณผ ์ฐ๋ฆฌ๋ TypeORM์ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ์๋ค.
๋ฐ์ผ๋ฆฌ ์คํฌ๋ผ
- [Week1-Day1] ํ ๋น๋ฉ
- [Week1-Day2] ๋ฐ์ผ๋ฆฌ ์คํฌ๋ผ
- [Week1-Day3] ๋ฐ์ผ๋ฆฌ ์คํฌ๋ผ
- [Week1-Day4] ๋ฐ์ผ๋ฆฌ ์คํฌ๋ผ
- [Week1-Day5] ๋ฐ์ผ๋ฆฌ ์คํฌ๋ผ
- [Week2-Day1] ์คํ๋ฆฐํธ ๊ณํ ํ์
- [Week2-Day2] ๋ฐ์ผ๋ฆฌ ์คํฌ๋ผ
- [Week2-Day3] ๋ฐ์ผ๋ฆฌ ์คํฌ๋ผ
- [Week2-Day4] ๋ฐ์ผ๋ฆฌ ์คํฌ๋ผ
- [Week3-Day1] ์คํ๋ฆฐํธ ๊ณํ ํ์
- [Week3-Day2] ๋ฐ์ผ๋ฆฌ ์คํฌ๋ผ
- [Week3-Day3] ๋ฐ์ผ๋ฆฌ ์คํฌ๋ผ
- [Week3-Day4] ๋ฐ์ผ๋ฆฌ ์คํฌ๋ผ
- [Week4-Day1] ์คํ๋ฆฐํธ ๊ณํ ํ์
- [Week4-Day2] ๋ฐ์ผ๋ฆฌ ์คํฌ๋ผ
- [Week4-Day3] ๋ฐ์ผ๋ฆฌ ์คํฌ๋ผ
- [Week4-Day4] ๋ฐ์ผ๋ฆฌ ์คํฌ๋ผ
- [Week5-Day1] ์คํ๋ฆฐํธ ๊ณํ ํ์
- [Week5-Day2] ๋ฐ์ผ๋ฆฌ ์คํฌ๋ผ
- [Week5-Day3] ๋ฐ์ผ๋ฆฌ ์คํฌ๋ผ
- [Week5-Day4] ๋ฐ์ผ๋ฆฌ ์คํฌ๋ผ
- [Week6-Day1] ์คํ๋ฆฐํธ ๊ณํ ํ์
- [Week6-Day2] ๋ฐ์ผ๋ฆฌ ์คํฌ๋ผ
- [Week6 Day3] ๋ฐ์ผ๋ฆฌ ์คํฌ๋ผ
- [Week6 Day4] ๋ฐ์ผ๋ฆฌ ์คํฌ๋ผ