ベンチャーではRubyでWEBアプリを構築することが多いと思います。
バックエンドのフレームワークのひとつにRuby on Railsがあります。
はじめに
Ruby on Rails開発のスキルセットには何が必要だろう?!そんな疑問にお答えするべく、今回は、Ruby on Rails開発についてご紹介します。
Rails5からはAPIモードを構築できるようになり、最近ではフロントエンドとバックエンドを分けてスキルを集約して取り組むようになりました。
Ruby on Railsは設定より規約を重視する思想が色濃く反映されたフレームワークです。10人以下の少人数開発など少数精鋭で、システム全体を把握しながら開発を楽しめる傾向から、日本で愛されている言語・フレームワークです。
Ruby on Railsでのバックエンド開発では、Ruby50%、RSpec45%、Swagger5%と考えると想像し易いかもしれません。
今回は当社で取り組んでいる、Ruby on Rails開発におけるスキル習得を中心にご紹介します。
ベーシックスキル
開発手法
Ruby on Railsには、HTMLテンプレートを用いてサーバーサイドでのレンダリングを行うようなフルスタック開発と、Vue.jsやReact.jsとJSON通信するAPIモード開発があります。
ビュー(View)では、マークアップ言語内にRubyのコードを埋め込むERBテンプレートエンジン、あるいはHamlやSlimなどのテンプレートエンジンを使います。
モデル(Model)では、マイクロサービス向きのActiveRecord寄りとする開発手法と、大規模アプリ向きのAmazon Auroraを用いたRDBMS寄りとする開発手法があります。
コントローラー(Controller)では、フォームに関するデータを更新したりするためのアクションを記述します。
ビュー(View)
jQuery
Rails4ではjquery-ujsでのjQueryに依存したビュー開発でしたが、Rails5ではrails-ujsでのjQueryに非依存のビュー開発になりました。Vue.jsやReact.jsと組み合わせるプロジェクトが増えてきています。
ページネーション
Gem「kaminari」をインストールすると、モデルのアクションに対するページネーション機能を追加できます。これにより、ビューにページネーションを表示する機能開発を行えます。
モデル(Model)
ActiveRecord
Ruby on Railsでのデータベース操作は、ActiveRecordを用いることで、SQLを意識することなくデータアクセスするプログラムを扱うことができます。
マイグレーションファイルにはテーブルの追加・削除するためのコードを実装でき、ActiveRecordのメソッドを実行することでデータベースの変更を指示することができます。
テーブル間のリレーションシップは、モデルの関連付けとなるアソシエーションを、belongs_to、has_many(1:n)、has_one(1:1)、has_many through(n:m)にて定義します。これにより複数のテーブルにまたがるデータ操作をActiveRecordで扱うことができます。
ActiveRecordではバリデーションを定義することができ、データベースに反映される前に適切であるかを検証するバリデーションを開発できます。保存時・更新時・削除時に呼び出されるコールバックを開発することができます。
コントローラ(Controller)
ルーティング
CRUD(読み込み、書き込み、更新、削除)機能のルーティングを「config/routes.rb」に定義し、コントローラーのアクションのメソッドに割り当てます。
REST設計
REST設計にて、GET、POST、PUT、PATCH、DELETEを基本としたURIを構築します。
API-JSON形式
APIからはJSON形式でデータを返却します。データベースから取得したデータを、renderメソッドを使ってJSON形式で利用者へ結果を返すAPIをコントローラに開発します。
デバッグ
VSCode
VScode環境のデバッグでは、REPLにてデバッグします。
REPLとしては、主流だった「pry-rails」、最近は「pry-byebug」でデバッグします。
具体的にはGemをインストールし、Railsを実行した際にbinding.pryに到達したら画面を停止させてデバッグします。このbiding.pryがRuby on Railsのデバッグで最も重要と感じております。
RubyMine
JetBrains社の有償RubyMine環境のデバッグでは、biding.pryを追記しなくとも調べたい箇所にブレークポイントを置いてデバッグすることができます。
RSpec
単体テスト(Unit Test)
RSpecにて、単体テスト(Unit Test)をコーディングできます。
単体テストでは「ModelSpec」を使用します。関数が想定通りに動作しているかどうかを検証します。モデル/共通メソッド/コントローラの開発では自動テストを導入します。リモートレポジトリにソースコードがプッシュされた段階で単体テストを自動で実行します。
統合テスト(E2E Test)
RSpecにて、統合テスト(E2E Test)をコーディングできます。
統合テストでは「RequestSpec」を使用します。HTTPリクエストを発行してレスポンスの内容が想定通りかどうかを検証します。ブラウザテストでは自動テストが導入します。リモートレポジトリにソースコードがプッシュされた段階で統合テストを自動で実行します。
テストデータ
テストデータの作り方としてFactoryBotにてサンプルユーザーをつくることが一般的です。単体テストや統合テストだけでなく、総合テストのような全機能テストを行う際にも、テストデータをFactoryBotでつくりテストします。
チーム開発
チーム開発では、ソース管理にGitを用います。
GitFlowの場合には、いきなりmasterブランチにマージするのではなく、タグやブランチをきってdevelopブランチなどで開発してレビュー承認後にmasterブランチにマージするワークフローにて開発します。
GitHubFlowの場合には、Issueにて要件・設計を定義します。開発したソースはリモートレポジトリへのプルリクエストにてレビュー依頼を行います。
ミドルスキル
Linux
Linuxサーバーとの接続/参照/ログなどで、CUIでのターミナルコマンドを扱います。
(vi, ssh, ssh-keygen, grep, awk, sed, curl, tail, head, less, find, xargs)
Swagger
Swagger は RESTful APIを構築するためのオープンソースのフレームワークです。多くのプロジェクトではYAML形式で記述しますがJson形式でも記述できます。
SQL
データベース操作におけるトランザクション管理では、ActiveRecordだけに頼らず、SQLにてトランザクション管理します。トランザクション管理することで、処理時にエラーがあればロールバックさせることができます。他のインスタンスから更新されないようテーブルに行ロックをかけ、処理が成功すればコミット、処理が失敗すればロールバックするというのがトランザクション管理の基本です。
VirtualBox
開発環境はVirtualBoxかDocker上の仮想環境で開発します。テスト完了後のソースは、いきなりAWSなどの本番環境にデプロイするのではなく、検証環境やステージング環境(本番に近い環境でシステムの動作確認をする環境)で動作確認し、環境依存での不具合リスクを最小化してから本番環境にリリースします。
Docker
開発環境はVirtualBoxかDocker上の仮想環境で開発します。プロジェクトやアプリケーション毎にMySQL等のバージョンを合わせて自動テストを準備する必要があるのは工数を伴ってしまいます。環境構築をスムースに構築できるように各環境にはあらかじめDockerを導入して開発することで効率化します。チーム開発では複数コンテナを開発しますが、基本はWeb-AP-DBの3層Webアプリケーションです。
CI/CD
少人数開発では、DevOpsエンジニアがCICDの構築にも携わります。CI(継続的インテグレーション)では、ソースコードがリモートリポジトリにプッシュされた際に毎回ビルドとテストが実行されて自動検証します。CD(継続的デリバリー)では、CIによるアプリケーションのビルドとテストが成功した後にデプロイ(実際にアプリケーションが実行される環境へのリリース)まで実行します。近年はGitHub ActionsでのCI/CDが人気です。
バックグランドジョブ
バッチ処理はSidekiqで開発します。バックグラウンドで非同期にジョブを実行する Gem を扱えるとハイスキルの領域になります。メール送信・画像変換・CSVアップロードによる大量SQL実行など、非同期処理による機能構築ができる点がバックエンドの価値創造に繋がります。
まとめ
Ruby on Railsは2~3年ごとにメジャーバージョンアップがされていて、現在ではRails7が公開されています。便利なGemの登場もあり、開発に集中できるところがRuby on Railsの魅力です。Railsには思想があるため、合う/合わないということが人に依りあるかもしれません。少人数チームにおいて開発スピードがあるという観点を考えると、WEB業界で最初に取り組む言語として日本で有力と言えそうです。
グロシードでは顧客要件を実現するRuby on Rails開発に取り組んでおります。
フルスタックRuby on Rails開発をはじめ、Vue.jsやReact.jsと組み合わせたRuby on RailsでのAPI開発に注力しております。
バックエンドエンジニア募集中でございます。こちらも見ていただけましたら幸いです。
Comments