쿼리 결과 형태 추론
쿼리 빌더가 반환되는 행 타입을 추론하게 합니다.
쿼리 결과 형태 추론은(는) CoddyKit의 무료 TypeScript Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 TypeScript Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. TypeScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
결과 타입은 선택을 따릅니다
훌륭한 쿼리 빌더는 입력을 검증하는 데 그치지 않고, 선택한 열을 바탕으로 각 결과 행의 정확한 형태를 추론합니다. 더 적은 열을 선택하면 결과 타입이 더 좁아집니다.
전체 행 select
프로젝션 없이 select()를 호출하면 전체 행 타입을 반환합니다.
const rows = await db.select().from(users);
// rows: { id: number; name: string; age: number | null; isAdmin: boolean }[]부분 선택으로 타입 좁히기
필요한 열만 투영하면 결과 타입에는 해당 키만 포함됩니다.
const rows = await db
.select({ id: users.id, name: users.name })
.from(users);
// rows: { id: number; name: string }[]
// Accessing rows[0].age is a compile error.결과에서 열 이름 바꾸기
select 객체의 키가 결과 키가 되므로 자유롭게 이름을 바꿀 수 있고 타입에도 새 이름이 반영됩니다.
const rows = await db
.select({ userId: users.id, fullName: users.name })
.from(users);
// rows: { userId: number; fullName: string }[]계산 및 집계된 열
집계 함수는 자체적으로 추론된 타입을 가집니다. count()는 숫자를 반환하고, 별칭 키가 결과에서 그 이름을 지정합니다.
import { count } from "drizzle-orm";
const rows = await db
.select({ total: count() })
.from(users);
// rows: { total: number }[]널 허용 여부도 전달됩니다
널 허용 열을 선택하면 결과에서도 널 허용 여부가 유지됩니다. age를 선택해도 number | null 타입이 유지됩니다.
const rows = await db.select({ age: users.age }).from(users);
// rows: { age: number | null }[]추론이 구성되는 방식
결과 타입은 select 객체에 적용되는 매핑된 타입으로 구성됩니다. 각 값이 열이면 해당 열의 data 타입(및 널 허용 여부)을 읽어 대응하는 키에 반영합니다.
type InferSelect<S> = {
[K in keyof S]: S[K] extends Column<infer D, infer Null>
? Null extends true ? D | null : D
: never;
};단일 행 도우미
일부 빌더는 .get() 또는 [0] 접근을 제공합니다. 요소 타입은 여전히 같은 선택에서 파생되며, 배열에서 요소 하나만 꺼낸 형태입니다.
const one = (await db.select({ id: users.id }).from(users))[0];
// one: { id: number } | undefined조인이 결과 형태를 확장합니다
조인을 사용하면 결과 타입에 조인한 테이블의 키가 추가됩니다. 조인한 테이블 전체에서 일부 열만 선택해도 결과 타입은 정확하게 좁아집니다. (조인은 별도의 강의에서 다룹니다.)
const rows = await db
.select({ name: users.name, title: posts.title })
.from(users)
.innerJoin(posts, eq(posts.authorId, users.id));
// rows: { name: string; title: string }[]좁히기가 중요한 이유
선택한 키만 반환하면 가져오지 않은 열에 실수로 의존하는 일을 막을 수 있습니다. 타입은 실제 SQL을 그대로 반영하므로 과다 조회 및 과소 조회 버그가 편집기에서 드러납니다.
주의: 전체 행을 가져온 뒤 선택하기
전체 행을 가져온 다음 JS에서 키를 수동으로 골라내면 데이터베이스 수준에서 타입을 좁히는 이점을 잃고 네트워크를 통해 불필요한 열까지 전송하게 됩니다. 쿼리 단계에서 좁히는 방식을 우선하십시오.
빠른 확인
추론된 결과 형태에 대한 이해도를 확인하십시오.
복습
결과 타입은 매핑된 타입을 통해 선택 내용에서 계산됩니다. 전체 select는 전체 행을 반환하고, 부분 select는 선택한 키로 좁혀지며, 이름을 바꾸면 결과 키가 변경되고, 널 허용 여부가 전달되며, 집계에는 자체 타입이 부여됩니다. 정적 타입은 작성한 실제 SQL을 항상 그대로 반영합니다.
AI 튜터와 함께 TypeScript을(를) 배우세요 — 무료
브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.
- 코스
- 101
- 레슨
- 352
자주 묻는 질문
“쿼리 결과 형태 추론” 강의는 무료인가요?
네 — “쿼리 결과 형태 추론” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 TypeScript Academy 강의 전체를 잠금 해제할 수 있습니다. TypeScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“쿼리 결과 형태 추론”에서 뭘 배우나요?
쿼리 빌더가 반환되는 행 타입을 추론하게 합니다. 브라우저에서 직접 실행하는 실습 코드로 TypeScript Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
TypeScript Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 TypeScript Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“쿼리 결과 형태 추론” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 TypeScript Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 TypeScript Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 스키마에서 타입으로 매핑하기
- 타입 안전한 쿼리 구성
- 쿼리 결과 형태 추론
- 타입을 활용한 관계와 조인