JJUGナイトセミナー「モデリングやデータベース設計について」の感想

JJUGナイトセミナー「モデリングやデータベース設計について」を視聴したので感想を書きます。

一言でまとめるとバランスが大事ですね。

モデリングの手法にはいろいろあるけど、やりすぎ、やらなすぎは注意かなと思いました。

ただモデリングの際に、「画面から作ってはいけない」は完全に同意です。

データベースの仕様が画面に引きづられるのはすごくわかります。

画面用のAPIを作るのではなく、データベース、モデリングからAPIを作成し、それに合わせて画面を作成するのが良いかなと。(もちろんモデリングして、実現できることを確証してからですが)

「言うは易く行うは難し」

実際にやってみると、教科書通りいかないことしかないですが、ここを適当にすると後から困るのは自分です。

苦労しないために苦労しましょう。

https://www.youtube.com/watch?v=hq3mXZzFmUk

Recordクラスを使いこなせるか?

こんばんは、Javaアドベントカレンダー、7日目を書かせていただきます。中尾です。

今回はRecordクラスのあり方を考えようと思います。

簡単にいうと、RecordクラスはLombok@Valueでできるイミュータブルなクラスのようなものです。

docs.oracle.com

blog.y-yuki.net

public class Main{
     public static void main(String []args){
        var user = new User("Hello","World");
        System.out.println(user.fullName());
     }
}

record User(
    String firstName,
    String lastName
) {
    public String fullName(){
        return this.firstName + this.lastName;
    }
}

// 今までだと
// import lombok.Value;

// @Value
// public class User {

//     private String firstName;
// 
//     private String lastName;

//     public String fullName(){
//         return this.firstName + this.lastName;
//     }

// }

簡単ですね!!!

Lombokに依存されないコードになりました!

これからは積極的にRecordをつかっていきましょう。

...

...

...

とはならないのが現実です。

簡単ですが、今までのコードからいきなり変わると思います。

今まで Lombokや自前で実装していた箇所をRecordクラスにリファクタリングする意味はあるのでしょうか?っと考えます。

個人的な見解として、今のままで十分ではないかと思います。

理由は一つです。メリットがそこまでないからです。

そもそも Immutable が 100% 良いのでしょうか?

Immutable にすると、安全ですが変更容易が失われます。可読性も下がりメンテナンス性が低くなります。

そもそも論ですが、そこまで Immutable にする必要はありますか?

現在 Immutable になっていて、無理に mutable にする必要もありませんが、Recordクラスに変更する必要はないと思います。

潔癖症で 0 or 100 ではなく ある程度 30 or 70 くらいの間で両方の特定を理解し使いこなすことが重要だと考えます。

`@Primary`を使う場面

こんばんは、中尾です。

@Primaryを使う場面を解説します。

例えば以下のインターフェースがあるとします

public interface TestService {
    String test();
}

対して実装は2つあります。

@Service
public class TestServiceImpl implements TestService {
    @Override
    public String test() {
        return "TestServiceImpl";
    }
}
@Service
public class TestService2Impl implements TestService {
    @Override
    public String test() {
        return "TestService2Impl";
    }
}

コントローラーで TestService を DIするとどうなるでしょう?

@Controller
@RequiredArgsConstructor
@Slf4j
public class IndexController {

    private final TestService testService;

    @GetMapping("/")
    public String index() {
        log.info(testService.test());
        return "index";
    }
}

Parameter 0 of constructor in IndexController required a single bean, but 2 were found: IndexController のコンストラクターのパラメーター 0 には 1 つの Bean が必要でしたが、2 つ見つかりました。

っと怒られます。要するに実体はどっちなのかわからないよ。一つにしてくれ。っと言われています。

しかし、2つ使いたいときがあります。 そういうときに、@Primary を使います。

@Primary
@Service
public class TestService2Impl implements TestService {
    @Override
    public String test() {
        return "TestService2Impl";
    }
}

上記の場合であれば、TestService2Implが優先的に表示されます。

Intellij Ideaの設定で補完コードの大文字小文字の区別をつけなくする

こんばんは、中尾です。

すでにいくつか出回っているもしれませんが、Intellij Ideaの設定で補完コードの大文字小文字の区別をつけなくす方法です。こういう細かいところを調整することで、開発効率があがります。

Code Completion の Match case のチェックを外してください。

チェックあり(queueで検索なし)

チェックなし(queueで候補が出る)

JJUG CCC 2023 Fall スタッフで参加してきました

こんばんは、今回はJJUG CCC 2023 Fall スタッフで参加してきました。

その時のすごくざっくりした感想を書きます。

感想です。

Web3jを使ってブロックチェーンJavaで接続してみる

ちょっと難しすぎたかな。。。

JHipsterで爆速かつ堅牢なエンタープライズ Spring Boot開発を実現する

簡単に初期構築できる半面、保守運用開発が大変なイメージです。プロトタイプまでかな?というイメージです。

セキュリティにおける暗号の基礎とこれからの話

ちょっと難しすぎたかな。。。

B2B SaaSでSpringSecurityによるRoleを用いたユーザー権限設定の実装について

Spring Security 6系を使っていても、コーナーケースがある。コーナーケースはAOPで独自実装する。ですよね。。。

技術書を読む技術

www.flierinc.com

www.kadokawa.co.jp

book.mynavi.jp

honto.jp

若手こそテストを書こう!

ブラックボックス、ホワイトボックス試験大事

動くコードを書こう

アルゴリズムは大事。

chatGPTがあるから手でかけるようになる必要があるかというと、そういうわけじゃないがアルゴリズム自体の理解をしたほうが今後の考え方の幅が広がる。

www.hyuki.com

ラムダ式をHowではなくWhyで理解しよう!

ラムダ!

アンカンファレンス

サムライズム

生のユースケさんかっこいい

SDKMANでJava JDK のバージョン管理が楽になる

SDKMANでJava JDK のバージョン管理が楽になります。

sdkman.io

SDKMANのインストール

インストールは簡単で、公式の通り以下を実行して手順にしたがってターミナル再起動を行ってください。

curl -s "https://get.sdkman.io" | bash

以下の通り、SDKMANのバージョンが出たらインストール完了です。

$ sdk version

SDKMAN 5.18.1

使い方

インストール後、 sdk list java を実行すると以下のような画面が出てきて、どのJavaをインストールするのか選べます。

今、私の環境は 21-amzn なのがわかりました(以前からインストールしていたので残っていました)。

21-open に変更してみたいと思います。

$ sdk install java 21-open

Downloading: java 21-open

In progress...

############################################################################################################################################################################################################ 100.0%

Repackaging Java 21-open...

Done repackaging...

Installing: java 21-open
Done installing!

Do you want java 21-open to be set as default? (Y/n): Y

Setting java 21-open as default.

$ sdk current java

Using java version 21-open

これで、21-open に変わりましたね!簡単ですね!

java のバージョンをディレクトリ単位で管理する

プロジェクトごとにバージョンが違うことはよくあります。 .sdkmanrc に使うバージョンを記載することです。

$ sdk env init
.sdkmanrc created.
$ cat .sdkmanrc
# Enable auto-env through the sdkman_auto_env config
# Add key=value pairs of SDKs to use below
java=21-open

今の私の環境では先程インストールした 21-open が使われました。

では、変えてみましょう。

最初に入れていた21-amzn に書き換えます。

まず、 ~/.sdkman/etc/config の中の sdkman_auto_env=falsetrue にします。

書き換えた上で別のターミナルから該当するディレクトリに切り替えます。

$ cd sdkman/

Using java version 21-amzn in this shell.

切り替えると、自動的に 21-amzn に切り替わりましたね。 開発環境のバージョンを揃えるのが容易になったことがわかります。