웹 페이지를 만들 때 가장 중요한 건 무엇일까?
당연히 DataBase다.
열심히 찍은 사진 , 공들여 쓴 글이 저장이 되지 않는다면 인스타그램 / 블로그를 하는 사람은 아무도 없을 것이다. ( 데이터베이스가 잘못했다. 아무튼 )
React를 통해 요소를 생성하고 , Rust로 보내 파일을 만들어서 저장하고 불러오는 등의 방식을 통해서 따라해 볼 수는 있다.
누차 말하지만 2022년이니까 바로 database를 공부해 보자.
중구난방식으로 공부하는 걸 좋아하니 혹시나 읽는 사람이 있다면
30번째 글 정도부터 보면 될것이다.. 아마..
DataBase는 말 그대로 data의 모음이다.
표가 어쩌고 열이 어쩌고 행이 어쩌고 하는 내용이 있지만
사실 그런건 굳이 정리하지 않아도 알 수 있다.
바로 실전으로 들어가보자.
우선은 어떤 서버( 데이터베이스 서버 )를 사용할지 정해야 한다.
오라클 , mysql 등등 어디선가 들어본 이름들이 있는데
무료 + 라이센스 문제가 없는 mysql의 포크작인 mariadb를 사용하기로 했다.
https://mariadb.org/download/?t=mariadb&p=mariadb&r=10.6.7&os=windows&cpu=x86_64&pkg=msi&m=yongbok
mysql과 mariadb는 기능이 호환된다고 한다.
따라서 rust의 mysql 라이브러리를 통해 mariadb를 사용해보도록 하자.
https://github.com/launchbadge/sqlx
좀 쓰기쉬운 라이브러리가 있었지만 , 깃허브 star 수가 10배가 넘게 차이가 나서
sqlx를 사용하기로 했다.
use sqlx::mysql::MySqlPoolOptions;
#[actix_web::main]
async fn main() -> Result<(), sqlx::Error> {
let pool = MySqlPoolOptions::new()
.max_connections(5)
.connect("mysql://root:password@localhost/test1").await?;
let row: (String,i32) = sqlx::query_as("SELECT * from newtable")
.fetch_one(&pool).await?;
println!("{} , {}",row.0 , row.1);
Ok(())
}
실행이 잘된다.
아직 query문법에 대해 완벽하게 이해하고 있는건 아니라서 ,
저장 대신 불러오기 먼저 해보려고 한다.
react -> rust 요청 -> db 서버 요청 의 방식으로 만들어보자.
#[get("/detail/{name}")]
async fn detail(req: HttpRequest) -> Result<impl Responder> {
let mut obj = detailObj{
info: "No information".to_string(),
money: 0,
married: "No".to_string(),
};
let pool = MySqlPoolOptions::new()
.max_connections(5)
.connect("mysql://root:kus2010@localhost/test1").await.unwrap();
let user_list:[&str; 5] = ["KSW","ME","YOU","THEM","US"];
let user_name : String = req.match_info().get("name").unwrap().parse().unwrap();
println!("{}",user_name);
let row: (String,i32,String) = sqlx::query_as(format!(r#"SELECT * from info WHERE(name="{user_name}")"#).as_str())
.fetch_one(&pool).await.unwrap();
println!("{}",row.2);
for item in &user_list{
if user_name==item.to_string() {
obj.info = format!("{} is good man" , row.0);
obj.money = row.1;
obj.married = row.2;
break;
}
}
Ok(web::Json(obj))
}
detail/{name}의 요청이 react로부터 들어오면 ,
해당하는 이름의 정보를 db에서 찾아 보여주는 방식이다.
pool을 매번 생성하는 방식이 살짝 마음에 안들지만, 제대로된 페이지를 만들 때 수정해보도록 하자.
정보가 잘 불러와진다.