ORM๊ณผ Prisma

์œคํƒœ๊ทœยท2023๋…„ 12์›” 20์ผ
  1. ORM๊ณผ Prisma
  • 1) Prisma๋ž€?
    ๐Ÿ’ก Prisma๋Š” ORM(Object Relational Mapping)์œผ๋กœ์จ Javascript ๊ฐ์ฒด(Object)์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ด€๊ณ„(Relation)์„ ์—ฐ๊ฒฐ(Mapping) ํ•ด์ฃผ๋Š” ๋„๊ตฌ
  • 2) Prisma vs 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)์€ ๋™์ผํ•œ ์œ„์ƒ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
3) 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 ("์ œ๋ชฉ", "๋‚ด์šฉ");
    INSERT INTO Posts (title, content, visibility)
           VALUE ("์ œ๋ชฉ", "๋‚ด์šฉ", "visible");
    # ๊ฒŒ์‹œ๊ธ€์˜ visivility Column์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    ์šฐ์„  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๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋”์šฑ ์ข‹์„ ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค.

profile
๋๊นŒ์ง€ ๊ฐ€์ž

0๊ฐœ์˜ ๋Œ“๊ธ€