個人開発:ブックレビューサービス(サーバサイド)
### 概要 * エンジニアが技術書を購入する際にはネットで検索して探してみることも多いと思うが、"Amazonなどでコメント付きのレビュー数が少なく実際にどのような書籍なのか分からない"・"何かいい書籍がないかと思い検索などを行ってみると毎回同じ書籍を紹介している同じようなブログにたどり着く"といった不満を抱えていた。そこで、技術書籍情報の透明化を目指したサービスを開発しようと思い取り組んでいる。 * 本格的な開発を2021/01頃から初めており、04/09現在ではサーバサイド・フロントエンドの開発が概ね完了している状態である。 * 6月中のリリースを目指して、ソースコードの最終的な調整・確認、リリース方法の学習・選定などを行っている。 * サービスのデモ動画は[こちら](https://youtu.be/KaMyk3Qh8qI)からご覧いただけます。 [![](https://img.youtube.com/vi/KaMyk3Qh8qI/0.jpg)](https://www.youtube.com/watch?v=KaMyk3Qh8qI) ### アピールポイント * 個人開発として0から取り組む中で、都度発生する課題やエラーについて情報検索・技術研鑽を通して自身で対応することができた点 * DDD開発を実践するために、具象的な実装だけでなく基底として抽象的な実装についても行った点 * 開発を急ぐ一方でテストケースの拡充やCI環境の整備、Docker環境の整備などリリースを見据えた対応を行うことができた点 ### 開発 #### サーバサイド(Kotlin with Spring Boot) * DDD(ドメイン駆動設計)の設計原則の下で各種設計・実装を行う * DDDの設計を行うにあたり、各種Entity・Value Object・Collectionなどの基底クラスを設計・実装した * ブックレビューサービスを作成するにあたり、どのようなモデルが存在しそれらがどのように関わり合っているのかを実際のコードに落とし込むことを意識した * アプリケーションを開発していく中で、当然ながら当初のモデル設計の過不足が明らかになっていった。その際にはアジャイル的に"修正" -> "テスト" -> "リリース"のサイクルを頻繁に回していくことでそれらのギャップをうまく埋めていきながら開発を継続していくことができた * 現状の実装では一部JPAとの兼ね合いのためにSetなどのKotlin提供の仕組みをそのまま利用している実装箇所があり、リファクタリング対象である * モデルに紐づくAPIの実装 * 設計した各モデルに対してRESTにリソースアクセスが行えるAPIを実装した * KotlinやSpring Bootの機能を利用し、シンプルに設計・実装を行うことを意識した * 現状の実装では後述のユーザ関連APIに一部RESTではなく個別用途のAPIが存在しており、リファクタリング対象である * サインアップ・ログイン機能 * サインアップを行うことで、様々な機能性(書籍へのレビュー投稿・レビューの評価・書籍のブックマークなど)を利用できるサインアップ・ログイン機能を実装した * サービスとしてのリリースを目指していることを踏まえて、実際のユースケースやニーズに沿った機能性についても実装するよう意識し(トークンを利用したパスワードリセット機能・アカウントアイコンの設定機能など) * 現状の実装ではユーザ登録・ログインを実行するAPIがDDDの原則を遵守していない箇所も存在し、リファクタリング対象である * サインアップ時には"アカウント名"・"メールアドレス"・"パスワード"を入力してもらいそのページ上でサインアップが完結する仕様になっている。そうではなく(よく他のサービスでもあるように)入力されたアドレスにフォームを送信し、そこをクリックすることでサインアップ完了とする仕様にするべきか検討している * 書籍検索API機能 * 書籍の検索を行うため、様々な条件で検索を行うことができるAPIの実装を行った * タイトル・著者・書籍説明などに対するキーワード検索だけでなく、カテゴリー・レーティング・価格・出版年など複合的な条件を入力し、その条件にマッチした書籍を検索できるようなAPI * 現状の実装ではAmazonやGoogleと比較してキーワード検索の実用性が低く(書籍情報として登録されているワードのマッチのみで判定)、より直感的・感覚的なキーワード検索を行った場合にもイメージに近い書籍がマッチできるように検索機能の性能を見直す必要がある * レビュー投稿機能 * ログイン済みのアカウントが書籍に対してレビューを投稿できる機能性を実装 * 自身のレビューは編集・削除も可能で、他のアカウントが作成したレビューには"イイね"をつけることもできる * 現状では手が回っていないが、レビューに対してコメントを投稿してスレッドのように対話できる機能性も検討している * セキュリティ関連 * jwtを用いた認証・CORSポリシーの設定などをSpring Securityを用いて実装 * サーバサイドをステートレスにするためにセッションなどではなくjwtを認証・認可に利用することとする * パスワードについてはDB格納前の段階でエンコーディングを行い暗号化する * (アカウント機密情報を除く)リソースに対してのGETリクエストは未認証のユーザからも認めるが、リソースの変更を伴うPOST・PUT・DELETEについては認証を必須とするように設定 * リリースを行うにあたり現状のポリシーが適切がどうかを検討する必要があるため、GCPでのリリース作業フェーズの際に改めてサーバサイド側のセキュリティについても確認を行う必要がある * テストケースの実装 * ユニットテストを中心に、ロジックを網羅するテストケースを作成している * ユニットテストだけでなく、必要に応じてシナリオテストなども作成することでデグレーションリスクを低減することを目指している * githubとcircleCIを連携させることでテストを自動化させ、マージ前には確実にテストが実行されるような仕組みを作っている * リリース時の想定として、GCPのCloud Buildとgithubを連携させることでCIだけではなく安定的なCDを行える環境も用意することを考えている