概要: 本記事では、Spring Bootを活用してMongoDB連携、複数データソース管理、RabbitMQによる非同期処理、MinIOとのファイルストレージ連携、そして国際化とメール送信機能の実装方法を解説します。
Spring Bootは、Javaベースのアプリケーション開発を簡素化し、迅速化するために設計された強力なフレームワークです。その豊富な自動設定機能やスターター依存関係により、開発者は設定作業の削減や依存関係の管理を容易にし、本質的なビジネスロジックの実装に集中できます。
本記事では、Spring Bootを活用して多様な機能を効率的に実装する方法について、具体的なデータベース連携、メッセージング、ファイルストレージ、国際化、メール送信といった側面から解説します。これらの機能を使いこなすことで、より堅牢でスケーラブル、そしてユーザーフレンドリーなアプリケーション開発が可能になります。
Spring BootとMongoDB:NoSQLデータベース連携の基本
MongoDBとは? Spring Bootでの活用メリット
MongoDBは、ドキュメント指向のNoSQLデータベースであり、JSONライクなBSON形式でデータを格納します。リレーショナルデータベース(RDB)のような厳格なスキーマを持たず、柔軟なデータ構造が特徴です。これにより、頻繁に変更される要件や、半構造化データを扱うアプリケーションに適しています。
Spring BootとMongoDBを連携させる最大のメリットは、Spring Data MongoDBによる開発の簡素化です。Spring Data JPAがRDBへのアクセスを容易にするのと同様に(参考資料:Spring Data JPA)、Spring Data MongoDBはMongoDBに対するCRUD(Create, Read, Update, Delete)操作を、アオブジェクト指向のインターフェースを通じて直感的に行えるようにします。複雑なSQLを記述することなく、JavaのPOJO(Plain Old Java Object)を直接ドキュメントとして扱えるため、開発効率が飛躍的に向上します。
また、MongoDBは高いスケーラビリティと可用性を持ち、ビッグデータやリアルタイムアプリケーションなど、大量のデータを扱うシステムで真価を発揮します。Spring BootのリアクティブプログラミングモデルであるSpring WebFluxとの相性も良く、非同期・ノンブロッキングなデータアクセスをシームレスに実現できる点も魅力です。(参考資料:Spring WebFlux)
Spring Data MongoDBによるデータアクセス実装
Spring BootでMongoDBを利用するには、まずspring-boot-starter-data-mongodb依存関係をプロジェクトに追加します。これにより、必要なライブラリが自動的に設定されます。
データアクセス層の実装は、以下の手順で進めます。
- エンティティの定義: MongoDBのドキュメントにマッピングされるJavaクラスを定義します。クラスに
@Documentアノテーションを付与し、フィールドに@Idアノテーションを付与することで、主キーを指定できます。 - リポジトリの作成:
MongoRepositoryインターフェースを継承した独自のインターフェースを作成します。Spring Data MongoDBは、このインターフェースを通じて基本的なCRUD操作を自動的に提供します。例えば、UserRepository extends MongoRepository<User, String>のように定義することで、ユーザーの保存、検索、更新、削除といった操作がメソッド名から自動生成されます。 - リポジトリの利用: 作成したリポジトリをサービス層やコントローラ層に
@Autowiredで注入し、メソッドを呼び出すだけでデータベース操作が行えます。
また、より複雑なクエリやアグリゲーション操作が必要な場合は、MongoTemplateを利用することで、より細やかな制御が可能です。これにより、データベースとのインタラクションが大幅に簡素化され、開発者はビジネスロジックに集中できるようになります。(参考資料:Spring Boot 公式ドキュメント)
トランザクション管理とパフォーマンス最適化のヒント
MongoDBは長らくシングルドキュメントのACID特性しかサポートしていませんでしたが、バージョン4.0以降でマルチドキュメントトランザクションに対応しました。Spring Bootでは、適切な設定(レプリカセットまたはシャードクラスター環境)を行うことで、RDBと同様に@Transactionalアノテーションを用いてトランザクションを管理できます。これにより、複数のドキュメントにまたがる一連の操作をアトミックに実行し、データの一貫性を保証することが可能です。
パフォーマンスを最適化するためには、いくつかの重要なポイントがあります。
- インデックスの活用: クエリの検索速度を向上させるために、頻繁に検索条件として使われるフィールドにインデックスを貼ることが不可欠です。Spring Data MongoDBでは、エンティティのフィールドに
@Indexedアノテーションを付与するだけでインデックスを作成できます。複合インデックスも利用して、特定のクエリパターンに最適化することも検討しましょう。 - クエリの最適化: 必要最小限のフィールドのみを取得するProjectionや、データの集計・変換に特化したAggregation Frameworkを積極的に利用することで、ネットワークトラフィックとデータベースの負荷を軽減できます。
- キャッシング: 頻繁にアクセスされるが更新頻度が低いデータをキャッシュすることで、データベースへの問い合わせ回数を減らし、アプリケーションの応答速度を向上させます。Spring Cacheとの連携も有効な手段です。
これらの手法を組み合わせることで、MongoDBを利用したSpring Bootアプリケーションの信頼性と性能を最大限に引き出すことができます。
複数のデータソースをSpring Bootで管理するテクニック
なぜ複数のデータソースが必要なのか
現代のエンタープライズアプリケーションでは、単一のデータベースで全てのデータを管理することが稀になっています。複数のデータソースが必要となる背景には、以下のような理由があります。
- マイクロサービスアーキテクチャ: 各サービスが独立したデータベースを持つ「データベース・パー・サービス」パターンを採用する場合、アプリケーションは複数のデータベースにアクセスする必要があります。
- レガシーシステムとの連携: 既存のレガシーシステムが特定のデータベースを使用しており、新しいSpring Bootアプリケーションがそのデータにアクセスする必要がある場合。
- データの特性に応じた最適化: トランザクション処理に強いRDBと、大量の非構造化データ処理に強いNoSQLデータベースを併用するなど、データの種類や用途に応じて最適なデータベース技術を選択する場合。
- 読み書き分離(マスター/スレーブ構成): 高負荷なシステムで、書き込みはマスターDB、読み込みはスレーブDBと分離することで、パフォーマンスとスケーラビリティを向上させる場合。
これらのシナリオにおいて、Spring Bootアプリケーションが複数のデータソースを効率的に管理できることは、柔軟で堅牢なシステム構築の鍵となります。
Spring Bootにおけるデータソース設定の基本
Spring Bootは通常、単一のデータソースを自動設定しますが、複数のデータソースを扱う場合は、手動で設定を定義する必要があります。基本的な設定方法は以下の通りです。
- 設定ファイルの記述:
application.propertiesやapplication.ymlに、各データソースの接続情報を記述します。例えば、spring.datasource.primary.*とspring.datasource.secondary.*のように、プレフィックスを分けて定義します。 @Configurationクラスによる定義:@Configurationアノテーションを付与した設定クラスを作成し、各データソースに対応するDataSource、EntityManagerFactory、PlatformTransactionManagerのBeanを定義します。
各データソースのBeanを区別するために、@Primaryアノテーションをデフォルトとして使用するデータソースに付与し、他のデータソースには@Qualifierアノテーションで一意の名前を付けます。これにより、依存性注入の際にどのデータソースを使用するかを明示的に指定できるようになります。
@Bean定義の際には、適切なJDBCドライバの依存関係をpom.xmlに追加することを忘れないでください。例えば、MySQLとPostgreSQLを併用する場合は、それぞれのJDBCドライバが必要です。
トランザクション管理とデータソースルーティング
複数のデータソースを扱う上で、最も複雑になりがちなのがトランザクション管理です。Spring Bootでは、各データソースに対して個別のPlatformTransactionManagerを定義し、@Transactionalアノテーションのvalue属性やtransactionManager属性で、どのトランザクションマネージャーを使用するかを指定できます。これにより、特定のビジネスロジックがどのデータベースに対するトランザクションとして実行されるかを制御できます。
さらに、複数のデータソースにまたがるトランザクション(分散トランザクション)が必要な場合は、XAトランザクションやJTA(Java Transaction API)の利用を検討する必要があります。ただし、XAトランザクションは複雑性が高く、パフォーマンスオーバーヘッドも大きいため、可能な限りSAGAパターンのようなベストエフォート型のトランザクション管理パターンや、ビジネス要件を考慮した最終的な一貫性モデルを採用することも有効です。
特定の条件に基づいて動的にデータソースを切り替えたい場合は、Spring Frameworkが提供するAbstractRoutingDataSourceを活用できます。これは、実行時のコンテキスト情報(例:スレッドローカル変数、ユーザー情報)に基づいて、使用する実際のDataSourceを決定する機能です。これにより、読み書き分離のようなシナリオや、テナントごとにデータベースを切り替えるマルチテナントアプリケーションにおいて、柔軟なデータアクセス層を構築することが可能になります。
Spring BootとRabbitMQ:非同期処理とメッセージングの実践
RabbitMQとは? メッセージングの基礎
RabbitMQは、メッセージキューイングシステム(メッセージブローカー)の一種で、AMQP(Advanced Message Queuing Protocol)を実装しています。アプリケーション間でメッセージを非同期にやり取りする仕組みを提供し、システムの疎結合化とスケーラビリティ向上に貢献します。
メッセージングシステムの主なメリットは以下の通りです。
- 疎結合性: 送信者(Producer)と受信者(Consumer)が直接通信せず、RabbitMQを介してメッセージをやり取りするため、お互いの存在を知る必要がありません。これにより、システムコンポーネントの独立性が高まります。
- 非同期処理: 時間のかかる処理をメッセージとしてキューに投入し、後でConsumerが処理することで、Producerはすぐに次の処理に進むことができます。ユーザーインターフェースの応答性向上などに役立ちます。
- 負荷分散とスケーラビリティ: 複数のConsumerが同じキューからメッセージを処理することで、処理能力を容易にスケールアウトできます。
- 信頼性: メッセージの永続化機能や確認応答(ACK/NACK)メカニズムにより、システム障害時でもメッセージの紛失を防ぎ、確実に処理されることを保証します。
RabbitMQでは、Producerがメッセージをエクスチェンジに送り、エクスチェンジはルーティングキーに基づいてメッセージを一つまたは複数のキューにルーティングします。そして、Consumerはキューからメッセージを受け取って処理します。
Spring AMQPによるメッセージの送受信
Spring BootでRabbitMQを扱うには、spring-boot-starter-amqp依存関係を利用します。このスターターは、RabbitMQクライアントライブラリとSpring AMQP(Advanced Message Queuing Protocol)を提供し、メッセージング操作をSpringの流儀で簡潔に記述できるようにします。
メッセージの送信は、RabbitTemplateを使用します。このクラスは、メッセージをエクスチェンジにルーティングキーを指定して送信するための便利なメソッドを提供します。例えば、rabbitTemplate.convertAndSend("exchangeName", "routingKey", messageObject)のように記述することで、Javaオブジェクトをシリアライズしてメッセージとして送信できます。
メッセージの受信側(Consumer)は、@RabbitListenerアノテーションを付与したメソッドで実装します。このアノテーションは、特定のキューからのメッセージを自動的にリッスンし、メソッドの引数としてメッセージオブジェクトを受け取ることができます。Spring Bootは、アプリケーション起動時に@RabbitListenerが定義されたコンポーネントを検出し、必要な設定(キューの宣言、バインディングなど)を自動的に行ってくれます。
また、メッセージをJSON形式で送受信したい場合は、Jackson2JsonMessageConverterを設定することで、オブジェクトのシリアライズ・デシリアライズを自動化でき、異なる言語で書かれたアプリケーション間での連携も容易になります。
信頼性の高いメッセージ処理とエラーハンドリング
非同期メッセージングシステムにおいて、メッセージが確実に処理されることは非常に重要です。Spring AMQPとRabbitMQは、高い信頼性を実現するためのメカニズムを提供します。
- 確認応答(ACK/NACK): Consumerがメッセージを正常に処理したことをRabbitMQに通知するACKと、処理に失敗したことを通知するNACKがあります。NACKの場合、メッセージをキューに戻して再試行させたり、他のConsumerに再配信させたりできます。
- デッドレターキュー(DLQ): 何度かの再試行後も処理できなかったメッセージは、専用のデッドレターエクスチェンジとデッドレターキューにルーティングされます。これにより、問題のあるメッセージがメインキューをブロックするのを防ぎ、後から手動で調査・処理することが可能になります。
- メッセージの永続化: RabbitMQのメッセージは、ディスクに永続化する設定が可能です。これにより、RabbitMQサーバーがクラッシュしても、キュー内のメッセージが失われるのを防ぎます。
- Publisher ConfirmsとReturn Messages: ProducerがメッセージをRabbitMQに送信した際、RabbitMQがメッセージを受信したことを確認したり、ルーティングに失敗した場合にProducerに通知したりする機能です。これにより、メッセージの紛失リスクを最小限に抑えられます。
Spring Retryライブラリと連携することで、Consumerでのメッセージ処理失敗時に、指数バックオフや最大試行回数を指定した自動リトライメカニズムを簡単に実装できます。これらの機能を適切に組み合わせることで、堅牢で信頼性の高い非同期処理システムを構築できます。
Spring BootとMinIO:外部ファイルストレージとの連携
MinIOとは? オブジェクトストレージの活用
MinIOは、Amazon S3と互換性のあるオープンソースの高性能オブジェクトストレージサーバーです。クラウド環境だけでなく、オンプレミス環境やプライベートクラウド環境でも利用できるため、データ主権やセキュリティ要件が厳しいケースで特に重宝されます。
オブジェクトストレージは、従来のファイルシステムやブロックストレージとは異なり、非構造化データを「オブジェクト」として管理します。各オブジェクトは一意のキーとメタデータを持っており、HTTP/HTTPSプロトコルを通じてアクセスされます。その主なメリットは以下の通りです。
- スケーラビリティ: データの量が増えても、簡単に容量を拡張できます。数テラバイトからペタバイト級のデータにも対応可能です。
- コスト効率: 大容量のデータを低コストで保存できる設計になっています。
- 可用性と耐久性: データは分散して保存されるため、単一障害点のリスクが低く、高い可用性と耐久性を実現します。
- 柔軟性: ファイルの種類やサイズに制限がなく、画像、動画、ログ、バックアップデータなど、あらゆる非構造化データを保存できます。
MinIOは、これらのオブジェクトストレージのメリットをオンプレミスで享受したい場合に理想的な選択肢です。Spring BootアプリケーションからMinIOを利用することで、外部ファイルストレージを効率的に活用し、アプリケーションのメインストレージの負荷を軽減し、スケーラブルなファイル管理を実現できます。
Spring Bootアプリケーションからのファイル操作
Spring BootアプリケーションからMinIOを操作する場合、MinIOがAWS S3 APIと互換性があるため、AWS SDK for Java 2.x(特にS3クライアント)を利用するのが一般的です。これにより、S3とMinIOの間でコードの大きな変更なしに切り替えが可能になります。
具体的なファイル操作の手順は以下の通りです。
- 依存関係の追加:
software.amazon.awssdk:s3をpom.xmlに追加します。 S3Clientの設定:@ConfigurationクラスでS3ClientのBeanを定義します。MinIOのエンドポイントURL、アクセスキー、シークレットキーを設定することで、MinIOサーバーと通信できるようになります。- ファイルのアップロード:
PutObjectRequestを作成し、s3Client.putObject(putObjectRequest, RequestBody.fromInputStream(inputStream, contentLength))を使用してファイルをアップロードします。 - ファイルのダウンロード:
GetObjectRequestを作成し、s3Client.getObject(getObjectRequest)でファイルの内容をストリームとして取得します。 - プレ署名付きURLの生成: 一時的にファイルへのアクセスを許可したい場合は、
S3Presignerを使用して署名付きURLを生成します。これにより、認証情報なしに指定された期間だけファイルにアクセス可能なURLを発行できます。
これらの機能を利用することで、Spring Bootアプリケーションから画像をアップロードしたり、ドキュメントをダウンロードしたりといった外部ファイル連携を容易に実装できます。
スケーラビリティとセキュリティを考慮した実装
MinIOとSpring Bootアプリケーションを連携させる際、スケーラビリティとセキュリティは重要な考慮事項です。
- スケーラビリティ: MinIO自体は分散モードで動作し、複数のノードにデータを分散して保存することで、高いスケーラビリティと耐障害性を実現します。Spring Bootアプリケーションも、ロードバランサー配下に複数のインスタンスを配置することで、クライアントからのリクエスト増大に対応できます。MinIOへのアクセスはRESTful APIであるため、アプリケーションの水平スケールと相性が良いです。
- セキュリティ:
- アクセス制御: MinIOは、AWS S3と同様にIAM(Identity and Access Management)ポリシーをサポートしており、ユーザーやグループに対してバケットやオブジェクトレベルでのきめ細やかなアクセス権限を設定できます。アプリケーションからは、必要な権限を持つアクセスキーとシークレットキーを使用するように設定します。
- データ暗号化: 保存されるデータの機密性を保護するため、MinIOはサーバーサイド暗号化(SSE-S3、SSE-KMS、SSE-C)をサポートしています。また、アプリケーション側で暗号化を行ってからアップロードするクライアントサイド暗号化も可能です。
- セキュアな通信: MinIOサーバーとSpring Bootアプリケーション間の通信は、TLS/SSLを使用して暗号化するべきです。MinIO自体もHTTPSをサポートしています。
アプリケーションの設定(MinIOのエンドポイント、認証情報など)は、application.propertiesや環境変数、またはSpring Cloud Configのような外部設定管理ツールを使用して安全に管理し、本番環境では秘匿情報がコードベースに含まれないように注意しましょう。これにより、セキュアでスケーラブルなファイルストレージ連携を実現できます。
Spring Bootでの国際化(i18n)とメール送信機能
国際化(i18n)の基本とSpring Bootでの実装
国際化(Internationalization, i18n)とは、アプリケーションを複数の言語や地域に対応させるための設計・実装プロセスです。Spring Bootは、Spring Frameworkの強力な国際化機能を活用し、多言語対応アプリケーションの開発を容易にします。
Spring Bootでの国際化の基本は、以下の要素で構成されます。
MessageSource: アプリケーションのメッセージ(UIテキスト、エラーメッセージなど)を外部ファイルから読み込むためのインターフェースです。Spring Bootでは、デフォルトでResourceBundleMessageSourceが設定され、src/main/resourcesディレクトリ配下のmessages.properties(デフォルト言語)、messages_ja.properties(日本語)、messages_en.properties(英語)といったプロパティファイルからメッセージをロードします。LocaleResolver: 現在のリクエストのロケール(言語と地域)を解決するためのインターフェースです。Spring Bootは、Accept-Languageヘッダ、セッション、クッキー、またはリクエストパラメータなどからロケールを解決する複数の実装を提供します。例えば、SessionLocaleResolverやCookieLocaleResolverがよく使われます。
テンプレートエンジン(例:Thymeleaf)を使用する場合、特別なタグや構文(例:<span th:text="#{welcome.message}"></span>)を使ってプロパティファイルからメッセージを参照できます。これにより、言語ごとに異なるメッセージを動的に表示し、ユーザーエクスペリエンスを向上させることができます。
日付や通貨などの地域固有のフォーマットも、JavaのLocaleクラスと適切なフォーマッターを使用することで対応可能です。
メール送信機能の実装とテンプレート活用
Spring Bootでメール送信機能を実装するには、spring-boot-starter-mail依存関係を追加します。このスターターは、JavaMailSenderFactoryを設定し、JavaMailSenderインターフェースを提供します。このインターフェースを通じて、SMTPサーバー経由でメールを送信できます。
application.propertiesにSMTPサーバーのホスト、ポート、ユーザー名、パスワード、SSL/TLS設定などを記述するだけで、JavaMailSenderが自動的に設定されます。
メール送信ロジックは以下のようになります。
MimeMessageの作成:JavaMailSenderからMimeMessageHelperを使用して、送信者、受信者、件名、本文、添付ファイルなどを設定します。HTML形式のメールを送信する場合は、mimeMessageHelper.setText(htmlContent, true)のように設定します。- メールテンプレートの活用: 本文をハードコーディングするのではなく、ThymeleafやFreeMarkerなどのテンプレートエンジンを利用して、動的なHTMLメールテンプレートを作成することが推奨されます。これにより、メールの内容を構造化し、ビジネスロジックと分離して管理できます。例えば、ユーザー名や注文番号などをテンプレートのプレースホルダーに埋め込むことが可能です。
- メールの送信: 設定した
MimeMessageをjavaMailSender.send(mimeMessage)で送信します。
これにより、ユーザー登録時の確認メール、パスワードリセット、注文完了通知など、様々な種類の通知メールをアプリケーションから簡単に送信できるようになります。
多言語対応メールと非同期送信のベストプラクティス
アプリケーションが多言語に対応している場合、メールもユーザーのロケールに合わせて送信することが求められます。
- 多言語メールテンプレート: 各言語に対応したメールテンプレート(例:
welcome_ja.html,welcome_en.html)を用意し、ユーザーのロケールに基づいて適切なテンプレートを選択してレンダリングします。Thymeleafは、Localeオブジェクトをテンプレートに渡すことで、メッセージプロパティファイルと連携して多言語テキストを埋め込む機能も持っています。 - 非同期メール送信: メール送信はネットワークI/Oを伴うため、完了までに時間がかかる場合があります。ユーザーエクスペリエンスを損なわないよう、メール送信処理を非同期で実行することがベストプラクティスです。Spring Bootでは、メソッドに
@Asyncアノテーションを付与し、@EnableAsyncをメインクラスに設定することで、簡単に非同期処理を実現できます。これにより、メール送信がバックグラウンドスレッドで実行され、メインのアプリケーションフローがブロックされるのを防ぎます。 - エラーハンドリングと再試行: 非同期でメールを送信する場合、送信失敗時のエラーハンドリングも重要です。適切なログ記録はもちろん、Spring Retryなどと組み合わせて自動再試行メカニズムを実装することで、メールの送信成功率を高めることができます。
- メールログの記録: 監査目的やトラブルシューティングのために、送信されたメールの内容、送信日時、受信者、ステータスなどをデータベースやログファイルに記録しておくことを推奨します。
これらのアプローチにより、Spring Bootアプリケーションのメール送信機能をより堅牢でユーザーフレンドリーなものにすることができます。
Spring Bootはその強力なエコシステムと豊富な機能により、現代の複雑なアプリケーション開発を強力にサポートします。本記事で紹介したMongoDB連携、複数データソース管理、RabbitMQによるメッセージング、MinIOとのファイル連携、国際化・メール送信機能は、その多機能性の一端に過ぎません。
Spring Bootは、その「自動設定」と「スターター依存関係」の仕組みにより、開発環境のセットアップや依存関係の管理を大幅に簡素化します。これにより、開発者は複雑な設定に時間を費やすことなく、コアとなるビジネスロジックの開発に集中できます。(参考情報:Spring Boot 公式ドキュメント)
公式ドキュメントやチュートリアルも充実しており、学習リソースが豊富です。最新のバージョン情報や互換性については、Spring BootおよびSpring Cloudの公式ドキュメントを参照することが推奨されます。(参考情報:Spring Framework ドキュメント、Spring Boot 公式ドキュメント、Spring Cloud)
まとめ
よくある質問
Q: Spring BootでMongoDBを使うメリットは何ですか?
A: Spring BootとMongoDBを連携させることで、スキーマレスなNoSQLデータベースの柔軟性を活かしつつ、開発を迅速に進めることができます。Spring Data MongoDBを使えば、リポジトリパターンでデータアクセス層を簡潔に記述できます。
Q: Spring Bootで複数のデータソースを扱うにはどうすれば良いですか?
A: Spring Bootで複数のデータソースを扱うには、`@ConfigurationProperties`アノテーションや、`DataSourceBuilder`、`JpaVendorAdapter`などを利用して、各データソースの設定を定義し、`@Bean`として登録します。これにより、目的に応じたデータソースを切り替えて利用できます。
Q: Spring BootでRabbitMQを導入する利点は?
A: Spring BootにRabbitMQを導入することで、アプリケーション間の非同期通信やマイクロサービス間でのメッセージングを効率的に実現できます。これにより、システムの応答性を向上させ、スケーラビリティを高めることが可能です。
Q: MinIOはSpring Bootとどのように連携できますか?
A: Spring BootからMinIOを利用するには、MinIOクライアントライブラリを依存関係に追加し、設定ファイルでMinIOサーバーのURLや認証情報を定義します。これにより、オブジェクトストレージへのファイルのアップロード、ダウンロード、削除などをSpring Bootアプリケーションから容易に行えるようになります。
Q: Spring BootでCSVファイルを読み込む簡単な方法はありますか?
A: Spring BootでCSVファイルを読み込むには、Apache Commons CSVやOpenCSVといったライブラリを利用するのが一般的です。これらのライブラリを依存関係に追加し、`ResourceLoader`などを使ってファイルを読み込み、行ごとにパースして処理します。Spring Bootの`@Value`アノテーションで外部ファイルパスを指定することも可能です。