Spring Framework完全ガイド:基礎から実践まで学ぶ7つのステップ

目次

目次へ

はじめに:Spring Frameworkの世界へようこそ

Spring Frameworkは、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークで、エンタープライズ級アプリケーションの開発を容易にする強力なツールです。その核心には、依存性注入(DI)と制御の反転(IoC)という革新的な概念があり、これらがSpring Frameworkの基盤となっています。

Spring Frameworkとは何か?簡単な定義と主な特徴

Spring Frameworkの主な特徴は以下の通りです:

主な特徴
  • アスペクト指向プログラミング(AOP)のサポート
  • MVC Webフレームワーク
  • データアクセスフレームワーク
  • トランザクション管理
  • RESTful Webサービスのサポート
  • 認証と認可
  • テスティングサポート

これらの機能により、開発者は複雑なビジネスロジックに集中し、インフラストラクチャの懸念事項から解放されます。

なぜSpring Frameworkを学ぶべきか?開発者のキャリアにもたらす価値

Spring Frameworkを習得することは、Javaエンジニアとしてのキャリアに大きな価値をもたらします:

  1. 効率的な開発プロセスにより、生産性が向上します。
  2. スケーラブルで保守性の高いアプリケーション設計スキルが身につきます。
  3. 多くの企業がSpring Frameworkを採用しているため、求人の機会が豊富です。
  4. 継続的な学習と成長の機会が得られ、最新のJava開発トレンドに適応できます。
  5. エンタープライズ開発スキルが向上し、より複雑なプロジェクトに挑戦できるようになります。

この記事では、Spring Frameworkの基礎から実践的な使用方法まで、7つのステップで詳しく解説していきます。あなたのJava開発スキルを次のレベルに引き上げる準備はできていますか?では、始めましょう!

ステップ1:Spring Frameworkの基本概念を理解する

Spring Frameworkの強力さの秘密は、その核心にある革新的な設計原則にあります。ここでは、フレームワークの基盤となる重要な概念を探ります。

IoC(制御の反転)とDI(依存性の注入)の重要性

IoC(制御の反転)

IoC(Inversion of Control)は、オブジェクトの生成や管理をフレームワークに委ねる設計原則です。これにより以下の利点が得られます:

  • コードの結合度低下:クラス間の依存関係が疎結合になります。
  • テストの容易さ:モックオブジェクトを使用したユニットテストが簡単になります。
  • コードの再利用性向上:コンポーネントの独立性が高まり、再利用しやすくなります。

DI(依存性の注入)

DIは、IoCを実現する具体的な方法で、必要な依存オブジェクトを外部から注入します。主に以下の3種類があります:

  1. コンストラクタインジェクション
  2. セッターインジェクション
  3. フィールドインジェクション

DIの主な利点は以下の通りです:

  • モジュール間の結合度低下:オブジェクト間の依存関係が明示的になります。
  • コードの柔軟性と保守性向上:依存関係の変更が容易になります。

アノテーションベースの設定と自動構成の利点

Spring Frameworkは、アノテーションを使用して設定を簡素化します。主要なアノテーションには以下があります:

  • @Component: クラスをSpringのコンポーネントとして定義
  • @Autowired: 依存性の自動注入
  • @Configuration: 設定クラスの定義
  • @Bean: メソッドの戻り値をBeanとして登録

アノテーションベースの設定には以下の利点があります:

  • XMLファイルの管理が不要:設定がJavaコード内に統合されます。
  • 型安全性の向上:コンパイル時にエラーを検出できます。
  • IDEのサポートが充実:コード補完や参照チェックが可能になります。

さらに、Spring Bootは自動構成機能を提供し、一般的な設定を自動的に行います。これにより:

  • 開発の迅速化:基本的な設定を省略できます。
  • 設定の一貫性確保:プロジェクト間で統一された設定が可能です。
  • ベストプラクティスの適用が容易:推奨される設定が自動的に適用されます。

これらの概念を理解し活用することで、Spring Frameworkの真の力を引き出し、効率的で柔軟なアプリケーション開発が可能になります。

ステップ2:開発環境をセットアップし、初めてのSpringアプリケーションを作成

Spring Frameworkを使い始めるには、適切な開発環境のセットアップが不可欠です。ここでは、必要なツールのインストールから、初めてのSpringアプリケーションの作成まで、順を追って説明します。

必要なツールとライブラリのインストール手順

  1. Java Development Kit (JDK)
    • バージョン: 11以上
    • インストール手順:
      • Oracle公式サイトからJDKをダウンロード
      • インストーラーを実行し、指示に従ってインストール
      • 環境変数JAVA_HOMEを設定し、JavaのbinディレクトリをシステムのPathに追加
  2. Maven
    • バージョン: 3.6.3以上
    • インストール手順:
      • Maven公式サイトからバイナリzipをダウンロード
      • ダウンロードしたzipを解凍し、任意の場所に配置
      • 環境変数M2_HOMEを設定し、MavenのbinディレクトリをシステムのPathに追加
  3. 統合開発環境 (IDE)
    • 推奨: IntelliJ IDEA, Eclipse, または Spring Tool Suite
    • インストール手順: 各IDEの公式サイトからダウンロードし、インストーラーの指示に従ってインストール

「Hello, Spring!」プロジェクトの作成とデプロイ

  1. Spring Initializrを使用したプロジェクト作成
    • Spring Initializrにアクセス
    • 以下の設定を選択:
      • Project: Maven
      • Language: Java
      • Spring Boot: 2.5.x
      • Project Metadata: 適切な値を入力
      • Dependencies: Spring Web
    • “Generate”ボタンをクリックし、ZIPファイルをダウンロード
  2. プロジェクトの構造と主要ファイル
    • ZIPファイルを解凍し、IDEでプロジェクトを開く
    • 主要ファイル:
      • pom.xml: プロジェクトの依存関係と設定
      • src/main/java/com/example/demo/Application.java: メインクラス
      • src/main/java/com/example/demo/HelloController.java: コントローラークラス
  3. HelloControllerの作成
    以下のコードをHelloController.javaに追加:
   package com.example.demo;

   import org.springframework.web.bind.annotation.GetMapping;
   import org.springframework.web.bind.annotation.RestController;

   @RestController
   public class HelloController {

       @GetMapping("/")
       public String hello() {
           return "Hello, Spring!";
       }
   }
  1. アプリケーションのビルドと実行
    • ビルドコマンド: mvn clean package
    • 実行コマンド: java -jar target/demo-0.0.1-SNAPSHOT.jar
    • ブラウザでhttp://localhost:8080にアクセスし、”Hello, Spring!”メッセージを確認

トラブルシューティングのヒント

  • ポート競合: 8080ポートが使用中の場合、application.propertiesserver.port=8081を追加
  • 依存関係の問題: mvn dependency:treeで依存関係を確認し、必要に応じてpom.xmlを更新
  • JDKバージョンの確認: java -versionコマンドで使用中のJavaバージョンを確認

これで、初めてのSpringアプリケーションが正常に動作しました。次のステップでは、Spring IoC コンテナとDependency Injectionについて深く学び、アプリケーションの構造をさらに理解していきます。

ステップ3:Spring IoC コンテナとDependency Injectionをマスターする

Spring Frameworkの核心にあるのが、IoC(Inversion of Control)コンテナとDependency Injectionの概念です。これらを理解し、効果的に活用することで、柔軟で保守性の高いアプリケーションを構築できます。

Spring IoC コンテナの概要

Spring IoC コンテナは、アプリケーションのコンポーネント(Bean)を管理し、それらの依存関係を注入する役割を担います。主に以下の2種類があります:

  1. BeanFactory: 基本的なDIを提供
  2. ApplicationContext: BeanFactoryの機能に加え、AOP、イベント処理、国際化などの機能を提供

Beanの定義と管理:XMLベースvs JavaConfigベース

Spring Frameworkでは、Beanを定義する方法として主に2つのアプローチがあります:

1. XMLベース

<bean id="myBean" class="com.example.MyBean" />
メリット
  • 設定の集中管理
  • アプリケーションコードに影響を与えない
デメリット
  • 冗長な記述
  • タイプセーフでない

2. JavaConfigベース

@Configuration
public class AppConfig {
    @Bean
    public MyBean myBean() {
        return new MyBean();
    }
}
メリット
  • タイプセーフ
  • リファクタリングが容易
  • IDEのサポートが充実
デメリット
  • 設定が分散する可能性がある

現在のトレンドとしては、JavaConfigベースの方法が推奨されています。

スコープとライフサイクル:Singletonパターンの活用

Beanには様々なスコープがあり、主なものは以下の通りです:

  • singleton: アプリケーション全体で1つのインスタンス(デフォルト)
  • prototype: 要求ごとに新しいインスタンス
  • request: HTTP リクエストごとに1つのインスタンス
  • session: HTTP セッションごとに1つのインスタンス
  • global-session: グローバルHTTP セッションごとに1つのインスタンス

Singletonパターンは、アプリケーション全体で1つのインスタンスのみを使用するデザインパターンです。Spring では、デフォルトでBeanがSingletonスコープとなっています。

@Bean
@Scope("singleton")
public MyBean myBean() {
    return new MyBean();
}

Beanのライフサイクル

Beanのライフサイクルは以下の主要なフェーズで構成されています:

  1. インスタンス化
  2. プロパティの設定
  3. 初期化コールバック(@PostConstruct)
  4. 使用
  5. 破棄コールバック(@PreDestroy)
@Component
public class MyBean {
    @PostConstruct
    public void init() {
        // 初期化ロジック
    }

    @PreDestroy
    public void cleanup() {
        // クリーンアップロジック
    }
}

Spring IoC コンテナとDependency Injectionをマスターすることで、疎結合で柔軟なアプリケーション設計が可能になります。XMLベースとJavaConfigベースの両方のアプローチを理解し、プロジェクトの要件に応じて適切な方法を選択することが重要です。また、Beanのスコープとライフサイクルを適切に管理することで、リソースの効率的な利用とアプリケーションのパフォーマンス向上が実現できます。

ステップ4:Spring MVCを使用してWebアプリケーションを構築する

Spring MVCは、JavaでWebアプリケーションを構築するための強力なフレームワークです。RESTful APIの設計と実装も容易に行えるため、現代のWebアプリケーション開発に欠かせないツールとなっています。

モデル-ビュー-コントローラ(MVC)アーキテクチャの実装

Spring MVCは、以下の利点を持つMVCアーキテクチャを実現します:

  1. 疎結合なアーキテクチャ
  2. テスト容易性
  3. 柔軟な設定
  4. 強力なリクエストマッピング

MVCの各コンポーネントの役割は以下の通りです:

  • モデル:アプリケーションのデータとビジネスロジックを表現
  • ビュー:データの表示を担当
  • コントローラ:ユーザーの入力を処理し、モデルとビューを連携

Spring MVCの基本的な実装手順は次の通りです:

  1. 依存関係の追加(pom.xmlにspring-webmvcを追加)
  2. DispatcherServletの設定(web.xmlまたはJavaConfig)
  3. コントローラーの作成
  4. ビューの作成(JSP, Thymeleafなど)
  5. モデルの定義

以下は、簡単なコントローラーの例です:

@Controller
public class HelloController {
    @GetMapping("/hello")
    public String hello(Model model) {
        model.addAttribute("message", "Hello, Spring MVC!");
        return "hello";
    }
}

RESTful APIの設計と開発:@RestControllerの活用

RESTful APIは、REpresentational State Transferの原則に基づいたWebサービス設計で、以下の特徴があります:

  • スケーラビリティ
  • プラットフォーム独立性
  • 分離性

Spring MVCでは、@RestControllerアノテーションを使用してRESTful APIを簡単に実装できます。これは@Controller@ResponseBodyを組み合わせたもので、以下の利点があります:

  • 簡潔な記述
  • JSONレスポンスの自動変換

RESTful APIの設計原則:

  1. リソース指向:URIでリソースを表現
  2. 適切なHTTPメソッドの使用(GET, POST, PUT, DELETE)
  3. ステートレス:各リクエストは独立して処理
  4. HATEOAS:アプリケーションの状態遷移をレスポンスに含める

以下は、@RestControllerを使用したRESTful APIの例です:

@RestController
@RequestMapping("/api/users")
public class UserController {
    @GetMapping("/{id}")
    public User getUser(@PathVariable Long id) {
        // ユーザー取得ロジック
        return userService.findById(id);
    }

    @PostMapping
    public ResponseEntity<User> createUser(@RequestBody User user) {
        // ユーザー作成ロジック
        User createdUser = userService.create(user);
        return ResponseEntity.created(URI.create("/api/users/" + createdUser.getId())).body(createdUser);
    }
}

Spring MVCを使用する際のTips:

  1. 適切な例外処理:@ExceptionHandlerを使用
  2. バリデーション:@Validアノテーションでリクエストのバリデーション
  3. ページネーション:大量のデータを扱う際はページネーションを実装
  4. ドキュメンテーション:Swagger/OpenAPIを使用してAPIドキュメントを自動生成

Spring MVCとRESTful APIの基本を押さえたら、次のステップではデータアクセスとトランザクション管理について学び、より堅牢なアプリケーション開発を目指しましょう。

ステップ5:データアクセスとトランザクション管理を効率化する

効率的なデータアクセスと適切なトランザクション管理は、堅牢なエンタープライズアプリケーションの基盤となります。Spring Frameworkは、これらの課題に対して強力なソリューションを提供します。

JDBCテンプレートとORMフレームワーク(JPA/Hibernate)の統合

JDBCテンプレート

JDBCテンプレートは、低レベルのJDBCコードを簡略化するSpringクラスです。主な利点は以下の通りです:

  1. ボイラープレートコードの削減
  2. 例外処理の統一
  3. リソース管理の自動化

以下は、JDBCテンプレートを使用した簡単な例です:

@Repository
public class UserDaoJdbc implements UserDao {
    private JdbcTemplate jdbcTemplate;

    @Autowired
    public UserDaoJdbc(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }

    public User findById(Long id) {
        return jdbcTemplate.queryForObject(
            "SELECT * FROM users WHERE id = ?",
            new Object[]{id},
            (rs, rowNum) -> new User(rs.getLong("id"), rs.getString("username"))
        );
    }
}

ORM(JPA/Hibernate)

Object-Relational Mapping(ORM)フレームワークは、オブジェクトとリレーショナルデータベースのマッピングを行います。Spring BootでJPA/Hibernateを使用するための設定は非常に簡単です:

  1. spring-boot-starter-data-jpa依存関係を追加
  2. application.propertiesに以下を設定
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=user
spring.datasource.password=password
spring.jpa.hibernate.ddl-auto=update

JPAを使用したエンティティとリポジトリの例:

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String username;
    // getters and setters
}

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    User findByUsername(String username);
}

宣言的トランザクション管理:@Transactionalアノテーションの使い方

トランザクション管理は、データの一貫性保持、並行処理の制御、エラー回復の容易化など、多くの重要な役割を果たします。Spring Frameworkでは、@Transactionalアノテーションを使用して宣言的にトランザクションを管理できます。

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

    @Transactional
    public void createUser(User user) {
        userRepository.save(user);
        // 他の操作...
    }
}

@Transactionalアノテーションには、以下のような設定オプションがあります:

  • propagation: トランザクションの伝播方式
  • isolation: トランザクションの分離レベル
  • timeout: トランザクションのタイムアウト
  • readOnly: 読み取り専用トランザクション
  • rollbackFor: 指定した例外でロールバック

トランザクション管理のベストプラクティス:

  1. トランザクション境界を適切に設定する
  2. 長時間トランザクションを避ける
  3. 例外処理を適切に実装する
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED, timeout = 30)
public void complexOperation() {
    // トランザクション処理
}

効率的なデータアクセスとトランザクション管理を実装することで、アプリケーションのパフォーマンスとスケーラビリティが向上します。次のステップでは、これらの基本を踏まえて、Spring BootとSpring Frameworkを連携させ、開発をさらに加速させる方法を探ります。

ステップ6:Spring BootとSpring Frameworkの連携で開発を加速させる

Spring Bootは、Spring Frameworkをベースにしたアプリケーション開発を大幅に簡素化するツールです。自動構成、スタンドアロン、オピニオネイテッド、運用対応といった特徴を持ち、開発者の生産性を飛躍的に向上させます。

Spring Bootの自動構成機能を最大限に活用する方法

Spring Bootの自動構成機能は、クラスパス上のライブラリに基づいて設定を自動的に行います。これにより、開発者は最小限の設定で迅速にアプリケーションを構築できます。

自動構成をカスタマイズする方法:

  1. プロパティファイルでの設定
   spring.datasource.url=jdbc:mysql://localhost:3306/mydb
   spring.jpa.hibernate.ddl-auto=update
  1. @ConditionalOnXXXアノテーションの使用
   @Configuration
   @ConditionalOnClass(DataSource.class)
   public class DatabaseConfig {
       // データベース設定
   }
  1. 自動構成クラスの作成
   @Configuration
   @EnableAutoConfiguration
   public class MyAutoConfiguration {
       // カスタム自動構成
   }

Spring Bootの主要機能を活用することで、さらに開発を加速できます:

  • Actuator: アプリケーションの監視と管理を容易にします。
  • DevTools: ホットリロードなどの機能で開発者の生産性を向上させます。

Spring BootとSpring Frameworkの使い分け:ケーススタディ

Spring BootはSpring Frameworkの上に構築されたツールであり、Spring Frameworkの機能を内包しています。使い分けの基準は以下の通りです:

Spring Boot:
  • 迅速な開発が必要な場合
  • マイクロサービスアーキテクチャ
  • クラウドネイティブアプリケーション
Spring Framework:
  • 細かい制御が必要な場合
  • 既存のレガシーシステムとの統合
  • 特定の機能のみを使用する場合
ケーススタディ:
  • 新規のマイクロサービス開発 → Spring Boot
    • 理由:迅速な開発、自動構成、クラウドネイティブサポート
  • 大規模エンタープライズアプリケーションの開発 → Spring Framework
    • 理由:細かい制御、既存システムとの統合、カスタム設定の柔軟性

Spring BootとSpring Frameworkを適切に使い分けることで、プロジェクトの要件に最適な開発アプローチを選択できます。次のステップでは、これらの知識を活かして、実践的なSpring Frameworkプロジェクトに取り組む方法を探ります。

ステップ7:実践的なSpring Frameworkプロジェクトに取り組む

実践的なSpring Frameworkプロジェクトでは、マイクロサービスアーキテクチャの実装とセキュアなWebアプリケーション開発が重要なトピックとなります。ここでは、Spring CloudとSpring Securityを活用してこれらの課題に取り組む方法を探ります。

マイクロサービスアーキテクチャの実装:Spring Cloudの活用

マイクロサービスアーキテクチャは、アプリケーションを小さな独立したサービスに分割する設計手法です。スケーラビリティの向上、開発・デプロイの柔軟性、技術スタックの多様性、障害の局所化などの利点があります。

Spring Cloudは、分散システムの一般的なパターンを実装するためのツールセットを提供し、マイクロサービスアーキテクチャの実現を支援します。主要なコンポーネントには以下があります:

  1. Eureka: サービスディスカバリ
  2. Ribbon: クライアントサイドロードバランシング
  3. Hystrix: サーキットブレーカー
  4. Zuul: APIゲートウェイ
  5. Config Server: 集中化された設定管理

Spring Cloudを使用したマイクロサービスの実装例:

@SpringBootApplication
@EnableEurekaClient
public class MyServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyServiceApplication.class, args);
    }
}

@RestController
public class MyController {
    @Autowired
    private DiscoveryClient discoveryClient;

    @GetMapping("/service-instances/{applicationName}")
    public List<ServiceInstance> serviceInstancesByApplicationName(
            @PathVariable String applicationName) {
        return this.discoveryClient.getInstances(applicationName);
    }
}

この例では、@EnableEurekaClientアノテーションを使用してサービスをEurekaサーバーに登録し、DiscoveryClientを使用して他のサービスインスタンスを検出しています。

Spring Cloudは、マイクロサービスアーキテクチャにおける一般的な課題(サービスディスカバリ、負荷分散、障害対応など)に対するソリューションを提供します。

セキュアなWebアプリケーション開発:Spring Securityの導入

Spring Securityは、認証、認可、その他のセキュリティ機能を提供するフレームワークです。主な機能には、フォームベース認証、Basic認証、OAuth2サポート、CSRF対策、セッション管理などがあります。

Spring Securityを使用した基本的な認証と認可の実装例:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "/home").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .inMemoryAuthentication()
                .withUser("user").password("{noop}password").roles("USER");
    }
}

この設定では、”/”と”/home”のパスを除くすべてのリクエストに認証を要求し、フォームベースのログインを設定しています。

OAuth2とJWTを用いたセキュアなAPIの実装:

  1. 依存関係の追加:
   <dependency>
       <groupId>org.springframework.security.oauth.boot</groupId>
       <artifactId>spring-security-oauth2-autoconfigure</artifactId>
   </dependency>
  1. リソースサーバーの設定:
   @Configuration
   @EnableResourceServer
   public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
       @Override
       public void configure(HttpSecurity http) throws Exception {
           http.authorizeRequests()
               .antMatchers("/api/**").authenticated()
               .anyRequest().permitAll();
       }
   }

Spring SecurityとSpring Cloudを組み合わせることで、セキュアなマイクロサービスアーキテクチャを実現できます。例えば、Zuul APIゲートウェイにSpring Securityを統合して、集中的な認証・認可を実装できます。

実践的なプロジェクトにおけるベストプラクティス:

  1. 適切なサービス分割: ビジネスドメインに基づいてサービスを設計
  2. 非同期通信の活用: メッセージングシステム(例:Kafka)を使用
  3. 監視とロギング: 分散トレーシング(例:Spring Cloud Sleuth)の導入
  4. セキュリティの層別化: ネットワーク、アプリケーション、データの各層でのセキュリティ対策
  5. CI/CDパイプラインの構築: 自動テストとデプロイメントの実装

Spring Framework、Spring Boot、Spring Cloud、Spring Securityを組み合わせることで、スケーラブルでセキュアな現代的なアプリケーションを構築できます。これらの技術を習得し、実践することで、エンタープライズレベルの開発スキルを磨くことができるでしょう。

まとめ:Spring Frameworkマスターへの次のステップ

Spring Frameworkの基礎から実践的な応用まで、7つのステップを通じて学んできました。ここからさらにスキルを磨き、真のSpring Frameworkマスターを目指すための次のステップを紹介します。

学習を継続するための資源とコミュニティ

  1. 書籍:
    • 「Spring in Action」by Craig Walls
    • 「Pro Spring 5」by Iuliana Cosmina, et al.
  2. オンラインコース:
    • Udemy: Spring & Hibernate for Beginners
    • Coursera: Building Cloud Services with the Java Spring Framework
  3. ドキュメント:
    • Spring Framework公式ドキュメント
    • Baeldung Spring Tutorials
  4. コミュニティ:
    • フォーラム: Stack Overflow, Spring Forum
    • Meetup: Spring Meetups
    • カンファレンス: SpringOne, Devoxx

これらの資源とコミュニティを活用することで、最新の情報や実践的なヒントを得ることができます。

Spring認定プロフェッショナル資格の取得:キャリアアップの機会

Spring認定プロフェッショナル資格は、Spring Frameworkの深い理解と実践的なスキルを証明する国際的な認定です。取得のメリットには、キャリアの可能性の拡大、専門性の証明、給与向上の可能性などがあります。

準備方法:

  1. 公式学習ガイドの活用
  2. 模擬試験の受験
  3. 実践的なプロジェクト経験の積み重ね

Spring Frameworkのスキルを活かしたキャリアパスには、Javaバックエンド開発者、フルスタック開発者、ソリューションアーキテクト、テクニカルリードなどがあります。

継続的な学習と実践が、Spring Frameworkマスターへの道のりです。この記事で学んだ内容を基に、さらなる高みを目指してください。Spring Frameworkの世界には、まだまだ探求すべき豊かな可能性が広がっています。頑張ってください!