NRIネットコム社員が様々な視点で、日々の気づきやナレッジを発信するメディアです

注目のタグ

    Java初心者🔰がSpring Bootアノテーションまとめてみた

    はじめまして、今年の4月にNRIネットコムに入社した新入社員の山田真琴と申します。
    4ヶ月の新人研修後に、8月頭からNTシステム事業一部に配属され、だんだん業務にも慣れてきた今日この頃です。

    私は理系院卒ではありますが、化学出身で学生時代にはプログラミングについての知識はほとんどありませんでした。
    (内定決定後Progateを触ったり、授業で少し学んだことがある程度)
    ですが、新人研修でJavaをしっかり基礎の基礎から教えて頂いたおかげで、今は周辺のコードを見ながら軽めの修正くらいなら一人でできるようになるまで成長し、結構楽しみながら開発業務に取り組めています。

    業務としては、WEBアプリケーションの開発を行っています。
    言語はJavaがメインですが、フロント側も触るのでJavaScriptやHTMLも触れることが多いです。

    今は楽しく開発業務をおこなえている私ですが、配属後に一番最初につまずいたいたポイントがSpring Bootのアノテーションです。
    Spring Bootは、Javaを用いたアプリケーション開発をスムーズに行うためのフレームワークです。
    アノテーションは訳すと「注釈」であり、Copilot曰くJavaコードに特別な意味や動作を付加するための記述方法だそうです。
    (自身が調べた内容と乖離はしていないように感じます。)
    アノテーションはクラス、メソッド、フィールドなどに付与することができます。

    今後の自身のためにも、開発コード内でよく見るアノテーションについてまとめてみます。

    1. Spring Bootの層構造

    WEBアプリケーション開発ではレイヤー構造で役割を分けるべきという話を聞いたことがありますが、わたしの参画しているプロジェクトでは以下のような層構造を持ちます。
    これらの層のクラスであることを示すアノテーションをまとめました。

    Spring Bootの層構造の概要
    @Controller
    @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側でいろいろやってくれるのでコードで追うことができず、当時は???でいっぱいでした。
    初対面の印象はあまりいいものではありませんでしたが、今後はばりばり使いこなしていきたいです!

    ひとりごと

    チームメンバーや周囲の皆様がとにかくやさしく、困ったら助けて頂けるいい環境なので、のびのびと楽しくコードを書けています。
    好きこそものの上手なれという言葉の通り、物事の習得には楽しさを感じることができればどんどん上達するように思います。
    楽しさを大切に、今後も様々なことを吸収し、来年の今頃には一人でサクサクコードをかけるようになっていたいものですね…。
    とにかくゴリゴリコードを書いて、早く一人でコードを書けるようになれるように頑張ります!

    ここまで読んで下さり、ありがとうございました!

    執筆者:山田真琴
    2025年入社のWebアプリエンジニア
    はやく一人でコードをバリバリ書けるようになりたいです。