[rust+react+MariaDB] 8. DataBase / 1

성욱김·2022년 2월 27일
0

웹 페이지를 만들 때 가장 중요한 건 무엇일까?

당연히 DataBase다.

열심히 찍은 사진 , 공들여 쓴 글이 저장이 되지 않는다면 인스타그램 / 블로그를 하는 사람은 아무도 없을 것이다. ( 데이터베이스가 잘못했다. 아무튼 )

React를 통해 요소를 생성하고 , Rust로 보내 파일을 만들어서 저장하고 불러오는 등의 방식을 통해서 따라해 볼 수는 있다.

누차 말하지만 2022년이니까 바로 database를 공부해 보자.

중구난방식으로 공부하는 걸 좋아하니 혹시나 읽는 사람이 있다면
30번째 글 정도부터 보면 될것이다.. 아마..

1. DataBase

DataBase는 말 그대로 data의 모음이다.

표가 어쩌고 열이 어쩌고 행이 어쩌고 하는 내용이 있지만
사실 그런건 굳이 정리하지 않아도 알 수 있다.

바로 실전으로 들어가보자.

1.1 종류는?

우선은 어떤 서버( 데이터베이스 서버 )를 사용할지 정해야 한다.

오라클 , mysql 등등 어디선가 들어본 이름들이 있는데

무료 + 라이센스 문제가 없는 mysql의 포크작인 mariadb를 사용하기로 했다.

https://mariadb.org/download/?t=mariadb&p=mariadb&r=10.6.7&os=windows&cpu=x86_64&pkg=msi&m=yongbok

1.2 Rust 라이브러리

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(())
}


실행이 잘된다.

1.3 실전

아직 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을 매번 생성하는 방식이 살짝 마음에 안들지만, 제대로된 페이지를 만들 때 수정해보도록 하자.


정보가 잘 불러와진다.

0개의 댓글