0Pricing
Learn Rust Coding · 강의

컴파일 시 검증되는 쿼리

타입 안전 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 prepare

query_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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 데이터베이스 연결하기
  2. 컴파일 시 검증되는 쿼리
  3. CRUD 연산
  4. 마이그레이션
← Learn Rust Coding(으)로 돌아가기