個人的にkotlinを勉強していくのでその作業記録をつけたい
筆者はwebエンジニア歴10年だが内製ばっかやってる弱小
昔php + FuelPHP、今Java + spring boot、DDDをちょっとかじる
最近の新卒の子がElixir使いだったけどナニソレ?関数型プログラミング全然わからん
じゃあ遊んでみるしかないな
kotlinはjavaに似ててオブジェクト指向的にも関数型プログラミング的にも書けるらしいな、とりあえず触ろう
そのうちscala → Elixirみたいに手を広げるゾ!
そして体を壊して休職したのでこれ幸いと手を出す
環境構築は昨日やったので今日はskeleton作っていきます
公式ドキュメント、英語でも気にしない雰囲気わかれば良し
Building web applications with Spring Boot and Kotlin
Creating a New Projectの項目で
Using the Initializr Websiteとコマンドライン、IntelliJ IDEA Ultimateを使う手順とかGradleじゃなくてMavenの手順とか紹介されているが、素直に一番上を使用していきます。
いっつも思うんだけどinitializrのzrの部分、よくzerと書いてしまうけどスペルはzrが正しいんだよな。
追加するよう言われているDependenciesは以下の通り
plugin | 内容 |
---|---|
Spring Web | おなじみのMVCするやつ |
Mustache | 意味は「口ひげ」web テンプレートシステム 一応いれる |
Spring Data JPA | こちらもおなじみのJPA DBに関してはちょっとあとで自分でやりたいので今回は外しとく |
H2 Database | 同じく外しとく |
Spring Boot DevTools | これもおなじみのあれ 開発中の変更がすぐ反映されるよ |
これでGENERATEボタンを押すと(Initializrで設定した名前).zipファイルがダウンロードされる。
公式チュートリアルではGradle解説みたいなこと言ってるのでIntelliJで開いていこう。
zip解凍してこちらに移動。
# IntelliJのデフォのディレクトリに持っていく
$ mv (解凍したtamesiフォルダ) ~/IdeaProjects
IntelliJでopenを選択し↑のディレクトリを指定。
今回入れたpluginとかmain関数とかHtmlControllerとか解説されてるけど作りたいのはAPIなので全部飛ばします。
kotlinに触るのがガチ初めてなので文法とかはとほほ先生にお世話になりつつ、書いたのがこれ。
コントローラー (jp/gooye/toy/tamesi/controller/TamesiController.kt)
```kt:jp/gooye/toy/tamesi/controller/TamesiController.kt
package jp.gooye.toy.tamesi.controller;
import jp.gooye.toy.tamesi.model.TamesiResponse
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
class TamesiController {
@GetMapping("/tamesi")
fun welcome() = TamesiResponse(message = "hello world!!")
}
リソース(jp/gooye/toy/tamesi/model/TamesiResponse.kt)
```kt:jp/gooye/toy/tamesi/model/TamesiResponse.kt
package jp.gooye.toy.tamesi.model
data class TamesiResponse(var message: String)
あ、jdkのバージョン指定とかIntelliJの設定とかgradleの導入手順とか書き忘れてるな……まあいいかjenvだけ念の為合わせとこ。
intelliJの中でターミナル開いて
$ jenv local 17.0.9
$ java --version
openjdk 17.0.9 2023-10-17
OpenJDK Runtime Environment Homebrew (build 17.0.9+0)
OpenJDK 64-Bit Server VM Homebrew (build 17.0.9+0, mixed mode, sharing)
この2つのktファイルを追加して、intelliJの右上のぞうさんマークから実行してみる
gradle clean bootRun
springの起動ログが見えたら、
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v3.2.2)
(中略)
2024-02-21T19:05:42.670+09:00 INFO 18060 --- [ restartedMain] j.gooye.toy.tamesi.TamesiApplicationKt : Started TamesiApplicationKt in 0.759 seconds (process running for 1.007)
curl!
$ curl localhost:8080/tamesi
{"message":"hello world!!"}
ローカルで動くとこまで行きました。
明日はいよいよDockerに触ります。
何が | どれ |
---|---|
PC | iMac |
チップ | Apple M1 |
OS | Sonoma |
IDE | IntelliJ IDEA (Community Edition) |
パッケージ管理システム | 当然!「Homebrew」だッ! |
javaバージョン管理 | jenv |
使用言語 | kotlin 1.9.22 |
フレームワーク | spring boot |
ターミナル | iTerm2 |
特にバージョン違いの管理をする予定はないが手癖でいれる
$ brew install jenv
IDE
$ brew install intellij-idea-ce
JDK Apple M1に対応してるJDKを探しつつ、なぜかjava17も入れておく jenvの挙動試すの久々だったし
$ brew install java
$ brew install openjdk@17
M1向けjdkはzulu使えみたいなんあるけどbrewのページだとおkになってんだよな よくわからん
jenvいれる
公式ドキュメントを参考に
$ brew install jenv
メモ忘れたけど公式ドキュメント参考にdoctorとかして最終的にzshrcにはこれを追加
export PATH="/Users/sakamotokeika/.jenv/shims:${PATH}"
export JENV_SHELL=zsh
export JENV_LOADED=1
unset JAVA_HOME
unset JDK_HOME
source '/opt/homebrew/Cellar/jenv/0.5.6/libexec/libexec/../completions/jenv.zsh'
jenv rehash 2>/dev/null
jenv refresh-plugins
jenv() {
type typeset &> /dev/null && typeset command
command="$1"
if [ "$#" -gt 0 ]; then
shift
fi
case "$command" in
enable-plugin|rehash|shell|shell-options)
eval `jenv "sh-$command" "$@"`;;
*)
command jenv "$command" "$@";;
esac
}
jenvにjdk追加
$ brew info openjdk@17
==> openjdk@17: stable 17.0.9 (bottled) [keg-only]
Development kit for the Java programming language
[https://openjdk.java.net/](https://openjdk.java.net/)
/opt/homebrew/Cellar/openjdk@17/17.0.9 (635 files, 304.9MB)
Poured from bottle using the formulae.brew.sh API on 2024-02-13 at 18:57:08
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/o/[email protected]
License: GPL-2.0-only with Classpath-exception-2.0
==> Dependencies
Build: autoconf ✔, pkg-config ✔
Required: giflib ✔, harfbuzz ✔, jpeg-turbo ✔, libpng ✔, little-cms2 ✔
==> Requirements
Build: Xcode (on macOS) ✘
==> Caveats
For the system Java wrappers to find this JDK, symlink it with
sudo ln -sfn /opt/homebrew/opt/openjdk@17/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-17.jdk
openjdk@17 is keg-only, which means it was not symlinked into /opt/homebrew,
because this is an alternate version of another formula.
If you need to have openjdk@17 first in your PATH, run:
echo 'export PATH="/opt/homebrew/opt/openjdk@17/bin:$PATH"' >> ~/.zshrc
For compilers to find openjdk@17 you may need to set:
export CPPFLAGS="-I/opt/homebrew/opt/openjdk@17/include"
==> Analytics
install: 18,294 (30 days), 59,204 (90 days), 273,258 (365 days)
install-on-request: 15,800 (30 days), 49,966 (90 days), 180,903 (365 days)
build-error: 101 (30 days)
おっふXcodeないやんけ
==> Requirements
Build: Xcode (on macOS) ✘
% brew search Xcode
==> Formulae
xcode-build-server xcode-kotlin xcodegen xcodes coder
==> Casks
copilot-for-xcode swiftformat-for-xcode xcodeclangformat xcodes xscope
If you meant "Xcode" specifically:
Xcode can be installed from the App Store.
しゃあないAppStoreから落とすか
If you meant "Xcode" specifically:
Xcode can be installed from the App Store.
今度こそadd
$ jenv add /opt/homebrew/opt/openjdk@17/libexec/openjdk.jdk/Contents/Home
動作確認
$ jenv versions
* system (set by /Users/sakamotokeika/.jenv/version)
17.0
17.0.9
20.0
20.0.2
21.0
21.0.2
openjdk64-17.0.9
openjdk64-20.0.2
openjdk64-21.0.2
適当なディレクトリほって確認
$ jenv local 17.0.9
$ jenv versions
system
17.0
* 17.0.9 (set by /Users/sakamotokeika/dev/scala/.java-version)
20.0
20.0.2
21.0
21.0.2
openjdk64-17.0.9
openjdk64-20.0.2
openjdk64-21.0.2
OK!
kotlin
$ brew install kotlin
一旦ここまで