Skip to main content

서버 성능 개선을 위한 Rust 웹 프레임워크 체험기2

Rocket

Untitled

Purpose

성능이 좋은 C++, C#, C 계열의 언어를 기반으로 한 신규 언어인 Go, Rust 등이 웹 프레임워크를 대체할 수 있도록 성장하고 있다.

새로 생긴 언어인 Go, Rust 둘다 성능이 좋지만 그 중에서도 Rust 가 압도적으로 좋은 것으로 평가되고 있다.

그래서 Rust 를 이용해 웹 프레임워크를 만들어 보면서 이를 추후 개발에 사용할 수 있도록 boilerplate 를 작성해 보려 한다.

Process

  1. Installation

    Rust

    # install
    brew install rustup
    rustup-init
    # verify
    rustc --version

    Actix

    cargo new rocket-web
    cd rocket-web
    # In Cargo.toml file
    [dependencise]
    # if you type it, automatically check library and can use it.
    rocket = {version = "0.5.0-rc.1", features = [ "json" ]}
  2. FileSystem

    1. rust 의 파일 구조는 mod 를 통해 불러오는데 child directory 의 .rs 파일에서 parent directory 내용을 불러오려면 상위에서 mod 를 통해 디렉토리 구조를 정의해줘야 이를 이용할 수 있음.(main.rs)
    2. src/main.rs - actix_web 의 시작으로 서버 셋팅들(port, cors,...)을 등록함.
    3. src/database.rs - database 에서 사용하는 src/database/schema.rs(diesel_cli 를 통해 자동으로 생성된 스키마), src/database/model.rs(스키마를 활용해 백엔드에서 사용하도록 정의된 모델) 에 정의된 내용을 불러오고 데이터베이스에 연결하여 데이터베이스와 서버 간 동작들을 정의한다.
    4. src/routes/user.rs - main.rs 에서 전체 routes 를 정의해도 되지만 코드 복잡도가 높을 걸로 보여 welcome 용 routes 만 설정하고 user CRUD 용도로 나누어 놓은 routes 로서 request path 와 controller 를 연결한다.
    5. src/controllers/_ - request path 에 대한 서버 동작을 정의해 놓은 파일들이 있으며 여기서 각 동작해 대한 type 들을 확인할 수 있다. 이 또한 controllers 내 파일들에 서버 동작 전체를 정의할 수 있지만 각 동작에 대한 정의만 간결히 보기 위해 최대한 간략히 줄이고 실제 동작은 src/services/_ 폴더 내에 정의하도록 함.
    6. src/services:_ - src/controllers/_ 내에 request path 들에 대한 동작들을 정의해 놓았는데 이 때 동작 규모가 커질 것을 대비에 설명하는 폴더 내에 모든 동작들을 분리하여 정의해 두었다.
    7. src/types/* - 서버 동작시의 모든 타입들(request, response, struct, ...)을 정의해 놓는 폴더.
  3. diesel

    # in root directory
    diesel setup
    # write what you want table specification sql in migrations/up.sql
    # write table drop sql in migrations/down.sql
    # define schema file in diesel.toml
    [print_schema]
    file = "src/database/schema.rs"
    # run up.sql
    diesel migration run
    # run down.sql and then up.sql
    diesel migration redo
  4. server run

    # for develop with watch
    cargo watch -x run
    # just run
    cargo run

Conclusion

  1. 처음 rust 의 ownership, 구조체(struct, lifetime, ...)에 대한 이해하기 위한 난이도가 높음.
  2. 단순 로직을 짜는것은 어렵지 않음.
  3. cargo 를 이용한 모듈 관리가 아주 간단하고 유용함.(지금껏 본 모듈 관리중 최고인듯)
  4. 언어의 숙련도가 높아지면 개발 시 아주 빠른 개발이 가능할 걸로 보임.
  5. 어플리케이션의 빌드 시간, 통신 시간, 로직 동작 시간 모두 아주 빠르고 효율적임.