Schema 완벽 마스터
Schema의 핵심 개념과 실전 활용법
학습 항목
이미지 로딩 중...
Drizzle ORM 기초부터 심화까지
TypeScript 기반의 경량 ORM인 Drizzle의 기본 개념부터 고급 활용법까지 학습합니다. 데이터베이스 스키마 정의, CRUD 작업, 관계 설정, 트랜잭션 처리 등 실무에 필요한 핵심 기능을 단계별로 익힐 수 있습니다.
들어가며
이 글에서는 Drizzle ORM 기초부터 심화까지에 대해 상세히 알아보겠습니다. 총 12가지 주요 개념을 다루며, 각각의 개념에 대한 설명과 실제 코드 예제를 함께 제공합니다.
목차
- Drizzle_설치와_설정
- 테이블_스키마_정의
- 데이터_삽입하기
- 데이터_조회하기
- 데이터_수정하기
- 데이터_삭제하기
- 관계_정의하기
- 조인_쿼리_실행
- 트랜잭션_처리
- 동적_쿼리_빌딩
- 페이지네이션_구현
- 집계_함수_사용
1. Drizzle_설치와_설정
개요
Drizzle ORM을 프로젝트에 설치하고 데이터베이스 연결을 설정하는 방법입니다.
코드 예제
import { drizzle } from 'drizzle-orm/postgres-js';
import postgres from 'postgres';
const client = postgres('postgresql://localhost:5432/mydb');
const db = drizzle(client);
export default db;
설명
postgres 클라이언트를 생성하고 drizzle로 래핑하여 데이터베이스 연결을 초기화합니다.
2. 테이블_스키마_정의
개요
Drizzle에서 테이블 구조를 정의하는 방법입니다. pgTable을 사용하여 컬럼과 타입을 선언합니다.
코드 예제
import { pgTable, serial, text, integer } from 'drizzle-orm/pg-core';
export const users = pgTable('users', {
id: serial('id').primaryKey(),
name: text('name').notNull(),
age: integer('age'),
email: text('email').unique()
});
설명
users 테이블을 정의하며 id는 자동 증가, name은 필수, email은 중복 불가 속성을 가집니다.
3. 데이터_삽입하기
개요
insert 메서드를 사용하여 새로운 데이터를 테이블에 추가하는 방법입니다.
코드 예제
import db from './db';
import { users } from './schema';
await db.insert(users).values({
name: '김철수',
age: 25,
email: 'kim@example.com'
});
설명
values 메서드에 객체를 전달하여 users 테이블에 새로운 사용자 데이터를 삽입합니다.
4. 데이터_조회하기
개요
select를 사용하여 데이터베이스에서 데이터를 가져오는 기본적인 쿼리 방법입니다.
코드 예제
import db from './db';
import { users } from './schema';
const allUsers = await db.select().from(users);
const userById = await db.select()
.from(users)
.where(eq(users.id, 1));
설명
모든 사용자를 조회하거나 where 조건을 사용하여 특정 조건에 맞는 데이터를 필터링할 수 있습니다.
5. 데이터_수정하기
개요
update 메서드를 사용하여 기존 데이터를 변경하는 방법입니다.
코드 예제
import { eq } from 'drizzle-orm';
import db from './db';
import { users } from './schema';
await db.update(users)
.set({ age: 26 })
.where(eq(users.id, 1));
설명
where 조건으로 대상을 지정하고 set으로 변경할 값을 설정하여 데이터를 업데이트합니다.
6. 데이터_삭제하기
개요
delete 메서드를 사용하여 테이블에서 데이터를 제거하는 방법입니다.
코드 예제
import { eq } from 'drizzle-orm';
import db from './db';
import { users } from './schema';
await db.delete(users)
.where(eq(users.email, 'kim@example.com'));
설명
where 조건에 맞는 레코드를 찾아서 테이블에서 삭제합니다.
7. 관계_정의하기
개요
테이블 간의 관계를 정의하여 조인 쿼리를 쉽게 작성할 수 있습니다.
코드 예제
import { relations } from 'drizzle-orm';
export const usersRelations = relations(users, ({ many }) => ({
posts: many(posts)
}));
export const postsRelations = relations(posts, ({ one }) => ({
author: one(users, { fields: [posts.userId], references: [users.id] })
}));
설명
users와 posts 간의 1:N 관계를 정의하여 관계형 쿼리를 타입 안전하게 작성할 수 있습니다.
8. 조인_쿼리_실행
개요
정의된 관계를 활용하여 여러 테이블을 연결하는 쿼리를 실행합니다.
코드 예제
import db from './db';
import { users } from './schema';
const usersWithPosts = await db.query.users.findMany({
with: {
posts: true
}
});
설명
with 옵션을 사용하여 users와 연관된 posts를 한 번에 가져오는 쿼리를 실행합니다.
9. 트랜잭션_처리
개요
여러 데이터베이스 작업을 하나의 트랜잭션으로 묶어서 원자성을 보장합니다.
코드 예제
await db.transaction(async (tx) => {
await tx.insert(users).values({ name: '이영희', age: 30 });
await tx.insert(posts).values({ userId: 1, title: '첫 글' });
// 에러 발생 시 모두 롤백됨
});
설명
transaction 블록 안의 모든 작업이 성공해야 커밋되고, 하나라도 실패하면 전체가 롤백됩니다.
10. 동적_쿼리_빌딩
개요
조건에 따라 쿼리를 동적으로 구성하는 방법입니다.
코드 예제
import { and, gte, like } from 'drizzle-orm';
const filters = [];
if (minAge) filters.push(gte(users.age, minAge));
if (namePattern) filters.push(like(users.name, `%${namePattern}%`));
const result = await db.select().from(users).where(and(...filters));
설명
조건을 배열로 모아서 and 함수로 결합하면 유연한 검색 기능을 구현할 수 있습니다.
11. 페이지네이션_구현
개요
limit과 offset을 사용하여 대량의 데이터를 페이지 단위로 조회합니다.
코드 예제
const page = 2;
const pageSize = 10;
const paginatedUsers = await db.select()
.from(users)
.limit(pageSize)
.offset((page - 1) * pageSize);
설명
limit으로 한 페이지당 개수를 제한하고 offset으로 시작 위치를 지정하여 페이지네이션을 구현합니다.
12. 집계_함수_사용
개요
count, sum, avg 등의 집계 함수를 사용하여 데이터를 통계적으로 처리합니다.
코드 예제
import { count, avg } from 'drizzle-orm';
const stats = await db.select({
totalUsers: count(),
avgAge: avg(users.age)
}).from(users);
설명
SQL 집계 함수를 사용하여 전체 사용자 수와 평균 나이를 한 번의 쿼리로 계산합니다.
마치며
이번 글에서는 Drizzle ORM 기초부터 심화까지에 대해 알아보았습니다. 총 12가지 개념을 다루었으며, 각각의 사용법과 예제를 살펴보았습니다.
관련 태그
#Drizzle #ORM #Database #Schema #Query