Rust에서 ? 연산자는 에러 전파(Error Propagation)를 수행하는 기능을 합니다.
?의 역할Result<T, E> 또는 Option<T> 타입에서 사용 가능 Err가 발생하면 즉시 해당 값을 반환하고 함수 실행을 중단 Ok이면 내부 값을 추출하여 계속 실행 ?의 동작.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 뒤에서도 ?가 사용됩니다.
?을 사용하지 않는 경우위 코드를 ? 없이 작성하면 매뉴얼로 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(),
})?;
➡ ?를 사용하면 코드가 훨씬 간결해짐!