rust ?

agnusdei·2025년 2월 8일

Rust에서 ? 연산자는 에러 전파(Error Propagation)를 수행하는 기능을 합니다.

1. ?의 역할

  • Result<T, E> 또는 Option<T> 타입에서 사용 가능
  • Err가 발생하면 즉시 해당 값을 반환하고 함수 실행을 중단
  • Ok이면 내부 값을 추출하여 계속 실행

2. 코드에서 ?의 동작

.bind((address, port))
.map_err(|err| MainError {
    message: err.to_string(),
})?
  • .bind((address, port))Result<T, E>를 반환
  • map_err(|err| MainError { message: err.to_string() })E 타입의 에러를 MainError로 변환
  • ? → 만약 Err이면 현재 함수에서 즉시 Err(MainError { ... })를 반환
  • Ok이면 내부 값을 꺼내 다음 코드 실행

같은 방식으로 .await 뒤에서도 ?가 사용됩니다.


3. ?을 사용하지 않는 경우

위 코드를 ? 없이 작성하면 매뉴얼로 match를 사용해야 함:

let server = HttpServer::new(move || {
    App::new()
        .app_data(web::Data::new(AppState {
            db: db_connection.clone(),
        }))
        .wrap(Logger::default())
        .configure(routes::home_routes::config)
        .configure(routes::auth_routes::config)
        .configure(routes::user_routes::config)
})
.bind((address, port))
.map_err(|err| MainError {
    message: err.to_string(),
});

let server = match server {
    Ok(s) => s,
    Err(e) => return Err(e), // 에러 발생 시 즉시 반환
};

server.run().await.map_err(|err| MainError {
    message: err.to_string(),
})?;

?를 사용하면 코드가 훨씬 간결해짐!

profile
DevSecOps, Pentest, Cloud(OpenStack), Develop, Data Engineering, AI-Agent

0개의 댓글