Closed15

Spring 入門ログ

Futa HirakobaFuta Hirakoba
Futa HirakobaFuta Hirakoba

https://spring.io/why-spring

  • Spring は Java のフレームワーク
  • 柔軟なライブラリ
  • アリババやアマゾン、グーグル、MS などからのコントリビュートもある
  • Spring Framework の格は 2 つ
    • 制御の逆転(IoC: Inversion of Control)
    • 依存性注入(DI: Dependency Injection)
  • Spring Boot はマイクロサービス開発を簡単にするフレームワーク
  • Spring は速い、リアクティブ
Futa HirakobaFuta Hirakoba

Spring | Quickstart

https://spring.io/quickstart

Futa HirakobaFuta Hirakoba

Step 1: Start a new Spring Boot project

start.spring.io を使えとな。
とりあえず指示に従って作る。

Futa HirakobaFuta Hirakoba

Step 2: Add your code

デフォルト

src/main/java/dev/korosuke613/spring/boot/demo/Application.java
package dev.korosuke613.spring.boot.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}

}

書き換え後

src/main/java/dev/korosuke613/spring/boot/demo/Application.java
package dev.korosuke613.spring.boot.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

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

	@GetMapping("/hello")
	public String hello(@RequestParam(value = "name", defaultValue = "World") String name){
		return String.format("Hello %s!", name);
	}
}
  • 追加した hello() メソッドは name を受け取り、メソッド内で Hello と結合して返す
  • RestController アノテーションは Web 上で利用可能なエンドポイントがこのクラスに書かれていることを Spring に伝える
  • GetMappint("/hello") は、http://localhost:8080/hello アドレスに送られるリクエストに応答するために hello() メソッドを使うように Spring に指示する
  • @RequestParam はリクエストに name の値を期待するが、無ければデフォルトで World を使うことを Spring に伝える
Futa HirakobaFuta Hirakoba

Step 3: Try it

./gradles bootRun でビルド&起動する。

❯ ./gradlew bootRun

> Task :bootRun

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v3.1.5)

2023-11-07T21:43:26.694+09:00  INFO 409 --- [           main] d.k.spring.boot.demo.Application         : Starting Application using Java 21.0.1 with PID 409 (/Users/korosuke613/ghq/github.com/korosuke613/playground/java/spring/spring.boot.demo/build/classes/java/main started by korosuke613 in /Users/korosuke613/ghq/github.com/korosuke613/playground/java/spring/spring.boot.demo)
2023-11-07T21:43:26.695+09:00  INFO 409 --- [           main] d.k.spring.boot.demo.Application         : No active profile set, falling back to 1 default profile: "default"
2023-11-07T21:43:27.071+09:00  INFO 409 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2023-11-07T21:43:27.075+09:00  INFO 409 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2023-11-07T21:43:27.076+09:00  INFO 409 --- [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.15]
2023-11-07T21:43:27.136+09:00  INFO 409 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2023-11-07T21:43:27.137+09:00  INFO 409 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 422 ms
2023-11-07T21:43:27.274+09:00  INFO 409 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2023-11-07T21:43:27.278+09:00  INFO 409 --- [           main] d.k.spring.boot.demo.Application         : Started Application in 0.741 seconds (process running for 0.944)
<==========---> 80% EXECUTING [6m 5s]
> :bootRun


http://localhost:8080/hello にアクセスする


http://localhost:8080/hello?name=Futa にアクセス

Futa HirakobaFuta Hirakoba

Getting Started | Testing the Web Layer

https://spring.io/guides/gs/testing-web/

Futa HirakobaFuta Hirakoba

What You Will Build

  • シンプルな Spring アプリケーションをビルドし、JUnit を使ってテストする
  • Sprint とコード間のインタラクションをテストするために Spring Test と Spring Boot の機能を使うことに集中する
  • コンテキストが正常にロードされるかの簡単なテストから始め、Spring の MockMvc を使って Web レイヤーだけをテストしていく
Futa HirakobaFuta Hirakoba

Create a Simple Application

  • デフォルトだと @RequestMapping は全ての HTTP 操作をマッピングする
  • 絞り込むためには @GetMapping または @RequestMapping(method=GET) する
Futa HirakobaFuta Hirakoba

Run the Application

  • @SpringBootApplication は以下の全てを追加する便利なアノテーション
    • @Configuration: アプリケーションコンテキストの Bean 定義のソースとしてクラスをタグ付けする
    • @EnableAutoConfiguration: クラスパス設定、他の Bean、様々なプロパティ設定に基づいて Bean の追加を開始するように Spring Boot に指示する
    • @EnableWebMvc: アプリケーションを Web アプリケーションとする。DispatcherServlet のセットアップなどの主要な動作を有効にする。クラスパスにspring-webmvc があると自動的に追加する
    • @ComponentScan: アノテーションされた TestingWebApplication クラスが存在するパッケージ内の他のコンポーネント、コンフィギュレーション、サービスを探すように Spring に指示し、HelloController を見つけさせる
  • main() メソッドは Spring Boot の SpringApplication.run() メソッドを使用してアプリケーションを起動する
  • この Web アプリケーションは 100% 純粋な Java であり、色々設定する必要はない。Spring Bootがすべて処理してくれる
Futa HirakobaFuta Hirakoba

Test the Application

ApplicationTests

  • @SpringBootTest は Spring Boot にメイン構成クラス(例えば @SpringBootApplication を持つもの)を探し、それを使って Spring アプリケーションコンテキストを起動するように指示する
Futa HirakobaFuta Hirakoba

SmokeTest

  • コンテキストがコントローラを作成することを明示的に確認したければ assertThat(controller).isNotNull() のようにアサートを追加する
  • Spring は @Autowired アノテーションを解釈し、テストメソッドが実行される前にコントローラが注入される
  • Spring Test のよいところはテスト間でアプリケーションコンテキストがキャッシュされること
Futa HirakobaFuta Hirakoba

HttpRequestTest

  • @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) でランダムなポートでサーバを起動する(ポートの競合を防ぐため)
  • @LocalServerPort でポート番号を port にインジェクションしている
  • Spring Boot は自動的に TestRestTemplate を提供してくれる。@Autowired を追加して使える
  • TestRestTemplate を使えば HTTP リクエストを簡単に飛ばせる
Futa HirakobaFuta Hirakoba

TestingWebApplicationTest

  • このテストでは完全な Spring アプリケーションコンテキストが起動されるが、サーバは起動されない
  • MockMvc を使うことで Spring Boot はコンテキスト全体ではなく Web レイヤーのみをインスタンス化する
  • 複数のコントローラがあるアプリケーションでは @WebMvcTest(HelloController.class) などを使用して一つだけをインスタンス化するように要求することもできる
Futa HirakobaFuta Hirakoba

WebMockTest

  • @MockBean を使用して GreetingService のモックを作成し自動で注入する
  • Mockito の when(service.greet()).thenReturn("Hello, Mock") でモックの戻り値を設定
このスクラップは5ヶ月前にクローズされました