Drizzle ORM

Drizzle ORM์€ ํ—ค๋“œ๊ฐ€ ์žˆ๋Š” ํ—ค๋“œ๋ฆฌ์Šค TypeScript ORM์ž…๋‹ˆ๋‹ค. ๐Ÿฒ

Drizzle์€ ํ•„์š”ํ•  ๋•Œ ๊ณ์— ์žˆ์–ด์ฃผ๊ณ , ๊ณต๊ฐ„์ด ํ•„์š”ํ•  ๋•Œ๋Š” ๋ฐฉํ•ดํ•˜์ง€ ์•Š๋Š” ์ข‹์€ ์นœ๊ตฌ์ž…๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•ด ๋ณด์ด๊ณ  ์‹ค์ œ๋กœ๋„ ๊ฐ„๋‹จํ•˜๋ฉฐ, ํ”„๋กœ์ ํŠธ _1000์ผ์ฐจ_์—๋„ ์—ฌ์ „ํžˆ ๋›ฐ์–ด๋‚œ ์„ฑ๋Šฅ์„ ๋ฐœํœ˜ํ•˜๊ณ ,
์›ํ•˜๋Š” ๋ฐฉ์‹๋Œ€๋กœ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋ฉฐ, ํ•„์š”ํ•  ๋•Œ ํ•ญ์ƒ ๊ณ์— ์žˆ์Šต๋‹ˆ๋‹ค.

๊ด€๊ณ„ํ˜• ๋ฐ SQL-like ์ฟผ๋ฆฌ API๋ฅผ ๋ชจ๋‘ ์ œ๊ณตํ•˜๋Š” ์œ ์ผํ•œ ORM์œผ๋กœ, ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ๋•Œ ๋‘ ์„ธ๊ณ„์˜ ์žฅ์ ์„ ๋ชจ๋‘ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Drizzle์€ ๊ฐ€๋ณ๊ณ , ์„ฑ๋Šฅ์ด ๋›ฐ์–ด๋‚˜๋ฉฐ, ํƒ€์ž… ์•ˆ์ „ํ•˜๊ณ , ์œ ๋‹น ๋ถˆํฌํ•จ, ๊ธ€๋ฃจํ… ํ”„๋ฆฌ, ๋ง‘์€ ์ •์‹ , ์œ ์—ฐํ•˜๋ฉฐ ์„ค๊ณ„์ƒ ์„œ๋ฒ„๋ฆฌ์Šค ์ง€์›๋ฉ๋‹ˆ๋‹ค. Drizzle์€ ๋‹จ์ˆœํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฒฝํ—˜์ž…๋‹ˆ๋‹ค. ๐Ÿคฉ

Drizzle bestofjs

ํ—ค๋“œ๋ฆฌ์Šค ORM?

๋ฌด์—‡๋ณด๋‹ค๋„ Drizzle์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด์ž ์„ ํƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ณด์™„ ๋„๊ตฌ ๋ชจ์Œ์ž…๋‹ˆ๋‹ค.

ORM์€ ๊ฐ์ฒด ๊ด€๊ณ„ ๋งคํ•‘(object relational mapping) ์„ ์˜๋ฏธํ•˜๋ฉฐ, ๊ฐœ๋ฐœ์ž๋“ค์€ Django๋‚˜ Spring๊ณผ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ORM์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์ด ๋ ˆ๊ฑฐ์‹œ ๋ช…๋ช…๋ฒ•์— ๊ธฐ๋ฐ˜ํ•œ ์˜คํ•ด๋ผ๊ณ  ์ง„์‹ฌ์œผ๋กœ ๋ฏฟ์œผ๋ฉฐ, ์ด๋“ค์„ ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์›Œํฌ๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

WARNING

๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋กœ์ ํŠธ๋ฅผ ๊ทธ๊ฒƒ๋“ค์„ ์ค‘์‹ฌ์œผ๋กœ ๊ตฌ์ถ•ํ•ด์•ผ ํ•˜๋ฉฐ ๊ทธ๊ฒƒ๋“ค๊ณผ ํ•จ๊ป˜ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

Drizzle์€ ํ”„๋กœ์ ํŠธ๋‚˜ ๊ตฌ์กฐ๋ฅผ ๋ฐฉํ•ดํ•˜์ง€ ์•Š๊ณ  ์›ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

Drizzle์„ ์‚ฌ์šฉํ•˜๋ฉด TypeScript๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ๋ฅผ ์ •์˜ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋ฉฐ, SQL-like ๋˜๋Š” ๊ด€๊ณ„ํ˜• ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๊ณ , ์„ ํƒ์  ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์„ ์ตœ๊ณ  ์ˆ˜์ค€์œผ๋กœ ๋Œ์–ด์˜ฌ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿคฏ

์™œ SQL-like์ธ๊ฐ€์š”?

SQL์„ ์•ˆ๋‹ค๋ฉด Drizzle๋„ ์•„๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ORM๊ณผ ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” SQL์—์„œ ๋ฒ—์–ด๋‚˜๊ฑฐ๋‚˜ ์ถ”์ƒํ™”ํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์–ด, ์ด์ค‘ ํ•™์Šต ๊ณก์„ ์„ ์ดˆ๋ž˜ํ•ฉ๋‹ˆ๋‹ค: SQL๊ณผ ํ”„๋ ˆ์ž„์›Œํฌ์˜ API๋ฅผ ๋ชจ๋‘ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Drizzle์€ ๊ทธ ๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” SQL์„ ๋ฐ›์•„๋“ค์ด๊ณ  Drizzle์„ ํ•ต์‹ฌ์ ์œผ๋กœ SQL-likeํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ํ•™์Šต ๊ณก์„ ์ด ๊ฑฐ์˜ ์—†๊ฑฐ๋‚˜ ์ „ํ˜€ ์—†์œผ๋ฉฐ SQL์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์นœ์ˆ™ํ•œ SQL ์Šคํ‚ค๋งˆ, ์ฟผ๋ฆฌ, ์ž๋™ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ทธ๋ฆฌ๊ณ  **ํ•œ ๊ฐ€์ง€ ๋”**๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. โœจ

index.ts
schema.ts
migration.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 is slim an Serverless ready

Drizzle ORM์€ ๋ฐฉ์–ธ๋ณ„๋กœ ํŠนํ™”๋˜๊ณ , ์Šฌ๋ฆผํ•˜๋ฉฐ, ๊ณ ์„ฑ๋Šฅ์ด๊ณ  ์„ค๊ณ„์ƒ ์„œ๋ฒ„๋ฆฌ์Šค ์ง€์›๋ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” Postgres, MySQL ๋“ฑ์„ ํฌํ•จํ•œ ์ตœ๊ณ  ์ˆ˜์ค€์˜ SQL ๋ฐฉ์–ธ ์ง€์›์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๋งŽ์€ ์‹œ๊ฐ„์„ ํˆฌ์žํ–ˆ์Šต๋‹ˆ๋‹ค.

Drizzle์€ ์—…๊ณ„ ํ‘œ์ค€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“œ๋ผ์ด๋ฒ„๋ฅผ ํ†ตํ•ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ์ฃผ์š” PostgreSQL, MySQL, SQLite ๋˜๋Š” SingleStore ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์ง€์›ํ•˜๋ฉฐ, ์ •๋ง ๋น ๋ฅด๊ฒŒ ์ƒˆ๋กœ์šด ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!

์ ์  ๋” ๋งŽ์€ ํšŒ์‚ฌ๋“ค์ด ํ”„๋กœ๋•์…˜์—์„œ Drizzle์„ ์ฑ„ํƒํ•˜์—ฌ DX์™€ ์„ฑ๋Šฅ ๋ชจ๋‘์—์„œ ์—„์ฒญ๋‚œ ์ด์ ์„ ๊ฒฝํ—˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ํ•ญ์ƒ ๋„์›€์„ ๋“œ๋ฆด ์ค€๋น„๊ฐ€ ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์ฃผ์ €ํ•˜์ง€ ๋ง๊ณ  ์—ฐ๋ฝํ•˜์„ธ์š”. Drizzle ์—ฌ์ •์—์„œ ๊ธฐ๊บผ์ด ๋„์™€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค!

์šฐ๋ฆฌ๋Š” ๋›ฐ์–ด๋‚œ **Discord ์ปค๋ฎค๋‹ˆํ‹ฐ**๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ๋ชจ๋“  ๋นŒ๋”๋ฅผ **Twitter**์—์„œ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ Drizzle๊ณผ PostgreSQL, MySQL ๋˜๋Š” SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ๋ฉ‹์ง„ ๊ฒƒ์„ ๋งŒ๋“ค์–ด ๋ณด์„ธ์š”. ๐Ÿš€

๋น„๋””์˜ค ์‡ผ์ผ€์ด์Šค