Drizzle ์ฟผ๋ฆฌ + CRUD
- ์คํค๋ง ์ ์ ๋ฐฉ๋ฒ - ์คํค๋ง ๊ธฐ์ด
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๋ฐฉ๋ฒ - ์ฐ๊ฒฐ ๊ธฐ์ด
Drizzle์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฟผ๋ฆฌํ๋ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ฉฐ, ๋ค์ ํ๋ก์ ํธ์์ ์ด๋ค ๊ฒ์ ์ฌ์ฉํ ์ง ๊ฒฐ์ ํ๋ ๊ฒ์ ์ฌ๋ฌ๋ถ์๊ฒ ๋ฌ๋ ค ์์ต๋๋ค. SQL๊ณผ ์ ์ฌํ ๊ตฌ๋ฌธ ๋๋ ๊ด๊ณํ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํ์ธํด๋ณด๊ฒ ์ต๋๋ค:
์ SQL๊ณผ ์ ์ฌํ๊ฐ?
SQL์ ์๋ฉด Drizzle์ ์ ์ ์์ต๋๋ค.
๋ค๋ฅธ ORM๊ณผ ๋ฐ์ดํฐ ํ๋ ์์ํฌ๋ SQL์์ ๋ฒ์ด๋๊ฑฐ๋ ์ถ์ํํ๋ ๊ฒฝํฅ์ด ์์ด ์ด์ค ํ์ต ๊ณก์ ์ด ๋ฐ์ํฉ๋๋ค: SQL๊ณผ ํ๋ ์์ํฌ์ API๋ฅผ ๋ชจ๋ ๋ฐฐ์์ผ ํฉ๋๋ค.
Drizzle์ ์ ๋ฐ๋์ ๋๋ค. ์ฐ๋ฆฌ๋ SQL์ ์์ฉํ๊ณ Drizzle์ ํต์ฌ์ ์ผ๋ก SQL๊ณผ ์ ์ฌํ๊ฒ ๋ง๋ค์๊ธฐ ๋๋ฌธ์ ํ์ต ๊ณก์ ์ด ๊ฑฐ์ ์๊ณ SQL์ ๋ชจ๋ ๊ธฐ๋ฅ์ ์์ ํ ์ ๊ทผํ ์ ์์ต๋๋ค.
// ๋ฐ์ดํฐ์ ์ ๊ทผ
await db
.select()
.from(posts)
.leftJoin(comments, eq(posts.id, comments.post_id))
.where(eq(posts.id, 10))SELECT *
FROM posts
LEFT JOIN comments ON posts.id = comments.post_id
WHERE posts.id = 10SQL๊ณผ ์ ์ฌํ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ฉด ์์ SQL๋ก ํ ์ ์๋ ๋ง์ ์์ ์ ๋ณต์ ํ ์ ์์ผ๋ฉฐ, Drizzle์ด ๋ฌด์์ ํ ๊ฒ์ด๊ณ ์ด๋ค ์ฟผ๋ฆฌ๊ฐ ์์ฑ๋ ์ง ์ ํํ ์ ์ ์์ต๋๋ค. select, insert, update, delete๋ฅผ ํฌํจํ ๊ด๋ฒ์ํ ์ฟผ๋ฆฌ๋ฅผ ์ํํ ์ ์์ผ๋ฉฐ, ๋ณ์นญ, WITH ์ , ํ์ ์ฟผ๋ฆฌ, prepared statement ๋ฑ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ ๋ง์ ์์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค
await db.insert(users).values({ email: 'user@gmail.com' })INSERT INTO users (email) VALUES ('user@gmail.com')์ SQL๊ณผ ์ ์ฌํ์ง ์์๊ฐ?
์ฐ๋ฆฌ๋ ํญ์ ์๋ฒฝํ๊ฒ ๊ท ํ ์กํ ์๋ฃจ์ ์ ์ถ๊ตฌํฉ๋๋ค. SQL๊ณผ ์ ์ฌํ ์ฟผ๋ฆฌ๊ฐ ๋ชจ๋ ์๊ตฌ ์ฌํญ์ 100%๋ฅผ ์ถฉ์กฑํ์ง๋ง, ๋ฐ์ดํฐ๋ฅผ ๋ ํจ์จ์ ์ผ๋ก ์ฟผ๋ฆฌํ ์ ์๋ ํน์ ์ผ๋ฐ์ ์ธ ์๋๋ฆฌ์ค๊ฐ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ์กฐ์ธ์ด๋ ๋ฐ์ดํฐ ๋งคํ์ ๋ํด ๊ฑฑ์ ํ์ง ์๊ณ ๋ ๊ฐ์ฅ ํธ๋ฆฌํ๊ณ ์ฑ๋ฅ์ด ์ฐ์ํ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ด๊ณํ ์ค์ฒฉ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋๋ก Queries API๋ฅผ ๊ตฌ์ถํ์ต๋๋ค.
Drizzle์ ํญ์ ์ ํํ ํ๋์ SQL ์ฟผ๋ฆฌ๋ฅผ ์ถ๋ ฅํฉ๋๋ค. ์๋ฒ๋ฆฌ์ค ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํจ๊ป ์์ ๋กญ๊ฒ ์ฌ์ฉํ๊ณ , ์ฑ๋ฅ์ด๋ ์๋ณต ๋น์ฉ์ ๋ํด ๊ฑฑ์ ํ ํ์๊ฐ ์์ต๋๋ค!
const result = await db.query.users.findMany({
with: {
posts: true
},
});๊ณ ๊ธ
Drizzle์ ์ฌ์ฉํ๋ฉด ์ํ๋ ๋ฐฉ์์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๊ณ ๋ถํ ํ ์ ์์ต๋๋ค. ๋ฉ์ธ ์ฟผ๋ฆฌ์ ๋ ๋ฆฝ์ ์ผ๋ก ํํฐ๋ฅผ ๊ตฌ์ฑํ๊ฑฐ๋, ํ์ ์ฟผ๋ฆฌ๋ ์กฐ๊ฑด๋ฌธ์ ๋ถ๋ฆฌํ๋ ๋ฑ ๋ค์ํ ์์ ์ ์ํํ ์ ์์ต๋๋ค. ๋ช ๊ฐ์ง ๊ณ ๊ธ ์์ ๋ฅผ ํ์ธํด๋ณด๊ฒ ์ต๋๋ค:
WHERE ๋ฌธ์ ๊ตฌ์ฑํ ๋ค์ ์ฟผ๋ฆฌ์์ ์ฌ์ฉ
async function getProductsBy({
name,
category,
maxPrice,
}: {
name?: string;
category?: string;
maxPrice?: string;
}) {
const filters: SQL[] = [];
if (name) filters.push(ilike(products.name, name));
if (category) filters.push(eq(products.category, category));
if (maxPrice) filters.push(lte(products.price, maxPrice));
return db
.select()
.from(products)
.where(and(...filters));
}ํ์ ์ฟผ๋ฆฌ๋ฅผ ๋ค๋ฅธ ๋ณ์๋ก ๋ถ๋ฆฌํ ๋ค์ ๋ฉ์ธ ์ฟผ๋ฆฌ์์ ์ฌ์ฉ
const subquery = db
.select()
.from(internalStaff)
.leftJoin(customUser, eq(internalStaff.userId, customUser.id))
.as('internal_staff');
const mainQuery = await db
.select()
.from(ticket)
.leftJoin(subquery, eq(subquery.internal_staff.userId, ticket.staffId));๋ค์์?
์ฒ์๋ถํฐ ๋๊น์ง