IntelliJ IDEA News Tips & Tricks

Spring / Spring Boot 開発のための IntelliJ IDEA 便利機能(前編)

こんにちは、JetBrains堀岡です。
2021年2月25-26日に開催された IntelliJ IDEA 20周年オンラインカンファレンスはご覧になりましたでしょうか?

おそらく「興味はあったけど、英語で1時間の動画を見るのは。。。」という方もいるのではないでしょうか。私もその中のひとりでしたが、後で少しずつ見てみると興味深いセッションが多いことに気づきました。

そこで、今回は「IntelliJ IDEA Spring Tips & Tricks From The Trenches(Marco Behler, 2021)」の内容をベースにSpring 開発のための IntelliJ IDEA 便利機能を日本語環境のハンズオン形式で紹介します(注:何かのアプリケーションを作るチュートリアルではなくて、IntelliJ IDEA Ultimate の Spring / Spring Boot 開発向け機能をサンプルコードで一通り触ってみるというハンズオンです)。

はじめに

この記事で主に IntelliJ IDEA Ultimate(有償版)のみ利用可能なSpring 開発向けの機能をハンズオン形式で紹介します。
現在 IntelliJ IDEA Community (無料)版を使っているけど試したい」という方は

からライセンスを入手してお試しください。

参考:IntelliJ IDEA Ultimate 版と Community 版の違い

また、IntelliJ IDEA を初めてお使いになる方は以下もご覧ください。

本記事での開発環境は以下です。

  • OS: macOS Big Sur 11.5.2
  • HW: Mac mini (M1, 2020)
  • IntelliJ IDEA Ultimate 2021.2.1
  • 日本語言語パックインストール済み

なお、本文中でショートカットキーを紹介する場合 Cmd + N/Ctrl + N のように macOS向けショートカット/Win or Linux向けショートカット併記形式で記載します。

この記事の内容は以下のYoutube動画(英語)をベースにしています。英語アレルギーではない方や、ライブコーディングの様子を見たい方はこちらの動画をご覧ください。

目次

新規プロジェクト作成(Spring Initializrサポート)

初めに紹介する機能は新規プロジェクト作成です。IntelliJ IDEA Ultimate では Spring Initializr を IDE から実行してプロジェクトを作成することができます。

(個人的には、Spring Initializr を頻繁に実行する人がどれくらいいるのかはわかりませんが)IntelliJ IDEA から Spring Initializr を実行できることにより、

  • ウェブサイトを開いて
  • Zipをダウンロードして展開
  • IDE で読み込む

という手作業が無くなることに加え、IDE で使用するJDK の設定も同じ画面からできるので、気軽にそして簡単に Spring Boot アプリケーション開発環境が作れることは良いのではと思います。

それでは実際の操作を見ていきましょう。IDE 起動後の「IntellliJ IDEA へようこそ」画面で以下を実行します。

  • 「新規プロジェクト作成」 をクリックします

以下の新規プロジェクトダイアログが表示されるので以下を実行します。

  • 新規プロジェクトダイアログの左側で「Spring Initializr」を選択します
  • 場所:」(プロジェクトディレクトリ)に「ijb20spring(適当なプロジェクト名)」を指定します

この環境ではプロジェクト SDK には(Apple Siliconに対応した)azul 11を指定していますが、お使いの環境に応じて適切に選択してください。JDKがインストールされていない場合は、「JDKのダウンロード」を選択するとダウンロード&インストールが可能です。

また、今回はプロジェクトテンプレートのサーバー URL はデフォルトの「start.spring.io」を使用していますが、独自のSpring Initailizrを指定することも可能です。

次のページでは Spring プロジェクトの依存関係を指定します。画面左側の「依存関係:」(一覧)では検索フィールドで絞り込みができるので、何を指定したい分かっている場合、活用すると便利です。表示されている依存関係の左にあるチェックボックスをクリックすると、画面右下の「追加された依存関係」に表示されます。以下操作例です。

  • 検索フィールドに「web」を入力します
  • Spring Web をチェックボックスをクリックします
  • 画面右下の「追加された依存関係」にSpring Web が表示されます

ここでは動画の内容に合わせて、以下の依存関係を追加します。追加し終わったら「完了」をクリックします。

  • Spring Web
  • Thymeleaf
  • Spring Data JDBC
  • Spring Boot Actuator
  • Spring Boot DevTools

プロジェクトが開きます。初めて Spring 開発環境をセットアップする場合は Maven ライブラリや共有インデックスのダウンロード、インデックス作成等でしばらく時間がかかります。進行状況は画面下部に表示されているので、完了まで辛抱強くお待ちください。

ダウンロードやインストールが完了したら、IntelliJ IDEA が Spring 開発プロジェクトを正しく認識しているか確認してみましょう。

  • メニューの ファイル | プロジェクト構造… を選択します

プロジェクト構造ダイアログを表示します。ファセットをクリックして、Spring と Web が表示されていることを確認してください。ファセットは特定のフレームワークや技術の開発を支援するためのIDEの機能です。通常これらは IntelliJ IDEA が自動的に設定しますが、マニュアルで追加する必用がある場合は、マニュアルを参照ください。

Maven(pom.xml) ファイルサポート

次に紹介する機能は Maven(pom.xml) サポート機能です。

プロジェクトを作成した後で、依存関係を追加したい場合、dependency タグをコピー&ペーストする方法がメジャーかと思いますが、依存関係の追加を「コード生成 Cmd + N / Alt + Insert」 から行うことこともできます。以下、試してみましょう。

  • pom.xml を開きます (「どこでも検索」 Shift x 2 から探せます)
  • 依存関係を追加したい場所(<dependencies>内のどこか)にカーソルをおきます
  • コード生成 Cmd + N / Alt + Insert を実行します
  • 「依存関係」を選択します

Maven アーティファクト検索ダイアログが表示されるので以下を実行します。

  • h2 database  で検索します
  • com.h2database:h2 を選択します
  • ダイアログ右下「追加」を選択します

以下のように、pom.xml ファイルに com.h2database の dependency タグが追加されました。

Maven ファイルを変更したら重要なステップがあります。それは

  • エディタ上に表示される Maven アイコンをクリック

して変更を読み込むことです。これは dependecy タグを手書きで追加した時も同じです。追加したライブラリがローカルに無い場合、ライブラリがダウンロードされます。

次に紹介するのはガターアイコンです。pom.xmlファイルのエディタ画面左のガターアイコンにカーソルを当てると、その環境で展開される依存関係の詳細(バージョン番号)を表示します。ガターアイコンは便利機能を提供してくれると覚えておきましょう。

参考

IntelliJ IDEA 日本語マニュアル Maven および Gradle

次からは Spring Boot アプリケーションにちょっとしたサービスを追加しながら、IntelliJ IDEA の Bean / Context ナビゲーション機能を紹介していきます。

ユーザー一覧を返す Rest サービスのエンドポイントを作りたいとします。

Ijb20springApplication.javaと同じディレクトリに以下の2つのファイルを作成します。動画(英語)でIntelliJ IDEA でコードを追加する様子はこちらをご覧ください。

UserService.java

package com.example.ijb20spring;

import org.springframework.stereotype.Component;

import java.util.List;

@Component
public class UserService {

    public List<User> getUsers() {
        return List.of(new User("marco"));
    }
}

User.java

package com.example.ijb20spring;

public class User {
    private String name;

    public User(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

UserService.java を見てみましょう。 @Component が付与された Bean クラスに対してガターアイコンが表示されています。ここで以下の操作を行います。

  • ガターアイコンをクリックします
  • Spring Bean の宣言に移動 を選択します

すると、Bean をインスタンス化する Spring Boot アプリケーションクラス(Ijb20springApplication.java)へジャンプします。

一方、以下に示すように、Spring Boot アプリケーションクラス(Ijb20springApplication.java)において

  • 虫眼鏡付きガターアイコンをクリックすると、インスタンス化するBeanクラス一覧が表示されます
  • Beanクラス(例えば userService)を選択すると、当該ファイルにジャンプします

これらのガターアイコンによるナビゲーション機能により、アノテーションにより構成される、アプリケーションクラスとBeanクラスの関係を理解することができます。この例自体はシンプルですが、複雑な既存コードを理解する時には役立つ機能であると動画では紹介されています。

コードを追加して少しサンプルアプリを複雑にしてみましょう。コードを追加している動画(英語)はこちらです。

PasswordService.java を追加します。ここでは@Component アノテーションは付与しません。

package com.example.ijb20spring;

public class PasswordService {
}

次に、Ijb20springApplication.java に @Bean アノテーションで PasswordService をインスタンス化する以下のコードを追加します。

@SpringBootApplication
public class Ijb20springApplication {

    //以下を追加
    @Bean
    public PasswordService passwordService() {
        return new PasswordService();
    }

    public static void main(String[] args) {
        SpringApplication.run(Ijb20springApplication.class, args);
    }

}

次に UserService.java に @Autowired でPasswordService をフィールドインジェクションするようにします。

import java.util.List;

@Component
public class UserService {

    //以下を追加
    @Autowired
    private PasswordService passwordService;

    public List<User> getUsers() {
        return List.of(new User("marco"));
    }

}

UserService で 以下のガターアイコンを使うと、Autowired された依存関係を注入している箇所から @Bean でインスタンス化している箇所に移動できます。

Spring ダイアグラム

IntelliJ IDEA では Bean の依存関係を理解しガターによるナビゲーション機能を提供する以外に、Spring ダイアグラム 機能で依存関係の可視化が可能です。

以下、Spring ダイアグラムで Bean の依存関係を見てみましょう。

  • Ijb20springApplication のガターアイコンをクリックします
  • 「Spring ダイアグラム… 」 を選択します

  • 「Bean の依存性(現在は Bean の依存関係 に翻訳が訂正されています)」を選択します

Spring Boot では既に多くの依存関係が定義されており、巨大なダイアグラムが表示されますが、興味のあるものに絞り込むことができます。ここでは以下の手順で UserService の依存関係を探してみましょう。

  • Cmd + F / Ctrl + F で「ダイアグラムの要素」検索ウィンドウを表示します
  • 「User」 を入力します
  • userService を選択します
  • 画面上部の + をクリックしダイアグラムを拡大します

以下のように、userService の依存関係を確認することができます。

インスペクションとエラーハイライト

次はインスペクションとエラーハイライトです。

UserService.java を開いてみると、@Autowired のところ黄色い波線が引かれています。

黄色い波線にカーソルを合わせると警告メッセージが表示されます。推奨されないフィールドインジェクションへの警告です。これって何のこと?と思われた方(私も含む)は java – What exactly is Field Injection and how to avoid it? – Stack OverflowSpringでField InjectionよりConstructor Injectionが推奨される理由 が背景を知る上で参考になるかもしれません。

ここで

  • メッセージ右の ⠸ をクリック または
  • Cmd + F1 を実行します

すると警告に対する追加情報が表示されます。この警告へのクイックフィックス(自動修正)に関しても掲載されています。

実際に、クイックフィックスを適用してみましょう。

  • Option + Enter / Alt + Enter を実行します
  • アクションの候補から「コンストラクターの作成」を選択します

を実行します。

以下のように @Autowired でフィールドインジェクションしていた箇所が書き換えられ、コンストラクターによる代入になりました。

これ以外にも、IntelliJ IDEA Ultimate では様々な Spring 関連のインスペクションが準備されています。どのようなインスペクションがあるは以下で確認できます。

  • Preferences | 設定 メニュー
  • 検索項目で Spring を指定
  • インスペクション を選択

次にエラーハイライトについて見ていきましょう。わざとエラーが発生するように変更して、Spring Boot アプリケーションを起動してみます。

  • Ijb20springApplication.java を開きます
  • @Bean でPasswordService をインスタンス化している箇所を選択します
  • Cmd + / | Ctrl + / でコメントアウトします
  • 再生ガターアイコンをクリックし、 Spring Boot アプリケーションを起動します

  • 実行 ‘Ijb20springApplication’ を選択します

以下のようなメッセージが表示されます。メッセージの意味を翻訳すると以下となります。

  • Application の起動に失敗した
  • Description: UserService が PasswordService bean を必用としているが見つからなかった
  • Action: PasswordService bean を定義することを検討してください

ここで UserService.java を見てみると、「オートワイヤリングできませんでした」というメッセージが表示されています。Spring 起動後に表示されたエラーと同等の警告が IDE 上でもチェックされて表示されています。ここで注意が必用なのは、このメッセージは Spring Boot のアプリの実行とは関係なく(IntelliJ がUserService.java を静的にチェックしたタイミングで)表示されるということです。

このような Spring 向けインスペクション(静的コード解析)で検出されたエラーや警告は、ファイルのエディタ領域の右上、または、IDE下部の「問題」ツールウィンドウで表示されますので、特にエラー(赤)は優先して確認することをお勧めします。

(動画では言及されていませんが)コードのインスペクション(静的コード解析)に対して、一点注意点があります。(パフォーマンスの観点から)コードのインスペクションは開いたファイルに対してのみ実行されます。IntelliJ IDEA でプロジェクト全体を解析したい場合は、以下の方法で明示的に実行する必要があります。

  • メニューの コード | コードのインスペクション
  • インスペクション スコープ で「プロジェクト全体」を選択

プロパティファイル(application.properties) サポート

IntelliJ IDEA は Spring Boot アプリケーションを構成するための application.properteis ファイル編集支援機能を備えています。Spring Boot のプロパティドキュメント日本語)の指定がより簡単に行えるようになり便利です。

実際試してみましょう。

  • src/resources/application.properties を開きます
  • spring.d と入力する(または入力の途中で Ctrl + Space を実行する)とコード補完機能によりマッチするプロパティ一覧が表示されます。候補を選択して Tab (または Enter) で補完します。

  • クイックドキュメント(F1 / Ctrl + Q)機能により詳細な説明をIDE上で見ることができます

  • spring.datasource.url=abc と指定(わざと誤って「datasouce」 にキーを変更)すると、解決できないプロパティ警告が表示されます(追記:データベースを使用したプログラムを試す場合、abc の部分は適切な値を指定してください。例:「jdbc:h2:mem:dummyDB」「jdbc:h2:file:~/IdeaProjects/ibj20spring/src/main/resources/dummyDB;AUTO_SERVER=TRUE」)

この警告が意図されたものではない場合、プロパティキーのスペルミスが原因であると思われますので、実際のプロジェクトで警告がある場合、早期に修正するのが良いでしょう。

次に古いキーのチェック、および、指定値の補完についても見ていきましょう。バージョンアップやネットで見つけた技術情報が古かったりした場合に役立ちそうです。

  • spring.datasource.initialization-mode を指定します
  • 現在の Spring Boot のバージョン向けではない古いキーワードなので、以下の様な取り消し線が表示されます
  • 電球アイコンをクリックまたは option + Enter / Alt + Enter を実行すると、現在の Spring Boot で使用可能なキーへの置き換えが提案されるので、Enter で選択します

  • spring.sql.init.mode= と書いた状態で ctrl + Space (補完)を実行すると、指定可能な値の候補が表示されます
  • 指定したい値(例えば always)を選択し、Tab または Enter で確定します

次にコードの中で @Value アノテーションでプロパティを指定する時に、コード補完できる例を見ていきましょう。以下で紹介するコーディングの様子はこちらの動画(英語)で確認することができます。

  • src/main/resources/appilcation.properties ファイルに special.username=hadi を追加します
  • 次に UserService.java を以下のように変更します

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
public class UserService {

    private final PasswordService passwordService;
    //追加
    private String specialUsername;

    //変更 - コンストラクタで@Valueアノテーションでapplication.propertiesの値で初期化 
    public UserService(PasswordService passwordService,
                       @Value("${}")String specialUsername) {
        this.passwordService = passwordService;
        this.specialUsername = specialUsername;
    }

    //追加 - new User(specialUsername)
    public List<User> getUsers() {
        return List.of(new User("marco"), new User(specialUsername));
    }

}
  • @Value(“${}”) の 波カッコの中でプロパティを指定するときに、 Ctrl + Space(コード補完) を実行すると application.properties に追加したキーと値が候補として表示されます。

  • キー(special.username)に対して定義ジャンプ(Cmd + B / Ctrl + B)して application.properties を確認することも可能です

プロファイル(profile)サポート

Spring Boot アプリケーションは プロファイルにより、環境(テスト、本番、ステージング等)によりアプリケーションの構成を切り替えることが可能です。IntelliJ IDEA のプロファイルサポートを見ていきましょう。動画(英語)で見たい場合はここからです
まず、Staging環境でのみロードされるプロパティファイルを作成してみましょう。

  • staging用のプロパティファイル src/main/resources/application-stating.properties を作成します(注 application-<profile名>.properties は Spring Boot が自動ロードするための命名規則)。
  • プロパティとして special.username=h4d1 を追加します

  • UserService.java の special.username に対して定義を確認(Cmd + B / Ctrl + B)すると、staging 用と本番用の両方が表示されます

  • “special.username” に対してクイック定義(Cmd + Y / Shift + Ctrl + I)により、プロパティファイルを表示することなく値を確認できます

次にStaging環境でのみロードされるBeanを作成してみましょう。

  • src/main/java の com.example.ibj20spring 以下に StagingInitializer.java を作成します
  • 以下のコードを追加します。@Profile アノテーションで構成名を追加しています。

package com.example.ibj20spring;

import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;

@Component
@Profile("staging")
public class StagingInitializer {
}

さて、準備が整いまいしたので、プロファイルを指定したアプリケーションの実行について見てみましょう。コード中に指定したプロファイル情報は IntelliJ IDEA によって解釈され、実行時に選択できるようになります。

  • メニューの 実行 | 実行構成の編集 または IntelliJ IDEA 上の実行ボタン隣ドロップダウン▼をから、「実行構成の編集」を選択します
  • 以下のように実行/デバッグ構成ダイアログが開きます。ここで「有効なプロファイル」欄でコード補完( Ctrl + Space) を実行すると、staging が候補として表示されるので、選択します。

  • メニュー (実行 | 実行 <アプリケーション名>)または ▶︎ ボタンで実行すると IntelliJ IDEA は statging プロファイルでアプリケーションを実行します。

XML 構成ファイルサポート

本記事の最後では歴史のある Spring プロジェクトで利用されている可能性のある XML 構成ファイルサポートについて紹介します。動画(英語)で見たい場合こちらです。

機能を試すために applicationContext.xml を作成してみましょう。

  • src/main/resources フォルダをクリックします
  • 生成 (Cmd + N/Ctrl + N)を実行します
  • xml を入力し、XML 構成ファイルを選択し、さらに Spring 構成 を選びます

  • 新規ファイル名に「applicationContext」を入力します
  • applicationContext.xml が生成されたことを確認します

次に applicationContext.xml をSpring Boot アプリケーションに指定してみましょう。

  • Ibj20springApplication.java を開きます
  • @ImportResource アノテーションを追加します。コード補完を活用して入力してみましょう。@ImportResource(“”)の状態で、””の中に c を入力後、コード補完 (ctrl + Space)で 「classpath:」が候補として表示されるので選択します。その後、再度 コード補完 (ctrl + Space)を実行すると applicationContext.xml が表示されるので選択します。

Ibj20springApplication.java

@SpringBootApplication
@ConfigurationProperties(prefix = "special")
@ImportResource("classpath:applicationContext.xml") // 追加
public class Ibj20springApplication {

    @Bean
    public PasswordService passwordService() {
        return new PasswordService();
    }

    public static void main(String[] args) {
        SpringApplication.run(Ibj20springApplication.class, args);
    }

}

次に applicationContext.xml でコード生成機能、コード補完機能を使いながら Bean を指定してみましょう。

  • applicationContext.xml を開きます。
  • コード生成 (Cmd + N / Alt + Insert) を実行し、Spring Bean を選択します。

  • bean タグが自動生成されます。class 属性にカーソルがあるので、Pass を入力します。PasswordService が候補として表示されるので、Tab で選択します。その後、再度 Tab を押すと、id 属性にカーソルが移動します。ここで候補として表示される passwordService を選択します。
  • Bean の指定自体はこれでできましたが、実は Ibj20springApplication.java で @Bean アノテーションの指定と重複しているので警告が表示されます。

この記事では、以降 applicationContext.xml よる bean 指定は使用しないので、コメントアウトします。

  • bean タグ全体(開始タグから閉じタグ)まで選択します
  • Cmd + / | Ctrl + / でコメントアウトします

以上、applicationContext.xml ファイルの編集支援機能の紹介でした。

様々なガターアイコン

本記事ではいくつかのガターアイコンについて紹介しました。IntelliJ IDEA には、フレームワークサポートの一貫としてコードのナビゲーションや特定の機能を実行するためのガターアイコンがあります。どのようなガターアイコンがあるかは、 Preferences | 設定(Settings)メニューで、「ガター(gutter)」と検索してみると、一覧を見ることができます。今まで活用していなかった便利なガターアイコンがあるかもしれませんので、ぜひお試しください。

後編の紹介

今回の内容は以上となります。

約一時間の動画をブログで書き起こして解説すると、だいぶ長くなるということに今更気づきました。動画の後半部分は後編として、以下を紹介します(後編記事はこちら)。

  • Rest Controller のテスト(HttpClient + Endpointsの紹介)
  • HTML template(Thymeleaf)
  • Spring Tool Window

ご意見、フィードバック等ございましたらTwitterや日本語サポートまでお知らせください。

image description

Discover more