Closed15
Spring 入門ログ
これ
- Spring は Java のフレームワーク
- 柔軟なライブラリ
- アリババやアマゾン、グーグル、MS などからのコントリビュートもある
- Spring Framework の格は 2 つ
- 制御の逆転(IoC: Inversion of Control)
- 依存性注入(DI: Dependency Injection)
- Spring Boot はマイクロサービス開発を簡単にするフレームワーク
- Spring は速い、リアクティブ
Spring | Quickstart
Step 1: Start a new Spring Boot project
start.spring.io を使えとな。
とりあえず指示に従って作る。
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 に伝える
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
にアクセス
Getting Started | Testing the Web Layer
What You Will Build
- シンプルな Spring アプリケーションをビルドし、JUnit を使ってテストする
- Sprint とコード間のインタラクションをテストするために Spring Test と Spring Boot の機能を使うことに集中する
- コンテキストが正常にロードされるかの簡単なテストから始め、Spring の
MockMvc
を使って Web レイヤーだけをテストしていく
Create a Simple Application
- デフォルトだと
@RequestMapping
は全ての HTTP 操作をマッピングする - 絞り込むためには
@GetMapping
または@RequestMapping(method=GET)
する
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がすべて処理してくれる
Test the Application
ApplicationTests
-
@SpringBootTest
は Spring Boot にメイン構成クラス(例えば@SpringBootApplication
を持つもの)を探し、それを使って Spring アプリケーションコンテキストを起動するように指示する
SmokeTest
- コンテキストがコントローラを作成することを明示的に確認したければ
assertThat(controller).isNotNull()
のようにアサートを追加する - Spring は
@Autowired
アノテーションを解釈し、テストメソッドが実行される前にコントローラが注入される - Spring Test のよいところはテスト間でアプリケーションコンテキストがキャッシュされること
HttpRequestTest
-
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
でランダムなポートでサーバを起動する(ポートの競合を防ぐため) -
@LocalServerPort
でポート番号をport
にインジェクションしている - Spring Boot は自動的に
TestRestTemplate
を提供してくれる。@Autowired
を追加して使える -
TestRestTemplate
を使えば HTTP リクエストを簡単に飛ばせる
TestingWebApplicationTest
- このテストでは完全な Spring アプリケーションコンテキストが起動されるが、サーバは起動されない
-
MockMvc
を使うことで Spring Boot はコンテキスト全体ではなく Web レイヤーのみをインスタンス化する - 複数のコントローラがあるアプリケーションでは
@WebMvcTest(HelloController.class)
などを使用して一つだけをインスタンス化するように要求することもできる
WebMockTest
-
@MockBean
を使用してGreetingService
のモックを作成し自動で注入する - Mockito の
when(service.greet()).thenReturn("Hello, Mock")
でモックの戻り値を設定
このスクラップは2023/11/25にクローズされました