타입 안전한 쿼리 구성
컴파일 시점에 잘못된 열을 거부하는 쿼리를 구축합니다.
타입 안전한 쿼리 구성은(는) CoddyKit의 무료 TypeScript Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 TypeScript Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. TypeScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
존재하지 않는 열을 참조할 수 없는 쿼리
타입 안전 쿼리 빌더는 테이블에 존재하지 않는 열 이름을 컴파일 시점에 거부합니다. 열은 원시 문자열이 아니라 타입이 지정된 객체를 통해 참조합니다.
타입이 지정된 열 참조
테이블을 정의하면 각 열은 테이블 객체의 속성이 됩니다. 필터와 select에는 문자열이 아니라 이러한 속성을 전달합니다.
import { eq } from "drizzle-orm";
// users.id and users.name are typed column objects
const rows = await db
.select()
.from(users)
.where(eq(users.id, 1));알 수 없는 열 = 컴파일 오류
열이 실제 속성이므로 오타를 즉시 잡을 수 있습니다. 문자열 기반 타입 방식에서 빠져나갈 우회 수단이 없습니다.
await db.select().from(users).where(eq(users.idd, 1));
// ^^^^
// Error: Property "idd" does not exist on the users table.타입이 지정된 비교 피연산자
eq 같은 연산자는 열 타입에 대해 제네릭입니다. 숫자 열을 문자열과 비교하면 타입 오류가 발생합니다.
eq(users.age, 30); // ok: age is number
eq(users.age, "thirty"); // Error: string is not assignable to number특정 열 선택
열 참조를 값으로 갖는 객체를 전달하면 일부 열만 결과로 투영할 수 있습니다. 선택한 키가 결과 키가 됩니다.
const partial = await db
.select({ id: users.id, name: users.name })
.from(users);
// result rows: { id: number; name: string }[]다른 테이블의 열 거부
select 맵은 조회 대상 테이블의 열로만 제한됩니다. 서로 관련 없는 테이블의 열을 참조하면 컴파일에 실패합니다.
await db
.select({ title: posts.title }) // posts not in this query
.from(users);
// Error: posts.title is not part of the FROM clause.조합 가능한 조건
조건은 and, or, not과 결합할 수 있습니다. 각 조각은 타입이 유지되므로 트리 안쪽 깊은 곳에서도 잘못된 조건을 잡아냅니다.
import { and, gt, eq } from "drizzle-orm";
const q = db.select().from(users).where(
and(gt(users.age, 18), eq(users.isAdmin, false))
);정렬 및 제한
orderBy도 타입이 지정된 열 참조를 받으므로 테이블에 없는 열로 정렬할 수 없습니다.
import { desc } from "drizzle-orm";
await db.select().from(users).orderBy(desc(users.age)).limit(10);거부가 작동하는 방식
빌더는 테이블 타입에 대해 제네릭입니다. where와 select 시그니처는 Column<TTable> 타입의 값만 허용하므로 컴파일러가 구조적으로 다른 모든 값을 거부합니다.
// Conceptual signature
declare function select<T>(
table: T,
cols: { [k: string]: ColumnOf<T> }
): Query;insert도 타입이 지정됩니다
insert 값도 타입 검사를 받습니다. 누락된 필수 필드나 잘못된 값 타입은 SQL이 실행되기 전에 컴파일 오류가 됩니다.
await db.insert(users).values({
name: "Ada",
isAdmin: false,
// missing fields would error; extra unknown keys error too
});도움이 되는 이유
대부분의 ORM 버그는 이름이 바뀌었거나 잘못 입력된 열을 실행 시점에야 발견하면서 발생합니다. 타입 안전 빌더를 사용하면 배포 훨씬 전에 편집기에서 빨간 물결선으로 표시됩니다.
빠른 확인
타입 안전 쿼리 구성에 대한 이해도를 확인하십시오.
복습
타입 안전 쿼리 구성은 문자열 대신 타입이 지정된 열 참조를 사용합니다. 알 수 없는 열, 잘못된 피연산자 타입, 그리고 FROM 절에 없는 테이블의 열은 모두 컴파일 오류가 됩니다. 빌더는 테이블에 대해 제네릭이므로 타입 시스템이 유효성을 구조적으로 강제합니다.
자주 묻는 질문
“타입 안전한 쿼리 구성” 강의는 무료인가요?
네 — “타입 안전한 쿼리 구성” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 TypeScript Academy 강의 전체를 잠금 해제할 수 있습니다. TypeScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“타입 안전한 쿼리 구성”에서 뭘 배우나요?
컴파일 시점에 잘못된 열을 거부하는 쿼리를 구축합니다. 브라우저에서 직접 실행하는 실습 코드로 TypeScript Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
TypeScript Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 TypeScript Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“타입 안전한 쿼리 구성” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 TypeScript Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 TypeScript Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 스키마에서 타입으로 매핑하기
- 타입 안전한 쿼리 구성
- 쿼리 결과 형태 추론
- 타입을 활용한 관계와 조인