
はじめまして、今年の4月にNRIネットコムに入社した新入社員の山田真琴と申します。
4ヶ月の新人研修後に、8月頭からNTシステム事業一部に配属され、だんだん業務にも慣れてきた今日この頃です。
私は理系院卒ではありますが、化学出身で学生時代にはプログラミングについての知識はほとんどありませんでした。
(内定決定後Progateを触ったり、授業で少し学んだことがある程度)
ですが、新人研修でJavaをしっかり基礎の基礎から教えて頂いたおかげで、今は周辺のコードを見ながら軽めの修正くらいなら一人でできるようになるまで成長し、結構楽しみながら開発業務に取り組めています。
業務としては、WEBアプリケーションの開発を行っています。
言語はJavaがメインですが、フロント側も触るのでJavaScriptやHTMLも触れることが多いです。
今は楽しく開発業務をおこなえている私ですが、配属後に一番最初につまずいたいたポイントがSpring Bootのアノテーションです。
Spring Bootは、Javaを用いたアプリケーション開発をスムーズに行うためのフレームワークです。
アノテーションは訳すと「注釈」であり、Copilot曰くJavaコードに特別な意味や動作を付加するための記述方法だそうです。
(自身が調べた内容と乖離はしていないように感じます。)
アノテーションはクラス、メソッド、フィールドなどに付与することができます。
今後の自身のためにも、開発コード内でよく見るアノテーションについてまとめてみます。
1. Spring Bootの層構造
WEBアプリケーション開発ではレイヤー構造で役割を分けるべきという話を聞いたことがありますが、わたしの参画しているプロジェクトでは以下のような層構造を持ちます。
これらの層のクラスであることを示すアノテーションをまとめました。

@Service
@Repository
この3つのアノテーションは、それぞれの層のクラスであることをSpring Bootに伝える役割を持ちます。
また、インスタンス化され、DIコンテナにBeanとして登録されます。
2. WEBページとの連携
次に、ブラウザからのHTTPリクエストとJavaのクラスをマッピングさせる際に利用するアノテーションについてまとめてみました。
これらは原則Controller層のメソッドに付与されます。
@RequestMapping
URLからのリクエストとメソッドをマッピングする役割を持ちます。
アノテーションを付与したメソッドで、紐づけたURLから送信されるリクエストを受け取ることができます。
(Get・Post・Put・Deleteなど)
@RequestMapping ( value = "/form" )
また、methodオプションにより指定した各種リクエストを受け取ることができます。
↓の場合では、Getのみリクエスト受信可能です。
@RequestMapping ( value = "/form", method = RequestMethod.GET )
@GetMapping
URLからのGetリクエストとメソッドをマッピングする役割を持ちます。
アノテーションを付与したメソッドで、紐づけたURLから送信されるリクエストを受け取ることができます。
(Getのみリクエスト受信可能)
@GetMapping ( value = "/form" )
@PostMapping
URLからのPostリクエストとメソッドをマッピングする役割を持ちます。
アノテーションを付与したメソッドで、紐づけたURLから送信されるリクエストを受け取ることができます。
(Postのみリクエスト受信可能)
@PostMapping ( value = "/form" )
@RequestParam
URLからのリクエストの値(パラメータ)を取得することができます。
@GetMapping ( value = "/form" )
public String XXX ( @RequestParam ( "id" ) final String id ){
…
@ModelAttribute
紐付けたURLで送信されたリクエストを受け取り、Javaのインスタンスに同パラメータ名のデータをセット(バインディング)できます。
↓の場合では、Form型のインスタンスである変数formにデータを詰めて、Javaクラスで受け取ることができます。
@GetMapping ( value = "/form" )
public String XXX ( @ModelAttribute ( "form" ) final Form form ){
…
3. DI(依存性注入)
次に、依存性を注入する際に利用するアノテーションについてまとめてみました。
DIとはDependency Injectionの頭文字をとった略称であり、日本語訳すると依存性注入です。外部のオブジェクトを利用する際に、DIを用いることでクラス間の結合が弱まりテストが簡単になるなどのメリットがあります。
今回は、詳しい説明は省略させていただきます。
@Bean
@Configurationが付与されたクラス内のメソッドに付与することで、メソッドの戻り値がDIコンテナにBeanとして登録されます。
@Configuration
クラスに付与することで、@Beanが付与されたメソッドの戻り値をBeanとしてDIコンテナに登録できます。
@Configuration
public class XXX {
@Bean
public Form form () {
return new Form ();
}
}
@Component
クラスに付与することで、クラスのインスタンスが生成され、DIコンテナにBeanとして登録されます。
@Autowired
DIするコンストラクタもしくはフィールドに付与すると、変数に依存性を注入できます。
ここでは、コンストラクタインジェクションとフィールドインジェクションを紹介します。
上で触れたアノテーションに加えて、@Controller @Service @Repository を付与したクラスはインスタンスが生成され、DIコンテナにBeanとして登録されます。
3-1. コンストラクタインジェクション
コンストラクタに付与して、依存性を注入します。finalで宣言できるため不変性を保証できることなどがメリットです。
// コンストラクタインジェクション
public class XXX {
private final Form form;
@Autowired
public XXX ( Form form ) {
this.form = form;
}
}
このコードは@RequiredArgsConstructor(finalフィールドのインスタンスを生成するアノテーション)を用いて、以下のように省略して記載できます。
@RequiredArgsConstructor
public class XXX {
private final Form form;
}
3-2. フィールドインジェクション
フィールドに付与して、依存性を注入します。finalで宣言できないため変更されるリスクがあります。
// フィールドインジェクション
public class XXX {
@Autowired
private Form form;
}
他にも調べるとたくさん出てきますが、ここで力尽きたのでまた増やしていければと思います。
アノテーションはとっても便利なのですが、Spring Boot側でいろいろやってくれるのでコードで追うことができず、当時は???でいっぱいでした。
初対面の印象はあまりいいものではありませんでしたが、今後はばりばり使いこなしていきたいです!
ひとりごと
チームメンバーや周囲の皆様がとにかくやさしく、困ったら助けて頂けるいい環境なので、のびのびと楽しくコードを書けています。
好きこそものの上手なれという言葉の通り、物事の習得には楽しさを感じることができればどんどん上達するように思います。
楽しさを大切に、今後も様々なことを吸収し、来年の今頃には一人でサクサクコードをかけるようになっていたいものですね…。
とにかくゴリゴリコードを書いて、早く一人でコードを書けるようになれるように頑張ります!
ここまで読んで下さり、ありがとうございました!