Kotlinサーバーサイドプログラミング実践開発ハンズオンメモ

4章以降のハンズオンを進めていく上でのメモ書き

Spring Initializrで作ったプロジェクトをIntelliJにインポートしようとしたらKotlinのバージョンが古いと言われた。IntelliJを最新にして解決。

コマンド4.2.3、curl
コマンドをシングルクオートで囲う必要あり。
curl 'http://localhost:8080/greeter/hello?name=Naoto'

コマンド4.2.8、長くてtypoしそうだったのではっておく
curl -H 'Content-Type:application/json' -X POST -d '{"name":"Kotlin"}' http://localhost:8080/greeter/hello

第5章、docker runのコマンド直接書いてるのでDockerfile使う

docker image build -t mysql .
docker container run --rm -d -p 3306:3306 --name mysql mysql
mysql -h 127.0.0.1 --port 3306 -uroot -pmysql

DB関連の写経がきついのでここに書いておく
create database example;
use example;
CREATE TABLE user (
id int(10) NOT NULL,
name varchar(16) NOT NULL,
age int(10) NOT NULL,
profile varchar(64) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
show tables;
insert into user values (100, "Ichiro", 30, "Hello"), (101, "Jiro", 25, "Hello"), (102, "Saburo", 20, "Hello");
select * from user;

MyBatis Generator全然動かん。
どうやらGradle6系じゃないと動かないとかなんとか、、
pluginをcom.thinkimi.gradle.MybatisGeneratorに変更

↑にして、Database起動したら動いた

SpringBoot起動時に'database.UserMapper'のBeanが見つからないよと言われて起動できない

implementation("org.mybatis:mybatis:3.5.10")
を
implementation("org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.2")
に変更し忘れてた

あと、MyBatisGeneratorの自動生成物の置き場がちがった
NG: database
OK: com.example.demo.database

insertのcurl文
curl -H 'Content-Type:application/json' -X POST -d '{"id":106, "name":"Nanako", "age":"7", "profile":"Good Night"}' http://localhost:8080/user/insert

npm install失敗
npm ERR! command sh -c node install.js
npm ERR! Only Mac 64 bits supported.

node modulesのchromedriverをアップデートして解消

MyBatisGeneratorのバージョン違いかなんかでLeftJoinの部分がコンパイル通らない

以下でコンパイル通った
fun BookWithRentalMapper.select(completer: SelectCompleter) =
org.mybatis.dynamic.sql.util.kotlin.mybatis3.select(columnList) {
from(book)
leftJoin(rental) {
on(rental.bookId) equalTo book.id
}
completer()
}.run(this::selectMany)

フロントでDBの内容が表示されない
-> CORSエラーでてた。フロント側のaxiosの{ withCredentials: true }をはずしたら通る。

kotlin側に以下アノテーションつけて通した
@CrossOrigin(origins = ["http://localhost:8081"], allowCredentials = "true")

insertのpostのコマンド
curl -H 'Content-Type:application/json' -X POST -d '{"id":300, "title":"Spring入門", "author":"スプリング太郎", "release_date":"2001-03-21"}' http://localhost:8080/admin/book/register

updateのpostのコマンド
curl -H 'Content-Type:application/json' -X PUT -d '{"id":300, "title":"Spring Boot入門"}' http://localhost:8080/admin/book/update

例によってSpring Securityのバージョンが古い状態で書かれているのでアップデート版で書き直す

上記影響で認証情報からキャストする部分で失敗。
Idじゃなくてメールをサービス層に渡すように回収した

jUnitはまあいいやということで飛ばした

protobufもなかなかコンパイル通らなかったけどgradleにいろいろ追加したりなんなりしてコンパイル通した

gRPCは現在のSpringBootに肉付けする感じじゃないのね。プロジェクト分ければよかった

と思ったら9.3でハンズオンあった

生成もとをクラスパスに追加みたいなやり方がわからなかったから自動生成物の出力先ディレクトリを変えてなんとかした

ktorはwebから生成。
ちょっと使い方変わってたのでそれにあわせて修正。
fun main() {
embeddedServer(Netty, port = 8080, host = "0.0.0.0") {
routing {
get("/") {
call.respondText("Hello Ktor!")
}
}
}.start(wait = true)
}

最新バージョンのKtor使う場合は結構importのやつとか変わるので公式を参照にすすめる

追加するモジュールを以下に変えておけばそんなに詰まらずできそう
implementation("io.ktor:ktor-server-locations:$ktor_version")
implementation("io.ktor:ktor-serialization-jackson:$ktor_version")
implementation("io.ktor:ktor-server-content-negotiation:$ktor_version")

登録のcurl書くの面倒だったのでIDだけにした
curl -H 'Content-Type:application/json' -X POST -d '{"id":300}' http://localhost:8080/book/register

ExposedとKotestは使ってるし飛ばす

おわり