きり丸の技術日記

技術・エンジニアのイベント・資格等はこちらにまとめる予定です

Java

【SpringBoot】画面項目をサーバでバリデーションする

きり丸アドベントカレンダー2020の12記事目です。 画面の項目が必須項目なのか、数字のみ許容するのか、Email形式のみしか許容しないのかをサーバ側で検証する必要があります。この項目を検証することをバリデーションと言います。 基本的には画面側のJavaSc…

【SpringBoot】Controllerのテストを行う(Not RestController)

きり丸アドベントカレンダー2020の11記事目です。 今回の記事でControllerのテストを行います。GET通信やPOST通信を行って、そのあとの挙動をテストします。 ゴール Controllerのテストを行う できないこと WebMvcTestでのテスト 環境 Java 15 手順 テストの…

ログイン機能を追加する(Spring-boot-starter-security)

きり丸アドベントカレンダー2020の10記事目です。 自分の勉強も兼ねてログイン機能を実装してみましたが、ベストプラクティスは分かりませんね…。難しい。 今回の記事でログイン機能を実装します。アプリケーションらしくなりますが、セキュリティをブラック…

データベースのH2を使用してMyBatisの取得・更新のテストを行う(JavaとSpringBoot)

きり丸アドベントカレンダー2020の9記事目です。 今回の記事でMyBatisのテストを行えるようにします。テスト用のスターターが準備されているので、テストのための準備は簡単です。ただし、テストのセットアップは慣れていないと、時間がかかってしまいます。…

MyBatisを使用してデータの取得・更新をする(JavaとSpringBoot)

きり丸アドベントカレンダー2020の8記事目です。 今回の記事でDBの更新を行います。データの取得(Select)と追加(Insert)をこの記事で紹介します。 更新と削除に関しても同様の処理で問題ありませんので、頑張ってみてください。なお、9日目にDBのテスト…

HTMLからJavaにパラメータを渡す(SpringBoot)

きり丸アドベントカレンダー2020の7記事目です。 6日目の記事でJava -> HTMLにデータを転送することができました。 しかし、それではデータを取得することしかできません。 今回の記事では、データの更新、削除、追加できるようにHTML -> Javaにデータを転送…

Thymeleafを使ってSpringBootからhtmlにパラメータを渡して画面表示させる

きり丸アドベントカレンダー2020の6記事目です。 始めに宣言しておくと、この辺から「やはりIntelliJ IDEAいいなぁ…」みたいに思うことが多くなってきます。しょうがないとはいえ、GitpodやVS Codeはライブラリのimport機能が貧弱です。 コーディング中に引…

GitpodでDBのDockerを使用し、SpringBootからアクセスする

きり丸アドベントカレンダー2020の4記事目です。 Gitpod上でDBの環境構築もできると、確認できることが増えます。DBも設定しましょう。 手順 .gitpod.Dockerfileを修正 gp initで作成したDockerのイメージにはPostgreSQLは含まれていません。ですので、.gitp…

【Java】GitpodでSpringが使えるように環境構築する(VS Codeでも流用可)

きり丸アドベントカレンダー2020の3記事目です。ようやくSpringBootの起動ができます! なお、まだコードは触れません。 Springのプロジェクトを作成し、Gitpodにアップロードしました。しかし、現在のままではGitpodでSpringの開発をしようにも、そもそも起…

【Java】Spring Initializrで簡単にプロジェクトを作成する

きり丸アドベントカレンダー2020の2記事目です。 Java歴6年になりますが、いまだにゼロからプロジェクトを作成するのは苦手です。というか、出来ないですね…。 じゃあ、どうやってプロジェクトを作っているかというと、Spring Initializrというサイトでプロ…

GitpodでJavaの開発環境を構築する

きり丸アドベントカレンダー2020の1記事目です。今回のアドベントカレンダーはJavaとSpringBootを使いつつ、TODOアプリを作って公開するところまでやりたいと考えてます。 はじめてのJavaのプログラミングに最適!という形で皆さんに紹介できたら、と考えて…

【Java】不安定なテスト(Flakyなテスト)に失敗したら自動リトライさせるライブラリを使用する(test-retry-gradle-plugin)

過去に所属していたプロジェクトでは、CIが終わるまでに2.5時間ほどかかっていました。その中で極稀に対向システムのモックがうまく立ち上がっていなかったり、DBのセットアップが終わらないままテストを行ったりして、テストに失敗することがありました。 …

Java + Flywayで誤って適用してしまったバージョンを未適用の状態にする

以前、Flywayで参照制約を追加したが、既存のデータが既に参照制約違反だったため、四苦八苦した話を書きました。 ※以前の記事。 nainaistar.hatenablog.com その後、色々知った後に検証をしていると、いろいろと勘違いしていることが分かったので、忘れない…

【Java】よく使うassertThatのメソッド集【AssertJ】

「assertThat」と検索すると私のブログに引っかかる人がいるようなので、この記事を書きました。ただ「AssertJ」と検索すると、たくさん有用な記事も見つかります。 なので、この記事は「AssertJ徹底解説」ではなく、「きり丸がよく使うAssertJのメソッド」…

SpringBootでpropertiesやymlの設定ファイルが読み込めることのテストを書く【Java】

2021/03/31 追記 SpringBoot2.4以降の場合はこちらの記事も参考にしてみてください。 SpringBootではpropertiesファイルやymlファイル(以降、設定ファイル)に、DBのURL等々の環境ごとの変数を記載できます。 設定ファイルの値が目的通り一致していることを…

【Java】lombokのデフォルトのBuilderに不満があったので、解消方法を調べた(デフォルト値/Validation/再びBuilder)

前回の記事にて、まるでlombokに何の不満もないような書き方しました。 ただ、実際にデフォルトで使っているといくつか不満点がでました(タイトルにある通りざっくり3つ)。 なので、lombokの不満点を解消すべく、調べたのがこの記事です。 不満点一覧 どん…

【Java】lombokの便利な使い方(Builder編)

最近、レベルアップのためにEffective Javaの第3版を読むようになりました。 そのなかで、「第2章 項目2 多くのコンストラクタパラメータに直面した時にはビルダーを検討する」を読んだ時にこう思いました。 「意外とBuilderって知られてない?」 なので、lo…

【Java】gradleでProxy認証してライブラリをダウンロードする

会社でproxyサーバ経由し、javaのgradleでライブラリをダウンロードできなかったので、設定した手順を残す。 流石に会社のコマンドをそのまま使えないので、いくつか修正しています。 それで動かなかったらすみません…。 ※ 前までは在宅等でproxyサーバが無…

【Java】【テスト究極系】動的にテスト対象を増やして、アサーションルーレットを回避する

過去にJavaのテストについていろいろ書きました。 パラメタライズドテスト、assertEqualsとassertThatとの比較等々…。 色々と学んだのですが、ダイナミックにテスト項目を増やす方法が分からず、苦汁をなめながらアサーションルーレットなテストを書いていま…

【Spring】TestExecutionListnerを継承した自作アノテーションでSpringのテストセットアップを快適にする

テスト設計というのは非常に難しいです。 ちょっとでも見誤ると、すぐにテストができない設計になってしまい、テストをしないという設計になってしまいがちです。 これを避けるためにTDDを行うのですが、粒度の違うUTとE2Eではテストの設計が違ってくるので…

【Spring】Spring機能使いつつ、テストを高速化する

※ もっと高速化する方法がありましたら教えていただきたいです。 もしくは、高速化するためのリファレンスページ教えてください。 はじめに Springフレームワークは、DI機能を持っており、依存関係を疎にできます。 テストするときは、@SpringBootTestのアノ…

【Java】JavaでXMLを比較する(特定の項目を無視するやり方)

前に、JavaでJsonを比較しつつ、特定の項目を無視するやり方をする記事を書きました。 同様にJavaでXMLを比較しつつ、特定の項目を無視するやり方を調べたので、記事に残しておきます。 環境 Java 下記のどれか org.assertj.core.api.Assertions.assertThat …

【Java】簡単にディープコピーやcloneしたい

自分用のメモ。 Cloneメソッドを自分で用意するのめんどくさいなー。 できればライブラリ使って簡単にコピーしたいなー。 って思ったら、簡単にできたので、共有。 ディープコピーで調べるとすぐ出てくるのに、Cloneで調べると頑張って自作するタイプの記事…

【Java】ListでNestしている時に処理を簡単にするためにフラットにしたい

つい最近まで、ListのListのListの… といったドメインがNestされるとラムダ式でうまく取り出せなかったのが、Javaでようやく取り出せるようになったのでメモ。 当然、ラムダ式使わない方法はあるんですが、知ることでと幅が広がるので…。 なお、メソッド参照…

JavaでJsonを比較する(特定の項目を無視するやり方)

自分用記事。 Json比較に手間取ったので、未来の自分に役に立つはず。 なお可能であれば、assertThatのメソッドチェインに加えたいので、もしそっちで比較できることを知っていれば教えてほしいです…。 環境 org.skyscreamer.jsonassert JSONAssertで読み込…

なぜかデータが増える障害が起きた(ORMapper)

こんな障害が出た、って話で笑い飛ばしてくだせー。 正直、ORMapperでN+1問題とかはよく聞くけど、この挙動は想定外で笑ってしまったので次の犠牲者が出ないことを祈る。 なお半年前に起こった障害なので、ざっくりとした原因は覚えていますが、対応内容とか…

初心者もsonarcloudで静的解析しよう

TypescriptやJavaScriptを使用しているエンジニアでは、eslintを使って静的解析をしている人が多いと思います。 もちろん、フロント部分はそれでいいと思います。 では、バックエンドはどうでしょうか。 私もそこまで静的解析に強いわけではありませんが、Ja…

もっともっといいテストが書きたい(AssertAllをもっと使う)

もっともっといいテストが書きたい(AssertAllをもっと使う) 下記の記事を書いて、 「テストで必要なことを全て書いた! あとは、テストに慣れるだけだ!」 と、思ってたのですが、思ったよりもassertAllを使いたい場面が増えてきたので、自分用へのメモを残…

【Spring】共通的かつ特別なハンドリングを行いたかった

共通的かつ一部コントローラークラスのみ特別なハンドリングをする方法を残します。 環境 Java 11 Spring Framework 共通的なコントローラのハンドリング RestControllerAdviceというアノテーションを付けると、全コントローラーを共通的にハンドリングする…

もっといいテストが書きたい(AssertEqualsとAssertThatの検証)

AssertEqualsとAssertThatの挙動の違いがよくわかってないところがあったので検証しました。 検証したくなった理由 個人的にはAssertEqualsで全部行えばいいと思ってました。 assertThatでしかできないことというのは、Equalsよりも弱い検証になりがちなので…