[ Node.js ์ˆ™๋ จ์ฃผ์ฐจ1 (1-0)] ORM๊ณผ Prisma

2023. 9. 10. 23:22ใ†3. Node.js

 

โ–ธ ORM์ด๋ž€?

๊ฐ์ฒด ๊ด€๊ณ„ ๋งคํ•‘(Object-relational mapping; ORM)์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๊ฐ„์˜ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•์ด๋‹ค. ๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” "๊ฐ€์ƒ" ๊ฐ์ฒด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ๊ฐ์ฒด ๊ด€๊ณ„ ๋งคํ•‘์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ์ƒ์šฉ ๋˜๋Š” ๋ฌด๋ฃŒ ์†Œํ”„ํŠธ์›จ์–ด ํŒจํ‚ค์ง€๋“ค์ด ์žˆ๊ณ , ๊ฒฝ์šฐ์— ๋”ฐ๋ผ์„œ๋Š” ๋…์ž์ ์œผ๋กœ ๊ฐœ๋ฐœํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

์ฐธ์กฐURL : ๊ฐ์ฒด ๊ด€๊ณ„ ๋งคํ•‘ - ์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „ (wikipedia.org)

 

๊ฐ์ฒด ๊ด€๊ณ„ ๋งคํ•‘ - ์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „

์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „. ๊ฐ์ฒด ๊ด€๊ณ„ ๋งคํ•‘(Object-relational mapping; ORM)์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๊ฐ„์˜ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•์ด๋‹ค. ๊ฐ์ฒด ์ง€ํ–ฅ

ko.wikipedia.org

( * Node.js ํ™˜๊ฒฝ์—์„œ๋Š” TypeORMPrismaSequelize ๋“ฑ ๋‹ค์–‘ํ•œ ORM์ด ์กด์žฌํ•œ๋‹ค. ๋‚˜๋Š” Javascript ํ™˜๊ฒฝ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ TypeScript์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ORM ๊ฐœ๋…์„ ํ•™์Šตํ•˜๊ธฐ ์‰ฌ์šด Prisma๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ๋‹ค. ๋•Œ๋ฌธ์— Prisma ๊ธฐ์ค€์œผ๋กœ ORM์—๋Œ€ํ•œ ๋‚ด์šฉ์„ ์„œ์ˆ ํ–ˆ๋‹ค. ) 

 


 

โ–ธ Prisma๋ž€? 

Prisma๋Š” ORM(Object Relational Mapping)์œผ๋กœ์จ Javascript ๊ฐ์ฒด(Object)์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ด€๊ณ„(Relation)์„ ์—ฐ๊ฒฐ(Mapping) ํ•ด์ฃผ๋Š” ๋„๊ตฌ์ด๋‹ค.

 - Prisma์™€ ๊ฐ™์€ ORM์€ ์—ฌ๋Ÿฌ๊ฐ€์ง€์˜ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(RDB)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. MySQL, OracleMariaDBPostgreSQL์™€ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 


 

โ–ธ ODM (Object Document Mapping)๊ณผ ์–ด๋–ค์ฐจ์ด์ผ๊นŒ? 

- Prisma์™€ mongoose๋ฅผ ๋น„๊ตํ•˜๋ฉด ๊ทธ ์ฐจ์ด๋ฅผ ์‰ฝ๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

mongoose์˜ ๊ฒฝ์šฐ ODM(Object Document Mapping)์œผ๋กœ Javascript์˜ ๊ฐ์ฒด๋ฅผ Document(๋ฌธ์„œ)์™€ ์—ฐ๊ฒฐํ•˜์ง€๋งŒ,

Prisma๋Š” ORM(Object Relational Mapping)์œผ๋กœ Javascript์˜ ๊ฐ์ฒด์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ด€๊ณ„(Relation)๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ์ฐจ์ด์ ์ด ์žˆ๋‹ค.

 

mongoose๋Š” ์ง€์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” MongoDB ๋ฐ–์— ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.  Prisma์˜ ๊ฒฝ์šฐ RDBMS์— ํ•ด๋‹นํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์žˆ๋‹ค. (* Prisma์˜ ๊ฒฝ์šฐ MongoDB๋ฅผ ์ง€์›ํ•œ๋‹ค. )

mongoose์˜ ๊ฒฝ์šฐ Schema์˜ ํ˜•ํƒœ๋กœ ์ปฌ๋ ‰์…˜(Collection)์— ๋Œ€ํ•œ ์†์„ฑ์„ ์„ค์ •ํ•˜์˜€๋‹ค๋ฉด, Prisma์˜ ๊ฒฝ์šฐ Model์˜ ํ˜•ํƒœ๋กœ ํ…Œ์ด๋ธ”(Table)์˜ ์†์„ฑ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. (* MongoDB์˜ ์ปฌ๋ ‰์…˜(Collection)๊ณผ MySQL์˜ ํ…Œ์ด๋ธ”(Table)์€ ๋™์ผ์„ฑ์„ ๊ฐ€์ง€๊ณ ์žˆ๋‹ค.

 

 

โ–ธ ORM์˜ ์žฅ์ ๊ณผ ๋‹จ์ ์ด ๋ญ˜๊นŒ? 

 

๊ณผ๊ฑฐ์—๋Š” MySQL์„ ์‚ฌ์šฉํ•˜๋ ค ํ• ๋•Œ, ORM์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ SQL์„ ์‚ฌ์šฉํ•˜๋Š” Raw Query ํ˜•ํƒœ๋กœ ๊ตฌํ˜„ํ•˜์—ฌ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

ํ•˜์ง€๋งŒ Prisma์™€ ๊ฐ™์€ ORM์ด ์ƒ๊ธฐ๊ฒŒ ๋˜๋ฉด์„œ ์œ„์™€ ๊ฐ™์€ ์ƒํ™ฉ๋“ค์ด ๋งŽ์ด ์ค„์–ด๋“ค๊ฒŒ ๋˜์—ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ, Raw Query๋กœ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ณ , ORM์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๊ฐ€ ๋ฌด์—‡์ผ๊นŒ?

 

Prisma์™€ ๊ฐ™์€ ORM์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€์žฅ ํฐ ์ด์œ ๋Š” ๋Œ€ํ‘œ์ ์œผ๋กœ 2๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

 

1) ํ”„๋กœ๋•์…˜์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์–ธ์ œ๋ฐ”๋€” ์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค.์ฒ˜์Œ์€ ๊ฐ€์žฅ ๋ณดํŽธ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” MySQL์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‹œ๊ฐ„์ด ์ง€๋‚ ์ˆ˜๋ก ๊ฐœ๋ฐœ์ž๋“ค์˜ ์œ ์ง€๋ณด์ˆ˜ ๋งŒ์œผ๋กœ DB๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์›Œ์ ธ ๊ธฐ์ˆ ์ง€์›์ด ํ™œ๋ฐœํ•œ Oracle๋กœ DB๋ฅผ ๋ณ€๊ฒฝํ•˜๋ คํ•  ๋•Œ ORM์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฐœ๋ฐœ์ž๋“ค์€ ๋‘๊ฐ€์ง€์˜ ์„ ํƒ์˜ ๊ธฐ๋กœ์— ์„œ๊ฒŒ๋œ๋‹ค.

 

1. ์„œ๋น„์Šค ์ค‘์ธ ํ”„๋กœ๋•์…˜์˜ ๋ชจ๋“  Raw Query์ฝ”๋“œ๋ฅผ MySQL์—์„œ Oracle๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜๊ฑฐ๋‚˜,

2. Oracle๋กœ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ , ์–ด๋ ค์šด ํ˜„์žฌ ์ƒํ™ฉ์„ ๊ฐ๋‚ดํ•˜๊ณ  ๊ณ„์† MySQL์„ ์“ด๋‹ค

 

ํ•˜์ง€๋งŒ, ORM์„ ๋„์ž…ํ•˜์˜€์„ ๊ฒฝ์šฐ ์—ฌ๋Ÿฌ๋ถ„๋“ค์€ ์ด๋Ÿฐ ์ƒํ™ฉ์„ ๊ฒช์ง€ ์•Š๊ณ , ๋‹จ์ˆœํžˆ ORM์˜ ์†์„ฑ๊ฐ’๋งŒ ๋ณ€๊ฒฝํ•  ๊ฒฝ์šฐ ์–ธ์ œ๋“ ์ง€ ์ž์œ ๋กญ๊ฒŒ DB๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด ๊ฐœ๋ฐœํ•  ๋•Œ ์„ ํƒ์˜ ํญ์ด ๋„“์–ด์ง€๊ฒŒ ๋œ๋‹ค.

 

2) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์‚ฌ์šฉํ•˜๋Š” DB ๋˜๋Š” Table ์†์„ฑ์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ ๋น ๋ฅด๊ฒŒ ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

DB๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ชจ๋‘ Javascript์—์„œ Raw Query๋กœ ๊ตฌํ˜„ํ•˜์˜€๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

ํ”„๋กœ๋•์…˜์—์„œ ์„œ๋น„์Šค๋ฅผ ์ง„ํ–‰ ์ค‘ ๊ฐ‘์ž‘์Šค๋Ÿฝ๊ฒŒ ํด๋ผ์ด์–ธํŠธ์˜ ์š”๊ตฌ์‚ฌํ•ญ์œผ๋กœ ๊ฒŒ์‹œ๊ธ€์„ ์ƒ์„ฑํ•  ๋•Œ ๊ณต๊ฐœ๋น„๊ณต๊ฐœ ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋˜์—ˆ์„ ๊ฒฝ์šฐ ์•„๋ž˜์™€ ๊ฐ™์€ SQL์ด ์ƒ์„ฑ๋˜๊ฒŒ ๋œ๋‹ค. 

INSERT INTO Posts (title, content)
       VALUE ("์ œ๋ชฉ", "๋‚ด์šฉ");
       
       // visivility ์†์„ฑ๊ฐ’์ด ์ถ”๊ฐ€๋˜๊ธฐ ์ „
INSERT INTO Posts (title, content, visibility)
       VALUE ("์ œ๋ชฉ", "๋‚ด์šฉ", "visible");
# ๊ฒŒ์‹œ๊ธ€์˜ visivility Column์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
     // visivility ์†์„ฑ๊ฐ’์ด ์ถ”๊ฐ€๋œ ํ›„

Javascript ์ฝ”๋“œ ๋งŒ์œผ๋กœ๋Š” ๊ฒŒ์‹œ๊ธ€์„ ๊ด€๋ฆฌํ•˜๋Š” ํ…Œ์ด๋ธ”์ด ์–ด๋–ค ํ…Œ์ด๋ธ”์„ ๋‚˜ํƒ€๋‚ด๋Š”์ง€ ์ธ์ง€ํ•˜๊ธฐ๋„ ์–ด๋ ต๊ณ , ๋ชจ๋“  API์—์„œ ์‚ฌ์šฉํ•˜๋Š” Raw Query์—์„œ visibility Column์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ํ•˜๋‚˜์”ฉ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค.

๋‹จ์ˆœํžˆ ์กฐํšŒ๋ฅผ ํ•˜๋Š” API ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ƒ์„ฑ์ˆ˜์ •์‚ญ์ œ์— ํ•ด๋‹นํ•˜๋Š” ๋ชจ๋“  API๋ฅผ ํ•ด๋‹นํ•˜๋Š” ์ฟผ๋ฆฌ์— ๋งž๊ฒŒ ์ˆ˜์ •ํ•ด์•ผํ•˜๋Š” ๋ถˆ์ƒ์‚ฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ  ๋œ๋‹ค. (ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•œ์ง€ ์–ผ๋งˆ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด API๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์‰ฝ๊ฒ ์ง€๋งŒ, ์‚ฌ์šฉํ•˜๋Š” API๊ฐ€ ์ˆ˜์‹ญ, ์ˆ˜๋ฐฑ๊ฐœ๊ฐ€ ๋œ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ, ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด ์‰ฝ์ง€ ์•Š๋‹ค.)

์—ฌ๊ธฐ์„œ ORM์„ ์‚ฌ์šฉํ•˜์˜€์„ ๊ฒฝ์šฐ ํ…Œ์ด๋ธ”์„ ๋‚˜ํƒ€๋‚ด๋Š” Prisma์˜ model์„ ์ˆ˜์ •ํ•˜๊ธฐ๋งŒ ํ•˜๋”๋ผ๋„ ์ˆ˜๋งŽ์€ API์—์„œ Raw Query๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ ๋„ visibility Column ๊ฐ’์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜, ORM๋„ ๋งŒ๋Šฅ์€ ์•„๋‹ˆ๋‹ค. ๋‹จ์ ์ด ์กด์žฌํ•œ๋‹ค.

 

JOIN๊ณผ UNION ์—ฐ์‚ฐ์ž๋ฅผ ๋™์‹œ์— ์‚ฌ์šฉํ•˜๋Š” ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ๊ฒฝ์šฐ, ORM์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด SQL ๋ณด๋‹ค๋Š” ORM์„ ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ณ , ์ด๋กœ์ธํ•ด ์›์ธ๊ณผ ๊ฒฐ๊ณผ๊ฐ€ ๋’ค์ง‘ํžŒ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

๋˜ํ•œ, ์„œ๋ธŒ ์ฟผ๋ฆฌ๋ฅผ ํฌํ•จํ•˜๋Š” ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜, ORM์˜ SQL๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ์‹œ๊ฐ„ ์กฐ์ฐจ ์•„๊นŒ์šด ๊ทนํ•œ์˜ ์„ฑ๋Šฅ์„ ์š”๊ตฌํ•˜๋Š” ์ฟผ๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ์ƒํ™ฉ์—์„œ๋Š” Raw Query๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋”์šฑ ์ข‹์„ ์ˆ˜ ์žˆ๋‹ค.