革命のブログ

フレボワークスの社員がブログを通じて情報発信します。

- 年末年始休業のお知らせ -

当社は、誠に勝手ながら、2023年12月30日(土)~2024年1月4日(木)まで、年末年始休業とさせていただきます。
ご不便をおかけしますが、何卒、ご理解頂きますようお願い致します。

来年も、皆様のご多幸を、お祈り申し上げます。

 

結局、JPAがいいという話

どうも、小野です。

今回は数あるORマッパーの中で個人的に、今までで一番使ってきたであろうJPA(Java Persistence API)の特徴、そしてメリット、デメリットについてご紹介します。 本記事ではJPAの詳しい使い方は説明しません。

JPAとは

Java標準技術の1つ(JSR338: Java Persistence API)です。

JPAは仕様、つまりインターフェースのみ定義されており、実装自体は「Hibernate」や「EclipseLink」などを利用することになります。 HibernateとEclipseLinkはJPAの仕様に従って実装はされていますが、それぞれ独自実装もあったりするので、どちらがいいかは公式リファレンスを参照したり、実際に使ってみることをお勧めします。

JPAの特徴

SQLを意識せずに、Javaオブジェクトでデータを操作することが可能です。もちろん、全てJavaオブジェクトで完結することはなく、SQLを書くことはあります。 JPAでDB操作する際にはいくつか方法があります。

  • SQL
  • JPQL
  • Criteria API

SQL

今まで使ってきたSQLです。これは説明する必要がありませんね。SQLは、Javaクラス内にも書けるし、外部ファイル(xml)にも書けるので、プロジェクトのルールに従って柔軟に対応が可能です。

JPQL

SQLに似ているJPA独自の言語です。 例えば、以下のようなSQLがあったとします。

SELECT u.id, u.name,u.email FROM user u

JPQLで表現するにはデータをマッピングするクラスが必要になります。

@Entity
public class User {
    private String id;
    private String name;
    private String email;
}

@Entityはマッピングする際に最低限必要です。 JPQLで表現すると以下のようになります。

SELECT u FROM User u

FROM句で指定されているのはテーブル名ではなく、クラス名になります。SELECT句にはクラス名のエイリアスを指定すると、全カラムを取得するようになります。もし取得する列を指定したい場合は、SQLの時と同じ形で指定します。

SELECT u.name FROM User u

別にSQLで書けるならJPQL覚える必要ないと思いますが、テーブル結合のマッピングなど実現が難しいことがあるため習得は必須です。

Criteria API

JavaプログラムでSQLを構築、実行するためのAPIです。

JPQL同様にCriteria APIを使って書いてみます。Userクラスはそのまま利用します。

// entityManagerは予めインスタンスを生成しておく必要がありますが、ここでは割愛します。
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<User> query = builder.createQuery(User.class);
Root<User> root = query.from(User.class);
List<User> users = entityManager.createQuery(query.select(root)).getResultList();

Criteria APIのメリットはタイプセーフであることです。SQL、JPQLはタイプミスしていてもコンパイルエラーにはなりませんが、Criteria APIの場合、実装時にエラーを検知することが可能です。 あとは、動的SQLを書く際に利用することが多いです。MybatisのようにSQL内に制御構文を書けないので、SQLやJPQLで書く際はプログラム内で文字列結合や制御構文を駆使する必要が出てきます。

メリット

実装の削減

SQLやマッピングの実装を極力なくすことにより、生産性向上やバグを減らすことが期待できます。 INSERT、UPADTE、DELETEはほぼ書く必要がなく、EntityManagerとエンティティクラスでの操作が可能です。

INSERT

User user = new User();
user.setId("1");
user.setName("太郎")
user.setEmail("taro@abc.com");

entityManager.persist(user);

UPADTE

User user = entityManager.find(User.class, "1");
user.setName("次郎")
user.setEmail("jiro@abc.com");

DELETE

User user = entityManager.find(User.class, "1");
entityManager.remove(user);

※前提としてトランザクション内での操作になります。

デメリット

複雑なSQLへの対応

複雑なSQLを書く場合にひと手間が必要になることがあります。 JPQLやCriteria APIで書こうとすると、実現が難しいかできても可読性が悪いコードになってしまいがちです。そのため、チューニングが必要なものは生のSQLで書く必要があります。 ただし、生のSQLの場合、N対1や1対Nなどのテーブル結合のマッピングができないので、自分でマッピング処理を実装することになります。

実装の流れとしては、 SQLの実行結果を保持するクラスを用意し、データ取得後、各テーブルに対応したクラスへマッピングを行います。

実行SQLがブラックボックス

特にJPQLやCriteria APIを利用する場合、頭の中でこんなSQLが実行されるだろうなと思っていても実際は全く違うSQLが実行されていることも少なくありません。想定外のSQL実行を回避するために開発時は実行されたSQLをログに出力するようにしてください。上記でも触れた1対Nのテーブル結合のあるクエリを実行した際に、N+1問題にぶつかることがあります。それによりシステムのパフォーマンスが落ちたり、最悪の場合停止することも考えられます。

N+1問題については、以下のサイトを参考にしてください。

qiita.com

さいごに

JPAは学習コストが高いと言われています。実際使ってみた私からみてもやはりそのように感じます。それも当然です。書き方が3つもあり、実際に実行されるSQLを意識してないと痛い目見ますので。正直、CriteriaAPIだけ覚えればJPQLは覚えなくても問題ありません。基本的にJPQLにできてCriteriaAPIにできないことはないです。

個人的には3パターンの実装手段があることで、ケースに応じて使い分けることができるのがメリットかなと思います。

この記事が選定時のネタとして参考になれば幸いです。

ビデオ会議の記録に『tl;dv』を使ってみた

どうも、小野です。

最近、ビデオ会議に使える便利なツールを見つけたので紹介します。

そのツールは『tl;dv』というものです。以下、公式サイトです。

tldv.io

簡単に説明すると以下のような特徴があります。

  • GoogleMeet、Zoomによるビデオ会議の録画ができる。録画した動画の再生も可能
  • 作成された動画に対して、主要トピックを抜き出し時間指定リンクを自動作成。
  • 全ての発言内容を発言者ごとにテキストとして記録
  • 完全無料で利用可能

上記にもある通り、現在はGoogleMeetとZOOMにしか対応していないので、Teamsなど他のアプリで利用できません。

実際に画像を見せた方がどのくらい便利なのかわかると思います。

※実際に仕事で録画したものなので、中身はぼかしてます。

トップ画面

動画を選択後の画面

次に利用手順を説明してきます。(今回はGoogle Meetを前提にしています)

(1)tl;dvのサイトでサインアップを行ってください。

(2)以下のChrome拡張機能をインストールします。 chrome.google.com

(3)Google Meetを開始し、録画を開始します。

(4)録画を終了し、Google Meetを終了します。

準備から録画するまでの手順は以上になります。

今回は情報漏洩等を避けるためにぼかし箇所が多くわかりづらかったかもしれません。 無料で利用可能なので試しに使ってみてください。

ChatGPTに開発をお願いしてみました

今、話題沸騰中の「ChatGPT」をご存知でしょうか?

openai.com

一応、知らない方のために簡単に説明させていただきます。

普段LINEを利用している方はほとんどだと思いますが、公式LINE等で質問すると自動で返答する機能を利用したことがあると思います。 これは通称ボットと呼ばれるもので、予め想定される質問に対する回答が用意されています。 そのため、想定外の質問に対しては、「わかりません」となるわけです。

一方、ChatGPTもボットと同様に質問をすると、自動で返答してくれるわけですが、回答内容はすべてAIがWeb上にあらゆるコンテンツを解析し返してくれます。 つまり、ボットは人が回答内容を用意していたのに対し、ChatGPTはAIが行ってくれています。

結局何が違うのと思われている方もいると思うので、実際に使ってみます。

緑のアイコンがChatGPTによる回答です。

的を得た回答も凄いのですが、さらに注目すべきなのは、1度目の回答が途中で切れたあとに 私のほうで続きをお願いしたら、2度目の前回の回答の続きから回答してくれているところです。

そこで思いつきました。

もしかしたら、開発もお願いできるのではと。。。

実際に試してみました。

今回作成していただくのは、JavaとSpringBootを使ったTODOアプリです。

ChatGPTに「Java、SpringBootを使って、TODOアプリの開発をお願いします。」とお願いをした結果がこちらです。

最初の質問に対する回答としては具体的なコードではなく、開発環境の構築手順やアプリの仕様についてでした。 2回目の質問でタスク追加のコードもお願いしたところ、実際のコードが出てきました。

今まではGoogle先生にお願いして、検索結果から欲しい情報を探してっていう手順が必要でしたが、 これからはChatGPTが情報を見つけてきてくれるわけです。

ちなみにChatGPTはOpenAIという会社が開発しています。しかもマイクロソフトがOpenAIに出資しパートナーシップを組んでいることから、 マイクロソフト製品にChatGPTのようなAIの強化が期待できます。

確かに便利だし、効率もよくなるのは目に見えてますが、一方で人間の考える力や調べる力が衰えて、 AIが支配する世界(シンギュラリティ)が近い将来訪れるのではないかと危惧しています。

【重要】適格請求書発行事業者登録番号のお知らせ

フレボワークス株式会社は、2023年10月より施行される適格請求書等保存方式(通称:インボイス制度)について、適格請求書発行事業者の登録申請を完了しました。

当社の適格請求書発行事業者登録番号は下記となります。

T2013301039142

登録年月日:令和5年10月1日

上記の登録番号は国税庁の適格請求書発行事業者公表サイトでもご確認いただけます。

www.invoice-kohyo.nta.go.jp

簡単3ステップで完了!効率的なWebAPI仕様書作成を導入する方法

はじめに

どうも小野です。WebAPI仕様書の作成はどのようにしていますか?今回紹介するツール等がない時代はExcelを当たり前のように使っていたかもしれません。 Excelの場合、ファイルのバージョン管理に苦労することが多いため、効率がいいとは言えません。 そこで、今回はタイトルにもある通り、簡単3ステップでWebAPI仕様書を作成する方法をご紹介します。

前提

  • Githubアカウントを登録済みであること
  • Netlifyアカウントを登録済みであること
  • Node.jsがインストールされていること

ステップ1 Githubセットアップ

リポジトリを新規作成します。

ステップ2 Netlifyセットアップ

Netlifyは静的サイトを公開できるホスティングサービスです。

ここでは公開するサイトを新規作成します。

ステップ3 仕様書作成

ステップ1で作成したリポジトリからソースをダウンロードし、初期設定を行います。

git clone git@github.com:frevo-works/apisample.git
cd apisample
npm init
npm i redoc-cli

redoc-cli は作成した YAML を HTML に変換してくれるツールで、Netlifyで公開するために必要です。 redocly.com

package.json を編集します。

// (省略)
"scripts": {
  "build": "redoc-cli bundle swagger.yml -o dist/index.html", // 追加
  "test": "echo \"Error: no test specified\" && exit 1"
},
// (省略)

swagger.yml を作成します。

openapi: "3.0.2"
info:
  title: SampleAPI
  version: "1.0"
paths:
  /users:
    get:
      description: ユーザ一覧取得
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: number
                          description: ユーザID
                        name:
                          type: string
                          description: 氏名
                        email:
                          type: string
                          description: メールアドレス

以下のコマンドを実行して、仕様書を出力してみます。

npm run build

ビルドが完了すると、dist フォルダに index.html が出力されているのでブラウザで開きます。

正しく表示されたら、リモートリポジトリにプッシュします。

git add -A
git commit -m "first commit"
git push origin main

動作確認

Netlify を開き、以下のような状態になったら、表示されている URL をクリックします。すると、作成された API 仕様書が確認できます。

もし、閲覧制御等で API 仕様書のページに Basic 認証をかけたい場合、Netlify の有料プランに加入すると利用可能になります。

www.netlify.com

おまけ

効率よくYAMLファイルを編集する方法として2つご紹介します。

リアルタイムに確認する方法

編集中の内容をリアルタイムで確認できる方法として、Swagger Editor と、VSCode+Swagger のプラグインを利用する方法があります。 Swagger Editor は以下の リンク から起動することができます。

editor.swagger.io

ただし、編集はブラウザ上で行うので、編集後はローカルのファイルに上書きする必要があります。 ローカルで Editor を起動する Docker もあるようですが、今回は後者の方法をご紹介します。

marketplace.visualstudio.com

GUI で編集する方法

YAML ファイルを触りたくない人向けのツールをご紹介します。 このツールはGUI 上で設定、入力していくと最終的に YAML ファイルが出来上がる仕組みです。

stoplight.io

おわりに

いかがでしたか?ツール等の導入には多少手間は必要ですが、Excelのひな型作成と考えればそこまでのコストはかからないと思います。 効率よくメンテンナンスを行うためにぜひ導入してみてください。 今回は紹介していませんが、仕様書を更新した際にSlackへ通知することも可能なので、興味がある方は調べてみてください。

Node.jsのバージョン管理に「Volta」を使ってみた

どうも、小野です。 最近、業務用メインPCをMacからWindowsに乗り換えました。

Macのときはバージョン管理にnodenvを使っていましたが、Windowsでは利用できません。 ただし、WSL上であれば可能ですが、WindowsとWSL間でソースの扱いが難しいと感じたので、 このたび、新たなバージョン管理ツールの導入を決めました。

候補としては以下の3つでした。

  • nodist
  • nvm-windows
  • Volta

nodist

nodenvと同様に.node-versionによる切り替えが可能なのですが、Githubリポジトリを見ると2年近く更新されておらず、先行き不安なので断念しました。

github.com

nvm-windows

コマンドによるバージョン変更は可能なのですが、プロジェクト単位での変更ができないので候補から外れました。 ただ、下記のサイトのようにバッチとか組めばプロジェクト単位での変更が可能ですが、あくまでもグローバルのバージョンが変更されるので、 例えば、同時にバージョン違いのモジュールを実行したいケースについては対応できません。

github.com

qiita.com

Volta

Voltaはコマンドによるバージョン管理が可能なうえ、プロジェクト単位での指定も可能なので使ってみることにしました。 さらに、VoltaはRust製なので処理速度にも期待しています。

volta.sh

github.com

インストール

こちら から、Windowsのインストーラーをダウンロードします。 ダウンロードしたら、ファイルを実行しインストールします。

以下のコマンドでVoltaのバージョンが表示されるかを確認します。

volta -v

Nodeインストール

インストールする場合の指定方法が3つありますので、ご紹介します。

バージョンを指定

指定したバージョンのNodeがインストールされます。

volta install node@14.15.5

メジャーバージョンのみ指定

指定したメジャーバージョンの最新版がインストールされます。

volta install node@14

バージョン指定なし

最新版のNodeがインストールされます。

volta install node

プロジェクト単位で切り替える方法

volta installがグローバルにインストールされるので、プロジェクト単位でバージョンを切り替える場合はvolta pinを使う。

volta pin node@14.15.5

おわりに

フロントエンドまわりは更新が早いので、プロジェクト後tにNodeのバージョンが異なるとは少なくないので、 手軽にバージョンのインストールや切り替えが可能なVoltaを使ってみてはいかがでしょう?