サーバサイドKotlinのすすめ

106e9af235dcfbc6251b38def24a0f8b?s=47 noripi
August 05, 2017

 サーバサイドKotlinのすすめ

2017.08.05 buildersconで使用したスライドです。

106e9af235dcfbc6251b38def24a0f8b?s=128

noripi

August 05, 2017
Tweet

Transcript

  1. αʔόαΠυ,PUMJOͷ͢͢Ί CVJMEFSTDPO /PSJZVLJ*TIJEB 

  2. ͍͋ͭࣗ͝͞ݾ঺հ  ɾ/PSJZVLJ*TIJEB ɾάϧϝܥͷ8FCαʔϏεΛӡӦ ɾ3FUUZגࣜձࣾ ɾΤϯδχΞ ɾαʔόαΠυ +BWB,PUMJO1)11ZUIPO ɾJ04 0CKFDUJWF$4XJGU

    ɾΠϯϑϥपΓ͸ଟগ "84%PDLFS
  3.  ຊ೔͸,PUMJOͷ͓࿩

  4.  ,PUMJOͱ͍͑͹ʜ

  5. (PPHMF*0ʹͯ"OESPJEެࣜݴޠ
 ɹͱͯ͠αϙʔτ͢Δ͜ͱ͕ൃදɹʂ 

  6. "OESPJEք۾Ͱ͸,PUMJOΛ࢖͍࢝ΊΔਓ͕
 ʹΘ͔ʹ૿͖͍͑ͯͯΔ 

  7. Ͱ΋"OESPJEઐ༻ͷݴޠͱ͍͏Θ͚Ͱ͸ͳ͍ 

  8. ຊ೔ͷ͓࿩  αʔόαΠυͰͦ͜,PUMJOΛ࢖͓͏ʂ

  9. ຊ೔ͷ͓࿩  ɾ,PUMJOΛಋೖͨ͠ܦҢ ɾαʔόαΠυͰ,PUMJOΛ͓͢͢Ί͍ͨ͠ཧ༝

  10. ࠃ಺/P໊࣮άϧϝαʔϏε3FUUZͷӡӦ ೥ઃཱ XFCͱΞϓϦͰαʔϏεల։ γϯάϧυϝΠϯ εϚϗϑΝʔετ ݄ؒສ66 

  11. 3FUUZ  ɾ8FC ɾΞϓϦ

  12. ฐࣾʹ͓͚ΔαʔόαΠυ,PUMJO  ɾΞϓϦ༻"1*ʹ,PUMJOΛ࢖͍ͬͯ·͢ "1*αʔό +40/ ɾΞϓϦ͸"1*Λ௨ͯ͡σʔλΛऔಘͯͦ͠ΕΛ੔ܗͯ͠දࣔ %# "QQ

  13. ,PUMJOΛಋೖͨ͠ܦҢ

  14. ,PUMJOͰ࡞Δલͷ࿩1)1ͷ࣌୅    XFCΞϓϦέʔγϣϯ
 αʔό )5.-Λऔಘ͢ΔFOEQPJOU )5.- +40/Λऔಘ͢ΔFOEQPJOU +40/

    8FC "QQ ɾ"1*͸1)1Ͱॻ͔Ε͍ͯͨ ɾࣾ಺ʹ1)1Λॻ͚Δਓ͕ଟ͘։ൃεϐʔυ΋଎͍
  15. ,PUMJOͰ࡞Δલͷ࿩1)1ͷ࣌୅    ɾฦΓ஋ͷܕΛݫີʹఆ͍ٛͯ͠ͳ͔ͬͨ ɾฦΓ஋͸΄΅+40/ܗ͕ࣜͩҧ͏͜ͱ΋͋Δ ɾ"1*Λୟ͔ͳ͍ͱฦΓ஋ͷܕ͕Θ͔Βͳ͍ ɾಉ͡LFZͰ΋ɺܕ͕Ұҙʹఆ·Βͳ͍͜ͱ͕͋Δ ɾฦΓ஋ͷෆඋΛॲཧ͢Δͷ͸ΫϥΠΞϯτଆͷ੹຿ XFCΞϓϦέʔγϣϯ


    αʔό "SSBZ4USJOH͍ͩ͘͞ʂ GBMTF "QQ
  16. ,PUMJOͰ࡞Δલͷ࿩1)1ͷ࣌୅    ɾ"1*αʔόͷ෼཭Λܾஅ ɾฦΓ஋ͷܕΛ͖ͪΜͱࣄલʹఆٛ ɾ։ൃ଎౓ΑΓ඼࣭Λ༏ઌͯ͠ϓϩμΫτΛͭ͘Δ XFCΞϓϦέʔγϣϯαʔό "SSBZ4USJOH͍ͩ͘͞ʂ <lBz

    lCz lDz> "1*αʔό ɾΞϓϦΤϯδχΞͷਫ਼ਆӴੜΛอͭ "QQ
  17. ,PUMJOͰ࡞Δલͷ࿩+BWBͷ࣌୅  ɾ1)1͔Β+BWB΁ͷҠߦ ɾ+BWB͸αʔόαΠυݴޠͱ࣮ͯ͠੷͕͋Γɺ'8΋๛෋ ɾฦΓ஋ͷܕΛ10+0 ී௨ͷ+BWBΦϒδΣΫτ Ͱఆٛ ɾ+6OJUΛ࢖ͬͯςετ΋ॻ͖΍͍͢ ɾ੩తܕ෇͚ݴޠͳͷͰ඼࣭͕อͪ΍͍͢ ɾ৽͘͠࡞ΔͳΒϞμϯͳػೳΛ࢖͍͍ͨ

    ɾ+BWBΛಋೖͨ͠ ɾϥϜμه๏4USFBN"1*0QUJPOBMܕ͕࢖͑Δ
  18. ͜ͷ࣌͸,PUMJOΛಋೖ͢Δؾ͸ແ͔ͬͨ
 ʢͱ͍͏ΑΓ஌Βͳ͔ͬͨʣ 

  19.  ͕ɺ͋Δ೔͜Μͳ͜ͱ͕

  20.  ͦ͜Ͱ

  21. ,PUMJO͸͓΋ΉΖʹಋೖ͞Εͨ 

  22. ͦΜͳಋೖ͔Β೥ʜ 

  23. ,PUMJOΛಋೖͯ͠Ұ൪Α͔ͬͨ͜ͱ  ɾ/VMMBCMFͳฦΓ஋ΛίϯύΠϥϨϕϧͰ
 ɹνΣοΫͰ͖ΔΑ͏ʹͳͬͨ ɾͦ΋ͦ΋1)1͔ΒҠߦͨ͠໨త͸ɺฦΓ஋ͷܕΛݫີʹఆٛ͢Δ͜ͱ ɾ+BWB࣌୅ʹ͸!/VMMBCMFΞϊςʔγϣϯͰදݱ͍͕ͯͨ͠ɺίϯύΠϥ
 ɹνΣοΫ͕ͳ͍ͨΊ࣮ଶͱҟͳ͍ͬͯͨ ɾ0QUJPOBM͸4FSJBMJ[BCMFͰ͸ͳ͍ͨΊ֎޲͖ͷΠϯλϑΣʔεͱͯ͠͸
 ɹ޲͔ͳ͍

  24. αʔόαΠυͰ,PUMJOΛ͓͢͢Ί͍ͨ͠ཧ༝

  25. αʔόαΠυͱ͍ͬͯ΋ϓϩμΫτ͸༷ʑ 

  26. ֎෦ΠϯλϑΣʔεΛ࣋ͭ8FCΞϓϦέʔγϣϯͰ ,PUMJOΛ͓͢͢Ί͍ͨ͠ 

  27. ,PUMJOΛ͓͢͢Ί͢Δཧ༝  ɾ/VMMBCMFܕʢ0QUJPOBMܕͰ͸ͳ͘ʣΛ΋ͭ ɹ਺গͳ͍ݴޠͷͭ ɾ+BWBͱDPNQBUJCMF ɾαʔόαΠυͰ࣮੷ͷ͋Δ+BWBͷ๛෋ͳϥΠϒϥϦΛ;ΜͩΜʹ࢖͑Δ ɾطʹ+BWBͷϓϩμΫτ͕͋ΔͳΒ͙͢ʹಋೖͰ͖Δ ɾ໊લ͕͔Θ͍͍

  28. /VMMBCMFܕͱ0QUJPOBMܕͷҧ͍  ɾ஌ΔݶΓͰ͸$,PUMJO͚͕ͩ΋ͭػߏ ɾʮOVMMʹͳΓ͏Δʯ͔Ͳ͏͔ʹͷΈؔ৺Λ͍࣋ͬͯΔ ɾ/VMMBCMFܕ ɾಉ͡ܕͷඇ/VMMܕ͸/VMMBCMFܕͱܧঝؔ܎ʹ͋Δ ɾ+BWB4DBMB4XJGUͳͲϞμϯͳݴޠ͕΋ͭػߏ ɾ0QUJPOBMܕ ɾݩͷܕ͔OVMMͷͲͪΒ͔Λ࣋ͭϥοϓܕͱ͍͏ߟ͑ํ ɾΞϯϥοϓͯ͠த਎ΛऔΓग़ͯ͠ૢ࡞͢Δ

    ɾ0QUJPOBM͸ωετ͢Δʢ0QUJPOBMͷ0QUJPOBM͕ଘࡏ͢Δʣ
  29. /VMMBCMFܕ͕͋Ε͹  ɾ֎෦ΠϯλϑΣʔεΛఆٛ͢Δ৔໘Ͱ༗༻ ɾOVMMʹͳΓ͏Δ͔Ͳ͏͔͕ఆٛͰ͖Δ ɾ4XJGUͳͲͷΑ͏ͳ0QUJPOBMܕΛඋ͑Δݴޠ͔Β"1*Λ࢖͏৔߹ಛʹॏཁ ɾ0QUJPOBMܕ͸ʁ ɾݩͷܕΛϥοϓͨ͠ผͷܕ 0QUJPOBM5 ɾωετ·ͰදݱͰ͖Δඞཁ͸ͳ͍ ˠ֎෦ΠϯλϑΣʔεͷදݱʹ͸ʮOVMMͰ͋Δ͔ͦ͏Ͱͳ͍͔ʯ

    ɹ͚ͩΛදݱ͢Δ/VMMBCMFܕ͕ͪΐ͏ͲΑ͍ ɾ4FSJBMJ[BCMFͰͳ͍ݴޠ΋͋Δ
  30. ޾ͤʹͳΕͦ͏ͳ,PUMJOͷػೳ

  31. ޾ͤʹͳΕͦ͏ͳ,PUMJOͷػೳ  interface IRestaurantInfo { @JsonProperty(“restaurant_id”) val restaurantId: Long @JsonProperty(“restaurant_name”)

    val restaurantName: String } ɾEBUBDMBTT ɾ୯ʹσʔλߏ଄͚ͩΛද͢Ϋϥεʢ$ݴޠ΍4XJGUͰ͍͏ߏ଄ମʣΛ
 ɹγϯϓϧʹදݱͰ͖Δ ɾΠϯλϑΣʔεΛ࣮૷͢Δ͜ͱ΋Ͱ͖ΔͷͰදهΏΕͷܰݮʹ໾ཱͭ data class Restaurant(override val restaurantId: Long, 
 override val restaurantName: String, val station: Station?): IRestaurantInfo
  32. ޾ͤʹͳΕͦ͏ͳ,PUMJOͷػೳ  ɾJGXIFOUSZ͸ࣜ ɾͭ·ΓฦΓ஋Λ͍࣋ͬͯΔ Restaurant jsonObj; try { jsonObj =

    ObjectMapper().readValue(result, Restaurant.class); } catch (JsonProcessingException e) { jsonObj = RestaurantModel.get(id); } val jsonObj: Restaurant = try { ObjectMapper().readValue(result, Restaurant::class.java) } catch (e: JsonProcessingException) { RestaurantModel.get(id) }
  33. ޾ͤʹͳΕͦ͏ͳ,PUMJOͷػೳ  ɾ֦ுؔ਺ ɾطଘͷΫϥεʹࣗ෼ͷ޷͖ͳϝιουΛ଍͢͜ͱ͕Ͱ͖Δ fun <K, V> Map<K, V>.toQueryString(): String

    { return this.keys.map { key -> this[key]?.let { “$key=${this[key]}" } }.filterNotNull().joinToString("&") } // a=1&b=2 val queryStr = mapOf("a" to 1, "b" to 2).toQueryString()
  34. ·ͱΊ  ɾ֎෦ΠϯλϑΣʔεΛ΋ͭ8FCΞϓϦέʔγϣϯ
 ɹʹ͸,PUMJOΛੋඇ͓͢͢Ί͍ͨ͠ ɾOVMM͔Ͳ͏͔ΛؚΊͯ֎෦ΠϯλϑΣʔεΛݫີʹఆٛͰ͖Δ ɾαʔόαΠυͰར༻࣮੷ͷ๛෋ͳ+BWBͷࢿ࢈Λ࢖͑Δ ɾಋೖ͢Δͷ͸ͱͯ΋؆୯ ɾ,PUMJOͱ͍͏ݴޠࣗମΫη͕গͳ͍͍ͯ͘ݴޠ