kotlinで勉強がてら遊ぶ(Dockerも少し触る)

2024-02-20に作成

個人的にkotlinを勉強していくのでその作業記録をつけたい

前提

筆者はwebエンジニア歴10年だが内製ばっかやってる弱小
昔php + FuelPHP、今Java + spring boot、DDDをちょっとかじる
最近の新卒の子がElixir使いだったけどナニソレ?関数型プログラミング全然わからん
じゃあ遊んでみるしかないな
kotlinはjavaに似ててオブジェクト指向的にも関数型プログラミング的にも書けるらしいな、とりあえず触ろう
そのうちscala → Elixirみたいに手を広げるゾ!
そして体を壊して休職したのでこれ幸いと手を出す

やりたいこと

  • javaに近いっぽいkotlinで関数型言語を触ってみる
  • ローカルで動く適当なAPI作って見よっか
  • ついでにDockerもちゃんと触り直すか
    • あ、ちょっとまって公式の解説英語の動画なんすか
    • ドキュメント系は公式以外あんま参照したくないんだよなぁ
  • 時間空けると何がなんだかわからないね!どこかに記録残しとこうね!
  • あと前から気になってたcrieitさんを使ってみたかった
所有者限定モードのためこのボードには投稿できません ボードとは?

春コミの原稿やってました。時間が空いてしまったのですが続き。

postgresへの接続設定を追加

src/main/application.yamlを作成して以下を記入

spring:
  datasource:
    driver-class-name: org.postgresql.Driver
    url: jdbc:postgresql://db:5432/example
    username: postgres
    password: ****

ここでは仮置きとしてpasswordを直接書いちゃってますが、
危ないので本当はやってはだめです。

中身の確認用にcompose.yamlに以下を追加。
これを入れておくと、postgresの中身をそのまま見ることができます。

# servicesの下
  adminer:
    image: adminer
    restart: always
    ports:
      - 8082:8080

初期化用のSQLを作り、

db/init.sql

DROP TABLE IF EXISTS tamesi;
CREATE TABLE IF NOT EXISTS tamesi (
  id SERIAL PRIMARY KEY,
  name TEXT NOT NULL,
  age INTEGER NOT NULL
);

それを初期化用に設定

    volumes:
      - db-data:/var/lib/postgresql/data
# ↓を追加
      - ./db/init.sql:/docker-entrypoint-initdb.d/init.sql

docker-entrypoint-initdb.dに置くと初期化してくれるらしい。

公式ドキュメント

で、エラーとか起きるので都度修正して、

plugins {
    id("org.springframework.boot") version "3.2.2"
    id("io.spring.dependency-management") version "1.1.4"
    kotlin("jvm") version "1.9.22"
    kotlin("plugin.spring") version "1.9.22"
    kotlin("plugin.jpa") version "1.9.22" # 追加
}

https://spring.io/guides/tutorials/spring-boot-kotlin

@Entity
@Table(name = "tamesi")
data class TamesiTableData(
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) # 追加
    val id: Int?, # Int型に変更
    val name: String,
    val age: Int
)

実行

以下で実行。

$ docker compose up -d --build

スクリーンショット 0006-04-18 16.52.21.png
スクリーンショット 0006-04-18 16.52.42.png
スクリーンショット 0006-04-18 16.52.36.png
いい感じに動いてそうなのでsaveから

$ curl -X POST -H "Content-Type: application/json" -d '{"name":"taro", "age":11}' localhost:8081/save

レスポンスはこれ

{"name":"taro","age":11}

Adminerからも見てみる

スクリーンショット 0006-04-18 16.50.37.png
スクリーンショット 0006-04-18 16.54.10.png
OKっぽい

取得の方も叩いてみる

$ curl "localhost:8081/get/1"

レスポンス

{"name":"taro","age":11}

OK!

終了時は以下コマンドで

$ docker compose down -v

ところでこれって関数型プログラミングとか全然触れてないですね。