JavaとSpring BootでREST APIを作成する方法
読む所要時間: 36 分
もうずいぶん前からTwilioのREST APIを使用していますが、HTTPでクライアントとサーバー間の通信を確立する際にREST APIがどのように使用されているかを見るといつも驚きます。APIを呼び出すと、サーバーが呼び出されます。次に、サーバーがビジネスロジック全体を実行し、結果を返します。
自分でAPIを作成できるように、これらのAPIがどのように開発されているかを常に知りたいと思っていました。これが分かれば、Spring Bootなどのさまざまなフレームワークを探求できます。そこで、Spring Bootを使用してREST APIを開発し、初心者がSpring Bootを使い始めるのに役立つこのチュートリアルを作成することにしました。
このチュートリアルでは、Spring BootでREST APIを開発し、従業員データベースでCRUD操作を実行する方法をご紹介します。
必要条件
- Javaに関する予備知識または学習意欲。
- Java Development Kit(JDK)バージョン8以降。
- Maven 3.3以降
- MySQL。MySQLで従業員データを保存し、REST APIでアプリケーションにアクセスします。MySQLの設定をWorkbenchで行う手順については、ガイドに従ってください。
- コード開発用のEclipse IDE。インストーラを実行すると、インストールする具体的なパッケージが求められるため、[Eclipse IDE for JavaEEDevelopers](JavaEEDevelopers用Eclipse IDE)を選択します。Mavenは必ずEclipse IDEで設定してください。
- APIをテストするためのPostmanデスクトップアプリケーション。インストール中に、プロンプトが表示されたら無料のアカウントを作成します。
Spring Bootを使用する利点
Spring Bootは、Spring上に構築されたJavaフレームワークであり、Webアプリケーションの開発に使用されます。最小限の構成でREST APIを作成できます。REST APIにSpring Bootを使用する利点は次のとおりです。
- 複雑なXML設定が必要ないこと。
- Spring Bootアプリケーションを実行するためのTomcatサーバーが埋め込まれていること。
- 特定の依存関係に対してアプリケーションを自動的に設定するSpring Bootによる自動設定機能があること。クラスパスで依存関係が使用可能な場合、その依存関係のBeanがSpring Bootで自動作成されます。SpringのBeanは、Spring IoCコンテナを介してSpringでインスタンス化と管理を実施するオブジェクトです。これはSpring Bootが自動的に処理するため、Beanを作成して設定する必要はありません。
Spring Bootは、コーディングをすぐに開始するために必要なすべての設定をボイラープレートコードに提供するため、一般的に開発者がアプリケーションを構築するのに最適です。
Spring Bootプロジェクトを作成、インポートする
Spring Bootアプリケーションを作成するには、Spring Intializrというツールを使用します。このツールは、Spring Bootプロジェクトの基本構造を提供しているため、すぐにコーディングを開始できます。
Spring Initializrサイトに移動します。[Project](プロジェクト)で[Maven]を選択し、言語に[Java]を選択します。このチュートリアルでは、Spring Bootバージョン2.5.6を使用して作成しているため、Spring Initializrでは同じバージョンを選択してください。
プロジェクトの[Project Metadata](プロジェクトメタデータ)で、次の識別子を指定します。
- Group(グループ):プロジェクトを作成している組織またはグループを示す基本パッケージ名です。Javaパッケージの命名規則に従います。デフォルト値のままでも構いません。
- Artifact(アーティファクト):プロジェクトの名前。従業員の詳細にアクセスして操作するためのアプリケーションを作成しているため、[employee]を指定します。
- Name(名前):プロジェクトのエントリポイントを作成するときにSpring Bootで使用するアプリケーションの表示名です。アーティファクト名([employee])と同じで構いません。
- Description(説明) - プロジェクトに関する説明を指定します。
アプリケーションはSpringBootが提供する埋め込みTomcatサーバーで実行されるため、[Packaging](パッケージング)タイプとして[Jar]を選択します。
このチュートリアルはJava8で記述しているため、処理を進めるには、同じJavaバージョンを選択します。
次の依存関係をプロジェクトに追加します。
- Spring Web: RESTful Webアプリケーションの構築に必要です。
- Spring Data JPA: データベースのデータにアクセスするために必要です。JPA(Java Persistence API)は、JavaオブジェクトをデータベースエンティティにマップするJava仕様であり、ORM(オブジェクト関係マッピング)とも呼ばれます。Spring Data JPAは、JPAを抽象化したものであり、レコードの作成、削除、更新など、データベースのさまざまな操作のためのユーティリティメソッドを提供します。JDBCと同様、クエリの作成は不要です。
- MySQL Driver: MySQLデータベースに接続するために必要です。
Spring Bootアプリケーションは次の図のようになります。
画面の下部の[Generate](生成)ボタンをクリックします。プロジェクトのボイラープレートを含むzipファイルがダウンロードされます。zipファイルを任意のフォルダの場所に解凍します。
Eclipse IDEを開き、[File](ファイル)に移動して[Import](インポート)を選択します。[Maven]で、[Existing Maven Projects](既存のMavenプロジェクト)を選択します。[Next](次へ)をクリックします。
zipファイルを解凍したディレクトリを参照し、pom.xmlファイルが存在するルートフォルダを選択します。[Finish](完了)をクリックし、プロジェクトをEclipse IDEにインポートします。
ファイル構造
ファイルエクスプローラに次のフォルダが表示されます。
- src/main/java/com/example/employeeサブディレクトリは、チュートリアルのすべてのJavaクラスで構成されています。
- リソースフォルダの下のapplication.propertiesファイルには、Spring Bootがアプリケーションの構成に使用するプロパティが含まれます。このファイルには、チュートリアルの後半で、データベースURL、ユーザー名、パスワードなどのデータベース構成の詳細を追加します。
- pom.xmlには、Spring InitializrでSpring Bootプロジェクトを作成するときに追加したすべての依存関係が含まれます。
EmployeeApplication.javaという名前のファイルがあることに注意してください。これは、Spring Bootアプリケーションを起動するエントリポイントです。
@SpringBootApplication
には、次のSpring Bootアノテーションの機能が含まれます。
@EnableAutoConfiguration
: 前述のSpring Bootの自動設定機能を有効にします。@Configuration
: アプリケーションが使用しているすべてのBean定義を提供する設定クラスを指定します。Spring Bootでは、設定クラスで提供されるBean定義を使用し、実行時にインスタンス化します。@ComponentScan
: Spring Bootがパッケージをスキャンして、Service
、Controller
、Repository
などのコンポーネントを探し、それらの各クラスのBeanを登録できるようにします。
サブパッケージをプロジェクトに追加する
Spring Bootアプリケーションを構成する主なレイヤーについて理解します。プロジェクト内のレイヤーごとにサブパッケージを作成します。
- DAO: DAO(データアクセスレイヤー)は、データベースに接続し、データベースに保存されているデータにアクセスするためのインターフェースを提供します。単一のDAOクラスは、さまざまなタイプのエンティティを取得するクエリを処理できます。
- リポジトリ: このレイヤーは、データベースに接続してデータにアクセスするDAOレイヤーに似ていますが、リポジトリレイヤーは、DAOレイヤーよりも優れた抽象化を提供します。すべてのクラスは、1つのエンティティにアクセスして操作します。このチュートリアルでは、リポジトリレイヤーを使用します。
- サービス: このレイヤーは、DAOレイヤーを呼び出して、データを取得し、ビジネスロジックを実行します。サービスレイヤーのビジネスロジックは、受信したデータの計算の実行、一部のロジックに基づくデータのフィルタリングなどです。
- モデル: モデルには、使用するデータベーステーブルにマップされるすべてのJavaオブジェクトが含まれます。DAOは、データベースからデータを取得し、それぞれのモデルにそのデータを入力して、サービスレイヤーに返します(その逆も同様)。
- コントローラー: 最上位のレイヤーであり、特定のREST APIでリクエスト実行したときに呼び出されます。コントローラーは、REST APIリクエストを処理して、1件以上のサービスを呼び出し、HTTPレスポンスをクライアントに返します。
前述のコンポーネントの個別のフォルダを作成するには、Eclipseで、com.example.employeeパッケージを右クリックし、次に示すように、[New](新規作成)、[Package](パッケージ)の順に選択します。
新しいポップアップが開いたら、[Name](名前)フィールドに「com.example.employee.repository」と入力して[Finish](完了)をクリックします。
これにより、リポジトリコンポーネント用のフォルダが作成されます。前述の手順を、次のパッケージに対して繰り返します。
- com.example.employee.controller
- com.example.employee.model
- com.example.employee.service
これらの各サブパッケージでアプリケーションのコードを作成する前に、テーブルを作成し、Spring BootでMySQL接続の詳細を設定します。
テーブルを作成してSpring BootでMySQLの詳細を設定する
MySQL Workbenchを開きます。ホームページで、[MySQL Connections](MySQL接続)の横の[+]アイコンをクリックします。
[Setup New Connection](新しい接続の設定)ポップアップが開きます。接続名として「spring-boot-test」と入力します。[Default Schema](デフォルトスキーマ)に「employee-schema」と入力します。
[OK]をクリックします。新しいMySQL接続がホームページに作成されます。
接続を開くには、ホームページの[spring-boot-test]をクリックします。[employee-schema]で、[テーブル](Tables)を右クリックし、[Create Table](テーブルの作成)を選択します。
emp_id、first_name、last_name、email_idの4つの列を追加します。[emp_id]で、[Primary Key](主キー)を選択し、[Not Null](Nullでない)と[Auto Increment](自動インクリメント)チェックボックスを選択します。テーブルは次の図のようになります。
[Apply](適用)をクリックし、[Finish](完了)をクリックします。
アプリケーションでこのMySQLインスタンスを接続するには、データベースの詳細をSpringBootに提供する必要があります。application.propertiesファイルを開き、次の内容を追加します。
3306
は、MySQLインスタンスが実行されているポート番号です。インスタンスが実行されているポート番号に変更します。MySQL5InnoDBDialect
は、使用されているデータベースをSpring Bootに通知するために使用する方言です。Spring Bootでは、これに基づいて、データベースのSQLクエリを生成します。
Spring Bootは、この情報を使用して、データベース接続を自動設定します。
テーブルの準備ができたら、アプリケーションのさまざまなレイヤーのコードを追加します。
モデルクラスを作成する
Eclipse IDEに戻り、新しいクラスを作成するオプションのcom.example.employee.modelパッケージを右クリックします。
クラスの詳細を含む新しいポップアップが表示されます。[Name](名前)フィールドに、「Employee」と入力します。[Finish](完了)をクリックします。
次の内容をファイルに追加します。
ファイルのコードを詳しく見てみましょう。
@Entity
アノテーションでは、このJavaクラスがデータベーステーブルにマップされるように指定します。@Table
プロパティでは、name
を使用して、このクラスがマップされる特定のテーブルを指定します。- 各Javaインスタンス変数の
@Column
では、名前や長さなどの一連のプロパティを定義できます。name
プロパティは、このインスタンス変数がマップされるデータベーステーブルのフィールドの名前になります。 - フィールドの
@Id
では、このフィールドがテーブルの主キーであることをSpring Bootに通知します @GeneratedValue
では、主キーの生成に使用する戦略を指定します。
続いて、以下に説明するように、4つの主キー生成戦略があります。
GenerationType.AUTO
: Spring Bootで使用するデフォルトの戦略です。この戦略を使用すると、JPAプロバイダーでは、application.propertiesファイルで指定した言語に応じて、主キーを生成するための適切な戦略を決定します。GenerationType.IDENTITY
: この戦略では、データベースID列を使用して主キー戦略を決定します。たとえば、従業員テーブルの作成中に、データベースでemp_id
列を自動インクリメントとして定義しました。この戦略を使用すると、1から開始して、テーブルに新しい行が挿入されるたびに増分し、一意の主キーが生成されます。GenerationType.SEQUENCE
: この戦略では、データベースシーケンスを使用して主キーを生成します。GenerationType.TABLE
: この戦略では、データベーステーブルを使用して主キーを生成します。
また、前述のインスタンス変数のセッターとゲッターを作成します。Eclipseでそれらを自動生成するには、Employee.javaファイルを右クリックし、[Source](ソース)を選択します。[Generate Getters and Setters](ゲッターとセッターの生成)を選択します。[Select All](すべて選択)をクリックし、[Generate](生成)ボタンをクリックします。
次のセクションでは、このモデルクラスを使用してデータベースから従業員の詳細にアクセスするリポジトリクラスを作成します。
リポジトリクラスを作成する
EmployeeRepositoryという名前のクラスをcom.example.employee.repositoryパッケージの下に作成し、コードを次の内容に置き換えます。
@Repository
は、クラスがCRUD操作を含むデータリポジトリであることを示します。CRUDは、データベースの4つの基本操作(Create(作成)、Read(読み取り)、Update(更新)、Delete(削除))を表す頭字語です。
EmployeeRepository
はJpaRepository
を拡張します。JpaRepository
に渡される2つのパラメータがあります。最初のパラメータは、このリポジトリで管理されるモデルクラスであり、2番目は主キーのデータ型です。
Spring Data JPAから提供されているJpaRepository
インターフェイスでは、リポジトリクラスで従業員テーブルのレコードを取得、更新、削除できます。
このインターフェイスでは、データベースを操作するための save()
、findAll()
、delete()
などのメソッドも定義します。これらのメソッドの実装は、SimpleJpaRepository
と呼ばれるデフォルトの実装クラスで提供されます。これらのメソッドを呼び出す必要があるため、これらの操作のクエリを作成する手間を省くことができます。
次のセクションでは、JpaRepository
実装メソッドを呼び出すサービスクラスを作成します。
サービスクラスを作成する
サービスコンポーネントにはビジネスロジックが含まれます。EmployeeServiceという名前のクラスをcom.example.employee.serviceパッケージの下に作成し、コードを次の内容に置き換えます。
Springでは、クラスオブジェクトをインスタンス化するために@Autowired
アノテーションを使用します。
EmployeeRepository
クラスの@Repository
アノテーションでは、Springの@ComponentScan
機能を使用して、このクラスのBeanを作成できるようにしていました。このBeanは、@Autowired
アノテーションを使用してサービスクラスで使用されます。これは、Springでの依存関係の注入と呼ばれます。
次に、サービスレイヤーにメソッドを作成します。これらの各メソッドは、EmployeeRepository
で拡張されるJpaRepository
メソッドを呼び出します。
これらのメソッドをEmployeeRepository empRepository
の後のEmployeeService
クラスに追加します。
createEmployee
メソッドはempRepository.save()
関数を呼び出します。この関数は、データベースに保存した後、Employee
オブジェクトを返します。createEmployee
メソッドに渡されるパラメータは、保存するすべての詳細を含むEmployee
モデルです。- 同様に、
getEmployees()
とdeleteEmployee()
は、EmployeeRepositoryで拡張されるそれぞれのJpaRepository
メソッドを呼び出します。 findAll()
関数は、データベースのすべての従業員の詳細のリストを返します。deleteById(empId)
関数は、テーブルのemp_id
と渡されるempId
が等しい従業員レコードを削除します。
従業員の詳細を更新するために、次の関数をdeleteEmployee(Long empId)
メソッドの後に追加します。
前述のメソッドについて詳しく見てみましょう。
updateEmployee
メソッドは、従業員ID(主キー)と新しい従業員の詳細を含む従業員オブジェクトの2つのパラメータを受け入れます。- 既存の従業員を更新するには、データベースの従業員IDが
empId
と等しい従業員オブジェクトを最初に取得し、それをemp
変数に格納します。 - 古い従業員オブジェクトを取得したら、Employee.javaで定義されているセッターを使用し、
employeeDetails
に格納されている新しい値でフィールドを更新します。 - 最後に、
empRespository.save(emp)
関数が、更新されたemp
オブジェクトをデータベースに保存します。
コントローラークラスを作成する
EmployeeControllerという名前のクラスをcom.example.employee.controllerパッケージの下に作成し、コードを次の内容に置き換えます。
- クラスの
@RequestMapping
アノテーションでは、このコントローラーで作成されたすべてのREST APIのベースURLを定義します。このベースURLの後には、各コントローラーメソッドに指定される個々のRESTエンドポイントが続きます。 - クラスの
@RestController
の組み合わせは次のとおりです:@Controller
: このクラスがコントローラーであることをSpring Bootに通知します。@ResponseBody
: コントローラー内のメソッドの戻り値がREST APIのレスポンス本文として返されることを示します。EmployeeService
:@Autowired
アノテーションを使用して依存関係として注入されます。
CRUD操作を実行するメソッドを作成する
コントローラーでのREST APIリクエストの実装に進む前に、これらのREST APIの構造について説明します。
従業員を作成するには、api/employees
エンドポイントを使用してPOSTメソッドを作成します。リクエスト本文は、クライアントからAPIに送信されるデータで構成されます。この場合、データは、データベースに保存する新しい従業員の詳細になります。JSONの内容は次のようになります。
従業員の詳細を取得するには、api/employees
エンドポイントを使用してGETメソッドを作成します。
従業員の詳細を更新するには、api/employees/{empId}
エンドポイントを使用してPUT HTTPメソッドを作成します。{empId}
は、APIに送信される従業員IDを含むパスパラメータです。リクエスト本文は、次に示すように、フォーマットされたデータベースで更新する新しい従業員の詳細で構成されます。
従業員を削除するには、/emp/{empId}
エンドポイントを使用してDELETE HTTPメソッドを作成します。{empId}は、データを削除する必要のある従業員IDです。
これら4つのREST APIのメソッドを作成しましょう。次のメソッドをEmployeeService empService
の後のEmployeeController
クラスに追加します。
新しく追加したコードを詳しく見てみましょう。
value
: エンドポイント。この場合は/employees
になります。value
フィールドに指定したエンドポイントは/employees
のみであり、/API/employees
ではないことに注意してください。/api
はすべてのエンドポイントに共通であるため、クラスの@RequestMapping
アノテーションのベースURLとして追加されています。method
: これは列挙型で表されるHTTPメソッドタイプです。create employeeエンドポイントの場合、HTTPメソッドはPOSTになるため、その値としてRequestMethod.POST
を追加します。@RequestBody
: エンドポイントのリクエスト本文をメソッドパラメータにマップするために使用されます。emp
には、このエンドポイントに渡されるリクエストJSONが含まれます。
同様に、他のすべてのREST APIのコードを追加します。これらのメソッドをcreateEmployee
メソッドの後のEmployeeControllerクラスに追加します。
一部のメソッドには@PathVariable
が含まれていることに注意してください。これは、APIエンドポイントにパスパラメータが含まれることを意味します。@PathVariable
は、エンドポイントのvalue
パラメータに指定するパス変数をJavaメソッドフィールドにマップします。
アプリケーションを作成する
ビルドする前に、GitHubリポジトリに作成したプロジェクトを参照用に示します。
Eclipseのプロジェクトエクスプローラーで、employeeフォルダを右クリックし、[Run As](実行)を選択してから、[4 Maven build…](4 Mavenのビルド…)を選択します。
[Edit Configuration](設定の編集)ポップアップが開きます。[Goals](ゴール)に「spring-boot:run」と入力します。
[Environment](環境)タブに移動し、[Add](追加)をクリックします。[New Environment Variable](新しい環境変数)ポップアップが開きます。
[Name](名前)フィールドに「spring.datasource.username」と入力します。[Value](値)に、MySQLユーザー名を入力します。[OK]をクリックします。
同様に、[Name](名前)に「spring.datasource.password」、[Value](値)にMySQLパスワードを入力し、新しい環境変数を追加します。[Apply](適用)をクリックし、[Run](実行)をクリックします。
これで、アプリケーションのビルドが開始されます。ビルドが成功すると、コンソールに次のように表示されます。
コンソールに最後の数行が表示されている場合は、アプリケーションがデフォルトのポート8080で実行を開始したことを示しています。このポートが使用できない場合、Spring Bootは別の使用可能なポートを検出します。
https://localhost:8080のWhitelabel Error Pageがブラウザに表示されます。
次のセクションでは、4つのCRUD APIをテストする方法を学びます。
APIをテストする
Postmanは、APIの開発、テスト、文書化を支援するアプリケーションです。まだ作成していない場合は、無料のアカウントを作成します。
Postmanでワークスペースを作成します。このワークスペースでは、チームメートとプロジェクトの共同作業ができます。各ワークスペースには、APIのセットが定義されたフォルダを含む1件以上のコレクションを含めることができます。
Postmanでワークスペースを作成するには、次の手順に従います。
- Postmanアプリケーションを開きます。
- [Workspace](ワークスペース)ドロップダウンを選択し、[New workspace](新しいワークスペース)をクリックします。
- ワークスペースの名前(例: 「Spring Boot REST API Workspace」)を入力します。
- [Visibility](表示)では、ワークスペースをチームメートに公開するかどうかを選択できます。この記事では、どちらのオプションも選択できます。
- 右下隅にある[Create Workspace](ワークスペースの作成)ボタンをクリックします。
コレクションを作成するには、左側のパネルにある[Create new Collection](新しいコレクションの作成)アイコンをクリックします。
コレクション名の横にある[Edit](編集)アイコンをクリックし、「Employee collection」(従業員コレクション)と入力します。
次に、Spring Bootアプリケーションで作成した4つのREST APIに対して、リクエストをコレクションに作成してテストします。
Postmanでリクエストを作成してテストする
左側のパネルで、作成したコレクションの[View more actions](その他のアクションを表示)をクリックし、[Add request](リクエストの追加)を選択します。
リクエスト名を「Create Employee」(従業員の作成)にします。次のように、新しいリクエストが作成されます。
HTTPメソッドをPOSTに変更します。
[Enter Request URL](リクエストURLの入力)フィールドに「https://localhost:8080/api/employees」と入力します。
/api/employeesエンドポイントの前には、アプリケーションが実行されているサーバーとポートが付きます。アプリケーションが別のポートで実行されている場合は、URLの8080
を置き換えます。
リクエスト本文をこのリクエストURLエンドポイントに送信するには、[Body](本文)タブに移動し、[raw](未加工)チェックボックスを選択して、リクエスト本文の形式として[JSON]を選択します。
表示されるテキストボックスに、次のデータを入力します。
これらは、データベースに追加される従業員の詳細です。[Save](保存)をクリックし、[Send](送信)をクリックします。Postmanで取得するレスポンスは次のようになります。
200 OK
のレスポンスステータスに注目してください。これは、レスポンス本文が、データベースに保存された従業員レコードの詳細を含むJSONであることを示しています。
MySQL Workbenchに移動し、次のクエリを実行することにより、前述の従業員の詳細を持つemp_id=1
の新しい行が作成されることを確認します。
同様に、従業員にGET、DELETE、UPDATEリクエストを作成して実行します。
従業員にGET
を実行するには、[Enter Request URL](リクエストURLの入力)フィールドに「http://localhost:8080/api/employees/」と入力します。[Body](本文)を空欄のままにし、[Send](送信)をクリックします。
特定のIDの従業員にUPDATE
を実行するには、PUT
リクエストを作成します。[Enter Request URL](リクエストURLの入力)フィールドに「http://localhost:8080/api/employees/1」と入力します。次の詳細を未加工のJSON本文に入力し、[Send](送信)をクリックします。
従業員レコードにDELETE
を実行するには、DELETE
リクエストを作成します。[Enter Request URL](リクエストURLの入力)フィールドに「http://localhost:8080/api/employees/1」と入力します。[Body](本文)を空欄のままにし、[Send](送信)をクリックします。
Java Spring Bootプロジェクトの次のステップ
このチュートリアルでは、Spring Bootを使用してREST APIを構築する方法と、PostmanでAPIをテストする方法について学習しました。
ぜひ、以下の記事を参照し、Spring BootアプリケーションでTwilio APIを実装してください。
- Spring BootアプリケーションでSMSを送信する
- Spring Bootを使用してJavaでSMSダッシュボードを作成する
- TwilioメディアストリームとJava、WebSocket、Spring Bootを使用して通話を文字起こしする
Nida氏は、フルスタック開発者です。彼女は実践から学ぶ人です。開発を通じて新技術を学ぶことが好きです。自由時間には、新技術について調べ、技術ブログを読み、データ構造とアルゴリズムの問題を解決することに励んでいます。GitHubまたはLinkedInでフォローしてください。