ページの先頭です

ページ内を移動するためのリンク
本文へ (c)

ここから本文です。

社内コミュニティサイトにいいね機能実装してみた

目次

いいね機能とは?

Facebook、TwitterInstagramLINEを始め現代社会では様々なSNSサービスが提供され日常的に利用されています。日常の何気ない一言を全世界に発信するサービスもあれば、11あるいは複数人で会話をすることに特化したサービスもあります。

そんな様々な使用用途をもつSNSにはある機能が必ずと言っていいほど実装されています。それはいいね機能です。

誰かが投稿したものに対しコメントするほど明確な意見を示したいわけではないが、賛同や共感といった意思を返したいと思った時にお手軽に反応として使うことができる便利な機能です。

今回はNOS社員が社内ウェブアプリケーションにてこのいいね機能を実装してみました。この記事では、いいね機能実装に伴って設計したDB書いたコードについて解説していきます。ご興味のある方はぜひご覧ください。

いいね機能の実装のきっかけ

上記にもある通り今回のいいね機能は社内のウェブアプリケーションに実装しています。

まず簡単な経緯としましては、社内で技術者育成のためのポータルサイトを作成することになり開発対応することになったのがQA投稿機能でした。

そこで質問や回答への注目度や重要性を可視化するためにQA投稿に対し反応をつけられるようにするため、いいね機能を開発することになりました。

そのためこれ以降の解説ではいいねの対象がコミュニティ内に投稿される質問あるいは回答であることを前提に読み進めていただければと思います。

DBの設計

いいね機能の実装では、どの投稿に対して、どれくらいの「いいね」がついているかを保存するために、DBが必要です。

今回はOracle社が開発しているオープンソースのリレーショナルデータベース管理システム(RDBMS)である MySQL いいねの対象である質問や回答を格納するテーブル(以降:トピック格納テーブル)と、「いいねをした際の情報を格納する用のテーブル(以降:いいね格納テーブル)とユーザーの情報が入ったテーブル(以降:ユーザー情報格納テーブル)を用意し、いいね機能の管理をすることにしました。

またテーブルのそれぞれに以下2点の制約をつけました。

  • いいね格納テーブルに格納されるユーザーIDとトピックIDユーザー情報格納テーブル、トピック格納テーブル内に登録されたものしか登録できない。
  • いいね格納テーブルではユーザーIDとトピックIDの組み合わせが同じ情報を重複して登録できない。

こうすることによっていいね格納テーブルに誤ったデータが挿入されるのを防ぎ、ユーザーが何度も同じ対象に対していいねをすることができなくなります。

非同期処理

DBの設計を行ったら、次はコードを書いていきます。

まずは いいねを押す時の一連の動作について考えてみます。

  • いいねを押している状態/押していない状態が可視化されている
  • いいねを押す
  • いいね格納テーブルにユーザの情報といいね対象のidを格納する
  • 画面上に情報が反映される

このように いいねを押すだけでも複数回DBと通信を行う必要があることがわかります。

しかしながらこの処理で書き変わるのは画面全体のほんの一部のみである上にいいねが押されるタイミングはあくまで一投稿に対する反応の時であることが多いです。そのため、「いいね」を押したタイミングで画面全体がリフレッシュされてしまうとユーザビリティが著しく低下してしまいます。

そこで利用するのが非同期処理になります。 非同期処理とは処理を止めることなく別の処理を実行することができる処理のことを言います。

つまり今回の場合だといいねボタンを押した後、特にその処理の完了を待たずに画面を操作したり別のトピックに対して反応をしたりできるようになるということです。

今回のように画面全体をリフレッシュせずに、一部のみを更新したい場合には非同期処理が役に立ちます。

そこで今回は、JavaScriptの非同期通信であるAjaxの機能を使い実装を行いました。 ページにアクセスした時といいねボタンを押した時にそれぞれAjaxを使った通信を行うようにしました。

まずはページアクセス時です。

ページ内のいいねボタンの数だけ非同期通信を行い、ログインしているユーザーがどのトピックにいいねしているかを画面に反映させます。実際には対象トピックのIDをバックエンドサーバーに送りサーバーサイドのプログラムでDBを操作し既に登録されているかどうかをフロントエンドに返しそれを受け取るという処理を行っています。

次にいいねボタンを押した時の処理です。

いいねボタンを押した時にボタンがいいね済みを示すものに切り替わり、いいね数が1件増えるという動作を画面上では行っています。こちらは、上記と同じくトピックのIDをバックエンドサーバー側に送り、サーバーサイドのプログラムがDBへ情報の登録を行った後いいね数を取得しフロントエンド側に返すという処理を行っています。

バックエンドサーバー側でいいねのカウント数を返すような処理を書いているため、返ってきた変数updatedLikeCountの数字を画面上に反映させるコードを書いています。

これらのコードは他の処理から独立して動いている上、処理中に画面全体がリフレッシュされることもありません。そのためユーザーがいいね機能の処理結果を待たずに、継続してサービスを利用することができるようになります。

いいね機能開発に関する説明は以上になります。

まとめ

今回は社内アプリケーションを作る中で、普段何気なく使っている機能を実際に開発してみました。

普段様々なSNSで見ているだけに始めはカウント数を直接テーブルに入れようとしたりボタンを1つだけにして実装しようとしたりしてしまいました。そこで、目に見えていることをそのまま実装するのではなく裏の構造まで考えて実装する必要があることがわかりました。

また、いいね機能を開発して終わりというわけではなく今後は数が多いものをピックアップする機能やユーザー毎にいいねしたものをまとめて表示できる機能等、集めたデータを活用してユーザー側により便利な機能を提供していきたいと考えています。

※本記事の内容は執筆者個人の見解であり、所属する組織の見解を代表するものではありません。

RECOMMEND