๋ฐ์ดํฐ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋ก์ ํธ๋ฅผ ๊ทธ๊ฒ๋ค์ ์ค์ฌ์ผ๋ก ๊ตฌ์ถํด์ผ ํ๋ฉฐ ๊ทธ๊ฒ๋ค๊ณผ ํจ๊ป ๊ตฌ์ถํ ์ ์์ต๋๋ค.
Drizzle ORM
Drizzle ORM์ ํค๋๊ฐ ์๋ ํค๋๋ฆฌ์ค TypeScript ORM์ ๋๋ค. ๐ฒ
Drizzle์ ํ์ํ ๋ ๊ณ์ ์์ด์ฃผ๊ณ , ๊ณต๊ฐ์ด ํ์ํ ๋๋ ๋ฐฉํดํ์ง ์๋ ์ข์ ์น๊ตฌ์ ๋๋ค.
๊ฐ๋จํด ๋ณด์ด๊ณ ์ค์ ๋ก๋ ๊ฐ๋จํ๋ฉฐ, ํ๋ก์ ํธ _1000์ผ์ฐจ_์๋ ์ฌ์ ํ ๋ฐ์ด๋ ์ฑ๋ฅ์ ๋ฐํํ๊ณ ,
์ํ๋ ๋ฐฉ์๋๋ก ์์
ํ ์ ์๊ฒ ํด์ฃผ๋ฉฐ, ํ์ํ ๋ ํญ์ ๊ณ์ ์์ต๋๋ค.
๊ด๊ณํ ๋ฐ SQL-like ์ฟผ๋ฆฌ API๋ฅผ ๋ชจ๋ ์ ๊ณตํ๋ ์ ์ผํ ORM์ผ๋ก, ๊ด๊ณํ ๋ฐ์ดํฐ์ ์ ๊ทผํ ๋ ๋ ์ธ๊ณ์ ์ฅ์ ์ ๋ชจ๋ ์ ๊ณตํฉ๋๋ค. Drizzle์ ๊ฐ๋ณ๊ณ , ์ฑ๋ฅ์ด ๋ฐ์ด๋๋ฉฐ, ํ์ ์์ ํ๊ณ , ์ ๋น ๋ถํฌํจ, ๊ธ๋ฃจํ ํ๋ฆฌ, ๋ง์ ์ ์ , ์ ์ฐํ๋ฉฐ ์ค๊ณ์ ์๋ฒ๋ฆฌ์ค ์ง์๋ฉ๋๋ค. Drizzle์ ๋จ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋๋ผ ๊ฒฝํ์ ๋๋ค. ๐คฉ
ํค๋๋ฆฌ์ค ORM?
๋ฌด์๋ณด๋ค๋ Drizzle์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด์ ์ ํ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ๋ณด์ ๋๊ตฌ ๋ชจ์์ ๋๋ค.
ORM์ ๊ฐ์ฒด ๊ด๊ณ ๋งคํ(object relational mapping) ์ ์๋ฏธํ๋ฉฐ, ๊ฐ๋ฐ์๋ค์ Django๋ Spring๊ณผ ๊ฐ์ ๋๊ตฌ๋ฅผ ORM์ด๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ด๊ฒ์ด ๋ ๊ฑฐ์ ๋ช ๋ช ๋ฒ์ ๊ธฐ๋ฐํ ์คํด๋ผ๊ณ ์ง์ฌ์ผ๋ก ๋ฏฟ์ผ๋ฉฐ, ์ด๋ค์ ๋ฐ์ดํฐ ํ๋ ์์ํฌ๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
Drizzle์ ํ๋ก์ ํธ๋ ๊ตฌ์กฐ๋ฅผ ๋ฐฉํดํ์ง ์๊ณ ์ํ๋ ๋ฐฉ์์ผ๋ก ํ๋ก์ ํธ๋ฅผ ๊ตฌ์ถํ ์ ์๊ฒ ํด์ค๋๋ค.
Drizzle์ ์ฌ์ฉํ๋ฉด TypeScript๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ฅผ ์ ์ํ๊ณ ๊ด๋ฆฌํ๋ฉฐ, SQL-like ๋๋ ๊ด๊ณํ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ์ ์ ๊ทผํ๊ณ , ์ ํ์ ๋๊ตฌ๋ฅผ ํ์ฉํ์ฌ ๊ฐ๋ฐ์ ๊ฒฝํ์ ์ต๊ณ ์์ค์ผ๋ก ๋์ด์ฌ๋ฆด ์ ์์ต๋๋ค. ๐คฏ
์ SQL-like์ธ๊ฐ์?
SQL์ ์๋ค๋ฉด Drizzle๋ ์๋ ๊ฒ์ ๋๋ค.
๋ค๋ฅธ ORM๊ณผ ๋ฐ์ดํฐ ํ๋ ์์ํฌ๋ SQL์์ ๋ฒ์ด๋๊ฑฐ๋ ์ถ์ํํ๋ ๊ฒฝํฅ์ด ์์ด, ์ด์ค ํ์ต ๊ณก์ ์ ์ด๋ํฉ๋๋ค: SQL๊ณผ ํ๋ ์์ํฌ์ API๋ฅผ ๋ชจ๋ ์์์ผ ํฉ๋๋ค.
Drizzle์ ๊ทธ ๋ฐ๋์ ๋๋ค. ์ฐ๋ฆฌ๋ SQL์ ๋ฐ์๋ค์ด๊ณ Drizzle์ ํต์ฌ์ ์ผ๋ก SQL-likeํ๊ฒ ๋ง๋ค์๊ธฐ ๋๋ฌธ์, ํ์ต ๊ณก์ ์ด ๊ฑฐ์ ์๊ฑฐ๋ ์ ํ ์์ผ๋ฉฐ SQL์ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ ๊ทผํ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ์น์ํ SQL ์คํค๋ง, ์ฟผ๋ฆฌ, ์๋ ๋ง์ด๊ทธ๋ ์ด์ ๊ทธ๋ฆฌ๊ณ **ํ ๊ฐ์ง ๋**๋ฅผ ์ ๊ณตํฉ๋๋ค. โจ
// ๋ฐ์ดํฐ์ ์ ๊ทผํ๊ธฐ
await db
.select()
.from(countries)
.leftJoin(cities, eq(cities.countryId, countries.id))
.where(eq(countries.id, 10))์ SQL-like๊ฐ ์๋๊ฐ์?
์ฐ๋ฆฌ๋ ํญ์ ์๋ฒฝํ๊ฒ ๊ท ํ ์กํ ์๋ฃจ์ ์ ์ถ๊ตฌํ๊ณ ์์ผ๋ฉฐ, SQL-like๊ฐ 100%์ ์๊ตฌ์ฌํญ์ ์ถฉ์กฑํ์ง๋ง, ๋ ๋์ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฟผ๋ฆฌํ ์ ์๋ ํน์ ํ ์ผ๋ฐ์ ์ธ ์๋๋ฆฌ์ค๊ฐ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ฌ๋ฌ๋ถ์ ์ํด **Queries API**๋ฅผ ๊ตฌ์ถํ์ต๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ์ฅ ํธ๋ฆฌํ๊ณ ์ฑ๋ฅ ์ข์ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ด๊ณํ ์ค์ฒฉ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ผ๋ฉฐ, ์กฐ์ธ๊ณผ ๋ฐ์ดํฐ ๋งคํ์ ๋ํด ์๊ฐํ ํ์๊ฐ ์์ต๋๋ค.
Drizzle์ ํญ์ ์ ํํ 1๊ฐ์ SQL ์ฟผ๋ฆฌ๋ฅผ ์ถ๋ ฅํฉ๋๋ค. ์๋ฒ๋ฆฌ์ค ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํจ๊ป ์์ ๋กญ๊ฒ ์ฌ์ฉํ์๊ณ ์ฑ๋ฅ์ด๋ ์๋ณต ๋น์ฉ์ ๋ํด ๊ฑฑ์ ํ์ง ๋ง์ธ์!
const result = await db.query.users.findMany({
with: {
posts: true
},
});์๋ฒ๋ฆฌ์ค?
๊ฐ์ฅ ์ข์ ๋ถ๋ถ์ ์๋ ๊ฒ์ ๋๋ค. Drizzle์ ์ ํํ 0๊ฐ์ ์์กด์ฑ์ ๊ฐ์ง๋๋ค!

Drizzle ORM์ ๋ฐฉ์ธ๋ณ๋ก ํนํ๋๊ณ , ์ฌ๋ฆผํ๋ฉฐ, ๊ณ ์ฑ๋ฅ์ด๊ณ ์ค๊ณ์ ์๋ฒ๋ฆฌ์ค ์ง์๋ฉ๋๋ค.
์ฐ๋ฆฌ๋ Postgres, MySQL ๋ฑ์ ํฌํจํ ์ต๊ณ ์์ค์ SQL ๋ฐฉ์ธ ์ง์์ ์ ๊ณตํ๊ธฐ ์ํด ๋ง์ ์๊ฐ์ ํฌ์ํ์ต๋๋ค.
Drizzle์ ์ ๊ณ ํ์ค ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋๋ผ์ด๋ฒ๋ฅผ ํตํด ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋ชจ๋ ์ฃผ์ PostgreSQL, MySQL, SQLite ๋๋ SingleStore ๋๋ผ์ด๋ฒ๋ฅผ ์ง์ํ๋ฉฐ, ์ ๋ง ๋น ๋ฅด๊ฒ ์๋ก์ด ๋๋ผ์ด๋ฒ๋ฅผ ์ถ๊ฐํ๊ณ ์์ต๋๋ค.
ํ์ํฉ๋๋ค!
์ ์ ๋ ๋ง์ ํ์ฌ๋ค์ด ํ๋ก๋์ ์์ Drizzle์ ์ฑํํ์ฌ DX์ ์ฑ๋ฅ ๋ชจ๋์์ ์์ฒญ๋ ์ด์ ์ ๊ฒฝํํ๊ณ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ํญ์ ๋์์ ๋๋ฆด ์ค๋น๊ฐ ๋์ด ์์ผ๋ฏ๋ก ์ฃผ์ ํ์ง ๋ง๊ณ ์ฐ๋ฝํ์ธ์. Drizzle ์ฌ์ ์์ ๊ธฐ๊บผ์ด ๋์๋๋ฆฌ๊ฒ ์ต๋๋ค!
์ฐ๋ฆฌ๋ ๋ฐ์ด๋ **Discord ์ปค๋ฎค๋ํฐ**๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ๋ชจ๋ ๋น๋๋ฅผ **Twitter**์์ ํ์ํฉ๋๋ค.
์ด์ Drizzle๊ณผ PostgreSQL, MySQL ๋๋ SQLite ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ๋ฉ์ง ๊ฒ์ ๋ง๋ค์ด ๋ณด์ธ์. ๐
