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 ํ๊ฒฝ์์๋ TypeORM, Prisma, Sequelize ๋ฑ ๋ค์ํ ORM์ด ์กด์ฌํ๋ค. ๋๋ Javascript ํ๊ฒฝ๋ฟ๋ง ์๋๋ผ TypeScript์์๋ ์ฌ์ฉํ ์ ์๊ณ , ORM ๊ฐ๋ ์ ํ์ตํ๊ธฐ ์ฌ์ด Prisma๋ฅผ ๋ฐํ์ผ๋ก ํ๋ก์ ํธ๋ฅผ ์งํํ๋ค. ๋๋ฌธ์ Prisma ๊ธฐ์ค์ผ๋ก ORM์๋ํ ๋ด์ฉ์ ์์ ํ๋ค. )
โธ Prisma๋?
Prisma๋ ORM(Object Relational Mapping)์ผ๋ก์จ Javascript ๊ฐ์ฒด(Object)์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ด๊ณ(Relation)์ ์ฐ๊ฒฐ(Mapping) ํด์ฃผ๋ ๋๊ตฌ์ด๋ค.
- Prisma์ ๊ฐ์ ORM์ ์ฌ๋ฌ๊ฐ์ง์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค(RDB)๋ฅผ ์ฌ์ฉํ ์ ์๋ค. MySQL, Oracle, MariaDB, PostgreSQL์ ๊ฐ์ ๋ค์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
โธ 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๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋์ฑ ์ข์ ์ ์๋ค.
