컴파일 시 검증되는 쿼리
타입 안전 SQL
컴파일 시 검증되는 쿼리은(는) CoddyKit의 무료 Learn Rust Coding 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Learn Rust Coding 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Learn Rust Coding 강의에는 총 4개의 강의가 포함되어 있습니다.
핵심 기능
sqlx는 실제 데이터베이스 스키마를 기준으로 SQL을 컴파일 시점에 검증할 수 있습니다. 오타, 잘못된 열 이름, 타입 불일치가 빌드 오류가 됩니다.
query!계열 매크로를 사용합니다- 실행 전에 버그를 발견합니다
query!와 query 비교
query() 함수는 실행 시 검사됩니다. query! 매크로는 빌드 중 데이터베이스에 연결하여 컴파일 시점에 검사됩니다.
use sqlx::{Pool, Postgres};
async fn run(pool: &Pool<Postgres>) {
let rec = sqlx::query!("SELECT id, name FROM users WHERE id = $1", 1i32)
.fetch_one(pool)
.await
.unwrap();
}타입이 지정된 결과 필드
query! 매크로는 선택한 열과 일치하는 필드를 가진 이름 없는 구조체를 생성하며, 스키마에서 올바른 Rust 타입을 추론합니다.
use sqlx::{Pool, Postgres};
async fn name_of(pool: &Pool<Postgres>, id: i32) -> String {
let rec = sqlx::query!("SELECT name FROM users WHERE id = $1", id)
.fetch_one(pool)
.await
.unwrap();
rec.name
}검사는 어떻게 작동하나요?
빌드할 때 sqlx에는 실행 중인 DATABASE_URL 또는 캐시된 .sqlx 디렉터리가 필요합니다. 쿼리를 DB로 보내 매개변수와 결과의 타입을 확인합니다.
cargo sqlx prepare를 사용한 오프라인 모드
데이터베이스 없이 CI를 실행하려면 cargo sqlx prepare를 실행하여 쿼리 메타데이터를 .sqlx/에 저장합니다. 이후 빌드는 캐시를 사용합니다.
cargo sqlx preparequery_as!로 구조체에 넣기
query_as!를 사용하면 행을 직접 정의한 구조체로 매핑하면서도 모든 검사를 적용할 수 있습니다.
use sqlx::{Pool, Postgres};
struct User { id: i32, name: String }
async fn get(pool: &Pool<Postgres>) -> User {
sqlx::query_as!(User, "SELECT id, name FROM users WHERE id = $1", 1i32)
.fetch_one(pool)
.await
.unwrap()
}널 허용 열은 Option이 됩니다
열에 NULL이 들어갈 수 있으면 sqlx는 해당 필드를 Option으로 만듭니다. name as "name!" 같은 타입 주석으로 추론을 재정의할 수 있습니다.
use sqlx::{Pool, Postgres};
async fn maybe_email(pool: &Pool<Postgres>) -> Option<String> {
let rec = sqlx::query!("SELECT email FROM users WHERE id = $1", 1i32)
.fetch_one(pool)
.await
.unwrap();
rec.email
}타입 추론 모델링하기
컴파일 시 검사는 SQL 타입을 Rust 타입에 매핑합니다. 이 실행 가능한 예제는 그 매핑 결정을 모델링합니다.
fn rust_type(sql: &str, nullable: bool) -> String {
let base = match sql {
"int4" => "i32",
"text" => "String",
"bool" => "bool",
_ => "unknown",
};
if nullable { format!("Option<{}>", base) } else { base.to_string() }
}
fn main() {
println!("{}", rust_type("int4", false));
println!("{}", rust_type("text", true));
}확인하게 될 컴파일 오류
존재하지 않는 열을 참조하면 sqlx는 명확한 메시지와 함께 빌드에 실패합니다. 이러한 안전성이 바로 매크로를 사용하는 이유입니다.
- 잘못된 열 이름 → 컴파일 시 오류
- 타입 불일치 → 컴파일 시 오류
바인딩 매개변수는 위치를 사용합니다
Postgres에서는 $1, $2 자리 표시자를 사용합니다. sqlx는 바인딩된 각 인수의 타입을 스키마와 비교하여 검사합니다.
use sqlx::{Pool, Postgres};
async fn search(pool: &Pool<Postgres>, name: &str, min_age: i32) {
let _ = sqlx::query!(
"SELECT id FROM users WHERE name = $1 AND age >= $2",
name, min_age
).fetch_all(pool).await.unwrap();
}매크로가 아닌 형식은 언제 사용하나요?
실행 시점에 동적으로 만드는 SQL처럼 열을 미리 알 수 없는 경우에는 query() / query_as()를 사용합니다. 유연성을 얻는 대신 컴파일 시 검사를 포기하게 됩니다.
use sqlx::{Pool, Postgres};
async fn dynamic(pool: &Pool<Postgres>, sql: &str) {
let _ = sqlx::query(sql).execute(pool).await.unwrap();
}빠른 확인
컴파일 시 검사에 대한 이해도를 확인해 보세요.
복습
컴파일 시 검사되는 쿼리를 배웠습니다:
query!와query_as!는 빌드 시 스키마를 기준으로 SQL을 검증합니다- 결과 필드와 타입은 자동으로 추론됩니다
- 널 허용 열은
Option이 됩니다 cargo sqlx prepare는 오프라인 빌드를 가능하게 합니다- 동적 SQL에는 매크로가 아닌
query()를 사용합니다
다음 주제: CRUD 작업입니다.
자주 묻는 질문
“컴파일 시 검증되는 쿼리” 강의는 무료인가요?
네 — “컴파일 시 검증되는 쿼리” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Learn Rust Coding 강의 전체를 잠금 해제할 수 있습니다. Learn Rust Coding 강의에는 총 4개의 강의가 포함되어 있습니다.
“컴파일 시 검증되는 쿼리”에서 뭘 배우나요?
타입 안전 SQL 브라우저에서 직접 실행하는 실습 코드로 Learn Rust Coding을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Learn Rust Coding을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Learn Rust Coding은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“컴파일 시 검증되는 쿼리” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Learn Rust Coding 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Learn Rust Coding 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 데이터베이스 연결하기
- 컴파일 시 검증되는 쿼리
- CRUD 연산
- 마이그레이션