Choose a default theme

You can change your theme from the menu

SQLx

SQLx는 Rust의 비동기 SQL 도구 모음이다. SQL 문을 직접 작성하면서 연결 풀, 매개변수 바인딩과 결과 타입 변환을 사용할 수 있다. ORM처럼 업무 모델을 중심으로 SQL을 숨기기보다는 개발자가 질의 구조를 명시하는 방식에 가깝다.

질의와 타입 검사

일반 query 함수는 실행할 SQL과 값을 받아 질의를 준비한다. query! 계열 매크로는 조건을 갖추면 빌드 시 질의와 타입을 검사할 수 있지만, 모든 동적 SQL이 자동으로 컴파일 시 검사되는 것은 아니다. 매크로를 이용하는 프로젝트는 검사에 필요한 DB나 오프라인 메타데이터를 어떻게 준비할지도 빌드 절차에 포함해야 한다.

장점은 익숙한 SQL을 유지하면서 Rust의 비동기 코드와 연결할 수 있고, 필요한 열과 조인을 직접 통제하기 쉽다는 것이다. 한계는 DB별 SQL 차이와 스키마 변화가 코드에 직접 드러난다는 점이다. SQLx가 여러 DB를 지원해도 특정 DB용 질의를 그대로 다른 DB에 옮길 수 있다고 가정하면 안 된다.

제목으로 책 찾기

다음은 SQLx 0.9의 PostgreSQL 연결 풀을 전달받는 함수 조각이다. postgres 및 사용 런타임 기능을 활성화한 프로젝트와 book(id BIGINT, title TEXT NOT NULL) 테이블이 준비되어 있어야 한다. 실제 연결 주소와 자격 증명은 예제에 포함하지 않는다.

use sqlx::{PgPool, Row};

pub async fn find_books(pool: &PgPool, title: &str)
-> Result<Vec<(i64, String)>, sqlx::Error>
{
let rows = sqlx::query(
"SELECT id, title FROM book WHERE title = $1 ORDER BY id LIMIT 10"
)
.bind(title)
.fetch_all(pool)
.await?;

rows.into_iter()
.map(|row| Ok((row.try_get("id")?, row.try_get("title")?)))
.collect()
}

제목으로 작은 정원의 기록을 전달하면 정확히 같은 제목의 행을 id순으로 최대 10개 반환한다. $1과 bind는 SQL 문법과 입력값을 분리한다. 검색어에 따옴표가 들어가도 질의 문자열을 직접 연결하지 않는다. MySQL의 자리표시자 등은 다르므로 이 조각을 복사할 때 DB 종류를 유지하거나 문법을 바꿔야 한다.

안전한 바인딩의 범위

매개변수는 값에 사용하는 것이며 임의의 테이블 이름이나 정렬 방향을 대신하는 도구가 아니다. 사용자가 정렬 항목을 고르게 한다면 허용한 컬럼 집합을 서버 코드에서 선택해야 한다. 문자열 연결을 안전 표시 래퍼로 감싸는 것만으로 검증되지 않은 SQL이 안전해지지는 않는다.

연결 풀은 요청마다 새로 만들지 않고 애플리케이션 수명에 맞춰 공유한다. 최대 연결 수·획득 대기·트랜잭션 시간을 관리하지 않으면 느린 질의가 전체 요청을 막을 수 있다. 성공한 컴파일이나 바인딩은 적절한 인덱스와 권한 검증을 보장하지 않는다. 결과의 NULL 가능성, 실제 DB 타입과 Rust 타입의 대응, 오류 전달을 함께 검사한다.

참고 자료

웹·서버 애플리케이션 개발 도구 지도

JavaScript 실행과 빌드

Node.js · pnpm · Vite · Nitro

화면 스타일

Tailwind CSS

Rust 개발과 비동기

Rust (프로그래밍 언어) · Cargo · Tokio · Axum

Rust 데이터 접근

SQLx · SeaORM

Java 서버 개발

Java (프로그래밍 언어) · Spring Framework · Spring Boot

네이티브 빌드

CMake · pkg-config

이미지·영상 처리

sharp · FFmpeg · ffprobe