Closed34

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

okapontaokaponta

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

okapontaokaponta

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

okapontaokaponta

コマンド4.2.3、curlコマンドをシングルクオートで囲う必要あり。

curl 'http://localhost:8080/greeter/hello?name=Naoto'

okapontaokaponta

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

okapontaokaponta

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

okapontaokaponta
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
okapontaokaponta

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;
okapontaokaponta

MyBatis Generator全然動かん。
どうやらGradle6系じゃないと動かないとかなんとか、、

pluginをcom.thinkimi.gradle.MybatisGeneratorに変更

okapontaokaponta

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

okapontaokaponta

implementation("org.mybatis:mybatis:3.5.10")

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

okapontaokaponta

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

okapontaokaponta

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

okapontaokaponta

npm install失敗

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

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

okapontaokaponta

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

okapontaokaponta

以下でコンパイル通った

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)
okapontaokaponta

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

okapontaokaponta

kotlin側に以下アノテーションつけて通した

@CrossOrigin(origins = ["http://localhost:8081"], allowCredentials = "true")
okapontaokaponta

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

okapontaokaponta

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

okapontaokaponta

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

okapontaokaponta

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

okapontaokaponta

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

okapontaokaponta

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

okapontaokaponta

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

okapontaokaponta

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

okapontaokaponta

ktorはwebから生成。
ちょっと使い方変わってたのでそれにあわせて修正。

fun main() {
    embeddedServer(Netty, port = 8080, host = "0.0.0.0") {
        routing {
            get("/") {
                call.respondText("Hello Ktor!")
            }
        }
    }.start(wait = true)
}
okapontaokaponta

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

okapontaokaponta

追加するモジュールを以下に変えておけばそんなに詰まらずできそう

    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")
okapontaokaponta

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

このスクラップは2022/08/10にクローズされました