狠狠撸

狠狠撸Share a Scribd company logo
Scala EE 7 Essentials 
@tnoda_ 
第1 回Scala 関西勉強会 
[2014-12-13 Sat]
Disclaimer 
このプレゼンテーションの内容は私自身の見解であり、必ずしも私 
の所属組織?所属団体の立場、戦略、意見を代表するものではあり 
ません。 
以下の事項は,Scala によるJava EE 7 開発の一般的な方向性に関 
する概要を説明するものです.また,情報提供を唯一の目的とする 
ものであり,いかなる契約にも組み込むことはできません.以下の 
事項は,マテリアルやコード,機能を提供するコミットメント(確 
約)するものではないため,購買決定を行う際の判断材料になさら 
ないで下さい. 
文中の社名,商品名は各社の商標または登録商標である場合があり 
ます.
Why Scala?
Why Scala? !"
Goodies 
? 型システム 
? イミュータブルな値?コレクション 
? 式 
? パターンマッチ 
? . . . 
間違いの少ないプログラムを比較的少ない労力で書ける.
[エンタープライズ開発] で検索 
(このスライドは削除されました)
Scala for Enterprise 
(このスライドは削除されました)
Java EE 7 Overview 
!"# 
$%&'(")*+ 
,-. 
/01 
/2$3/20345 
/16782 
/167!2 
/29: 
!"#3 
2;<="* 
2"%>?"*+ 
,-. 
4@*")+A;)+ 
.)*"%<"B*;%+C 
/D1 
,;((;)3 
1));*&*A;)+ 
,;)<E%%")<F3 
G*A?A*A"+ 
H&)&'"I3J"&)+ 4)*"%B%A+"3/&>&J"&)+ 
/H2 /,1 J&*<K 
!"#$ 
%#&'(#')*$
WildFly
想定出席者
想定出席者 
Scala 中?上級者 
Scala アプリケーションを開発できる.
想定出席者 
Scala 中?上級者 
Scala アプリケーションを開発できる. 
Java EE 7 開発者 
Java でJava EE 7 アプリケーションを開発できる.
想定出席者 
Scala 中?上級者 
Scala アプリケーションを開発できる. 
Java EE 7 開発者 
Java でJava EE 7 アプリケーションを開発できる. 
勇者 
上のどちらにもあてはまらない人
想定出席者 
Scala 中?上級者 
Scala アプリケーションを開発できる. 
Java EE 7 開発者 
Java でJava EE 7 アプリケーションを開発できる. 
勇者 
上のどちらにもあてはまらない人 
目標 
Java EE 7 アプリ開発のお仕事を,ついうっかりScala で書ける 
ようになる.
Outline 
本日お話ししたいこと 
? Build tools 
? Servlet 
? JAX-RS + JAXB 
本日お話ししないこと 
? CDI + JPA 
? JMS, JSF, and other specs. 
? javax.enterprise.cuncurrent 
? Testing (Arquillian)
Build tools 
SBT 
? .war ファイルにやさしくない 
Gradle 
? .war ファイルにやさしい(公式war プラグイン) 
? SBT とソースコードのディレクトリ構成は共通 
$ gradle war #=> .war
build.gradle 
plugins { 
id ’scala ’ 
id ’war ’ 
} 
war. dependsOn compileScala 
repositories { 
mavenCentral () 
} 
// Incremental compilation using Zinc 
tasks . withType ( ScalaCompile ) { 
scalaCompileOptions . useAnt = false 
} 
dependencies { 
compile ’org.scala - lang :scala - library :2.11.4 ’ 
providedCompile ’javax :javaee - api :7.0 ’ 
}
Plugins - build.gradle 
Example (plugins) 
plugins { 
id 'scala' 
id 'war' 
} 
追加されるタスク 
? scala . . . compileScala など 
? war . . . war など
Maven Central - build.gradle 
Example (repositories) 
repositories { 
mavenCentral() 
}
Incremental Build - build.gradle 
Example (ScalaCompile) 
tasks.withType(ScalaCompile) { 
scalaCompileOptions.useAnt = false 
} 
useAnt = false 
SBT と同じくZinc によるインクリメンタルなコンパイル
Dependencies - build.gradle 
Example (dependencies) 
dependencies { 
compile 'org.scala-lang:scala-library:2.11.4' 
providedCompile 'javax:javaee-api:7.0' 
} 
providedCompile 
作成される.war ファイルには含まれない.
SBT 
Example (build.sbt) 
libraryDependencies += "javax" % "javaee-api" % "7.0"
(再)build.gradle 
plugins { 
id ’scala ’ 
id ’war ’ 
} 
war. dependsOn compileScala 
repositories { 
mavenCentral () 
} 
tasks . withType ( ScalaCompile ) { 
scalaCompileOptions . useAnt = false 
} 
dependencies { 
compile ’org.scala - lang :scala - library :2.11.4 ’ 
providedCompile ’javax :javaee - api :7.0 ’ 
}
Checkpoint 1
Checkpoint 1 
Scala の勉強会に来てJava EE 7 の話を聞きに来ていた 
と思ったらGradle の話を聞いていた.
Checkpoint 1 
Scala の勉強会に来てJava EE 7 の話を聞きに来ていた 
と思ったらGradle の話を聞いていた. 
Gradle 
? プラグインの利用 
? scala, war 
? 依存関係の解決 
? task . . . dependsOn 
? library . . . providedCompile
Checkpoint 1 
Scala の勉強会に来てJava EE 7 の話を聞きに来ていた 
と思ったらGradle の話を聞いていた. 
Gradle 
? プラグインの利用 
? scala, war 
? 依存関係の解決 
? task . . . dependsOn 
? library . . . providedCompile 
SBT 
libraryDependencies += "javax" % "javaee-api" % "7.0"
Servlet とは 
上級者向けの説明
Servlet とは 
上級者向けの説明 
JSR 340 (Servlet 3.1)
Servlet とは 
上級者向けの説明 
JSR 340 (Servlet 3.1) 
j.s.h.HttpServlet を継承したクラス 
? コントローラのような何か 
? doXXX (XXX = Get, Post, . . . ) をオーバーライド
Servlet とは 
上級者向けの説明 
JSR 340 (Servlet 3.1) 
j.s.h.HttpServlet を継承したクラス 
? コントローラのような何か 
? doXXX (XXX = Get, Post, . . . ) をオーバーライド 
ルーティングなどの設定 
? XML (web.xml) 
? アノテーション 
? 動的(ServletContext.addServlet)
HelloWorldServlet.scala 
package com. example 
import javax . servlet . annotation ._ 
import javax . servlet . http ._ 
@ WebServlet ( name = " HelloWorldServlet ", 
urlPatterns = Array ("/ plain "), 
initParams = Array ( new WebInitParam ( name = " 
type ", value = " checking " ))) 
class HelloWorldServlet extends HttpServlet { 
override def doGet ( req: HttpServletRequest , res: 
HttpServletResponse ): Unit = { 
res. setContentType (" text / plain ") 
val out = res. getWriter 
out. println (" Hello?Scala?KB?#1") 
} 
}
@WebServlet 
Scala 
@ WebServlet ( name = " HelloWorldServlet ", 
urlPatterns = Array ("/ plain "), 
initParams = Array ( new WebInitParam ( name = " 
type ", value = " checking "))) 
Java
@WebServlet 
Scala 
@ WebServlet ( name = " HelloWorldServlet ", 
urlPatterns = Array ("/ plain "), 
initParams = Array ( new WebInitParam ( name = " 
type ", value = " checking "))) 
Java 
@WebServlet ( name =" HelloWorldServlet ", 
urlPatterns = {"/ plain "}, 
initParams = { @WebInitParam ( name = " type ", 
value = " checking ")})
Java アノテーションの書き方 
基本形 
@Example 
パラメータ(elements) 
@Example("FOO") 
@Example(foo = "FOO", bar = "Bar") 
配列 
@Example(name = {"John", "Smith"}) 
これは,String の配列を指定しているのと同じ
Scala アノテーションの注意点(1/2) 
配列を要求する場合 
Java 
@Example(name = {"John", "Smith"}) 
この書き方はScala ではエラーになる. 
Scala
Scala アノテーションの注意点(1/2) 
配列を要求する場合 
Java 
@Example(name = {"John", "Smith"}) 
この書き方はScala ではエラーになる. 
Scala 
@Example(name = Array("John", "Smith"))
Scala アノテーションの注意点(2/2) 
ネストしたアノテーション 
Java 
@Outer(@Inner("valid")) 
この書き方はScala ではエラーになる. 
Scala 
ネストした内側のアノテーションは@ で書けない.
Scala アノテーションの注意点(2/2) 
ネストしたアノテーション 
Java 
@Outer(@Inner("valid")) 
この書き方はScala ではエラーになる. 
Scala 
ネストした内側のアノテーションは@ で書けない. 
@Outer(new Inner("valid")) 
アノテーションがJVM のクラスであることを思い出す.
HelloWorldServlet ふたたび 
package com. example 
import javax . servlet . annotation ._ 
import javax . servlet . http ._ 
@ WebServlet ( name = " HelloWorldServlet ", 
urlPatterns = Array ("/ plain "), 
initParams = Array ( new WebInitParam ( name = " 
type ", value = " checking " ))) 
class HelloWorldServlet extends HttpServlet { 
override def doGet ( req: HttpServletRequest , res: 
HttpServletResponse ): Unit = { 
res. setContentType (" text / plain ") 
val out = res. getWriter 
out. println (" Hello?Scala?KB?#1") 
} 
}
Servlet 周辺 
? フィルタ(@WebFilter) 
? イベントリスナ(@WebListener) 
? 非同期(@WebServlet(asyncSupported=true)) 
? セキュリティ(@ServletSecurity) 
? マルチパートリクエスト(@MultipartConfig) 
これまでに説明したアノテーションで書ける.
Servlet のライフサイクル 
!" 
!"!#$% 
&'()!*'$% 
+'&#(,-$% 
# 
+,.'#$% 
+,/,&#$% 
+,/0#$%
Servlet の初期化 
Example (Java) 
MyState state = null 
@Override 
public void init ( ServletConfig config ) throws 
ServletException { 
state = doTimeConsumingInitProcess ( config ); 
// ... 
}
init() とScala との相性の悪さ 
サーブレットのinit() は状態を変更する.
init() とScala との相性の悪さ 
サーブレットのinit() は状態を変更する. 
var フィールド 
Scalastyle に怒られる.
init() とScala との相性の悪さ 
サーブレットのinit() は状態を変更する. 
var フィールド 
Scalastyle に怒られる. 
lazy val + mutable なオブジェクト 
Immutable ではないが,比較的軽微.
init() サンプルコード 
var 
class MutableServlet extends HttpServlet { 
var state : MyState = null 
override def init ( config : ServletConfig ): Unit = { 
state = MyState . doTimeConsumingInitProcess ( config ) 
// ... 
} 
} 
lazy val 
class ImmutableServlet extends HttpServlet { 
lazy val state = new MyState () 
override def init ( config : ServletConfig ): Unit = { 
state . doTimeConsumingInitProcess ( config ) 
// ... 
} 
}
Checkpoint 2
Checkpoint 2 
サーブレットの話を聞いていたと思っていたら,いつの 
まにかアノテーションの话を闻いていた.
Checkpoint 2 
サーブレットの話を聞いていたと思っていたら,いつの 
まにかアノテーションの话を闻いていた. 
アノテーション 
? 配列{ ... } 記法に注意 
? ネストしたアノテーションに注意
Checkpoint 2 
サーブレットの話を聞いていたと思っていたら,いつの 
まにかアノテーションの话を闻いていた. 
アノテーション 
? 配列{ ... } 記法に注意 
? ネストしたアノテーションに注意 
init() 問題 
? lazy val + ミュータブルなオブジェクトで対処
JAX-RS とは 
(中略)
おわりに 
Scala でJava EE 7 開発をする際のテクニック
おわりに 
Scala でJava EE 7 開発をする際のテクニック 
Gradle 
? scala, war プラグイン
おわりに 
Scala でJava EE 7 開発をする際のテクニック 
Gradle 
? scala, war プラグイン 
アノテーション 
? 配列記法, ネストしたアノテーション
おわりに 
Scala でJava EE 7 開発をする際のテクニック 
Gradle 
? scala, war プラグイン 
アノテーション 
? 配列記法, ネストしたアノテーション 
引数なしコンストラクタ 
? def this() { . . . }
おわりに 
Scala でJava EE 7 開発をする際のテクニック 
Gradle 
? scala, war プラグイン 
アノテーション 
? 配列記法, ネストしたアノテーション 
引数なしコンストラクタ 
? def this() { . . . } 
@BeanProperty 
? getFoo, setFoo(x)
結論 
Scala でJava EE 7 を書ける?
結論 
Scala でJava EE 7 を書ける? 
Scala を書ければJava EE 7 を書ける.
結論 
Scala でJava EE 7 を書ける? 
Scala を書ければJava EE 7 を書ける. 
利点
結論 
Scala でJava EE 7 を書ける? 
Scala を書ければJava EE 7 を書ける. 
利点 
ビジネスロジック(Scala) とサービスマッピング(Java 
Annotations) との分離

More Related Content

Scala EE 7 Essentials

  • 1. Scala EE 7 Essentials @tnoda_ 第1 回Scala 関西勉強会 [2014-12-13 Sat]
  • 2. Disclaimer このプレゼンテーションの内容は私自身の見解であり、必ずしも私 の所属組織?所属団体の立場、戦略、意見を代表するものではあり ません。 以下の事項は,Scala によるJava EE 7 開発の一般的な方向性に関 する概要を説明するものです.また,情報提供を唯一の目的とする ものであり,いかなる契約にも組み込むことはできません.以下の 事項は,マテリアルやコード,機能を提供するコミットメント(確 約)するものではないため,購買決定を行う際の判断材料になさら ないで下さい. 文中の社名,商品名は各社の商標または登録商標である場合があり ます.
  • 5. Goodies ? 型システム ? イミュータブルな値?コレクション ? 式 ? パターンマッチ ? . . . 間違いの少ないプログラムを比較的少ない労力で書ける.
  • 7. Scala for Enterprise (このスライドは削除されました)
  • 8. Java EE 7 Overview !"# $%&'(")*+ ,-. /01 /2$3/20345 /16782 /167!2 /29: !"#3 2;<="* 2"%>?"*+ ,-. 4@*")+A;)+ .)*"%<"B*;%+C /D1 ,;((;)3 1));*&*A;)+ ,;)<E%%")<F3 G*A?A*A"+ H&)&'"I3J"&)+ 4)*"%B%A+"3/&>&J"&)+ /H2 /,1 J&*<K !"#$ %#&'(#')*$
  • 11. 想定出席者 Scala 中?上級者 Scala アプリケーションを開発できる.
  • 12. 想定出席者 Scala 中?上級者 Scala アプリケーションを開発できる. Java EE 7 開発者 Java でJava EE 7 アプリケーションを開発できる.
  • 13. 想定出席者 Scala 中?上級者 Scala アプリケーションを開発できる. Java EE 7 開発者 Java でJava EE 7 アプリケーションを開発できる. 勇者 上のどちらにもあてはまらない人
  • 14. 想定出席者 Scala 中?上級者 Scala アプリケーションを開発できる. Java EE 7 開発者 Java でJava EE 7 アプリケーションを開発できる. 勇者 上のどちらにもあてはまらない人 目標 Java EE 7 アプリ開発のお仕事を,ついうっかりScala で書ける ようになる.
  • 15. Outline 本日お話ししたいこと ? Build tools ? Servlet ? JAX-RS + JAXB 本日お話ししないこと ? CDI + JPA ? JMS, JSF, and other specs. ? javax.enterprise.cuncurrent ? Testing (Arquillian)
  • 16. Build tools SBT ? .war ファイルにやさしくない Gradle ? .war ファイルにやさしい(公式war プラグイン) ? SBT とソースコードのディレクトリ構成は共通 $ gradle war #=> .war
  • 17. build.gradle plugins { id ’scala ’ id ’war ’ } war. dependsOn compileScala repositories { mavenCentral () } // Incremental compilation using Zinc tasks . withType ( ScalaCompile ) { scalaCompileOptions . useAnt = false } dependencies { compile ’org.scala - lang :scala - library :2.11.4 ’ providedCompile ’javax :javaee - api :7.0 ’ }
  • 18. Plugins - build.gradle Example (plugins) plugins { id 'scala' id 'war' } 追加されるタスク ? scala . . . compileScala など ? war . . . war など
  • 19. Maven Central - build.gradle Example (repositories) repositories { mavenCentral() }
  • 20. Incremental Build - build.gradle Example (ScalaCompile) tasks.withType(ScalaCompile) { scalaCompileOptions.useAnt = false } useAnt = false SBT と同じくZinc によるインクリメンタルなコンパイル
  • 21. Dependencies - build.gradle Example (dependencies) dependencies { compile 'org.scala-lang:scala-library:2.11.4' providedCompile 'javax:javaee-api:7.0' } providedCompile 作成される.war ファイルには含まれない.
  • 22. SBT Example (build.sbt) libraryDependencies += "javax" % "javaee-api" % "7.0"
  • 23. (再)build.gradle plugins { id ’scala ’ id ’war ’ } war. dependsOn compileScala repositories { mavenCentral () } tasks . withType ( ScalaCompile ) { scalaCompileOptions . useAnt = false } dependencies { compile ’org.scala - lang :scala - library :2.11.4 ’ providedCompile ’javax :javaee - api :7.0 ’ }
  • 25. Checkpoint 1 Scala の勉強会に来てJava EE 7 の話を聞きに来ていた と思ったらGradle の話を聞いていた.
  • 26. Checkpoint 1 Scala の勉強会に来てJava EE 7 の話を聞きに来ていた と思ったらGradle の話を聞いていた. Gradle ? プラグインの利用 ? scala, war ? 依存関係の解決 ? task . . . dependsOn ? library . . . providedCompile
  • 27. Checkpoint 1 Scala の勉強会に来てJava EE 7 の話を聞きに来ていた と思ったらGradle の話を聞いていた. Gradle ? プラグインの利用 ? scala, war ? 依存関係の解決 ? task . . . dependsOn ? library . . . providedCompile SBT libraryDependencies += "javax" % "javaee-api" % "7.0"
  • 30. Servlet とは 上級者向けの説明 JSR 340 (Servlet 3.1) j.s.h.HttpServlet を継承したクラス ? コントローラのような何か ? doXXX (XXX = Get, Post, . . . ) をオーバーライド
  • 31. Servlet とは 上級者向けの説明 JSR 340 (Servlet 3.1) j.s.h.HttpServlet を継承したクラス ? コントローラのような何か ? doXXX (XXX = Get, Post, . . . ) をオーバーライド ルーティングなどの設定 ? XML (web.xml) ? アノテーション ? 動的(ServletContext.addServlet)
  • 32. HelloWorldServlet.scala package com. example import javax . servlet . annotation ._ import javax . servlet . http ._ @ WebServlet ( name = " HelloWorldServlet ", urlPatterns = Array ("/ plain "), initParams = Array ( new WebInitParam ( name = " type ", value = " checking " ))) class HelloWorldServlet extends HttpServlet { override def doGet ( req: HttpServletRequest , res: HttpServletResponse ): Unit = { res. setContentType (" text / plain ") val out = res. getWriter out. println (" Hello?Scala?KB?#1") } }
  • 33. @WebServlet Scala @ WebServlet ( name = " HelloWorldServlet ", urlPatterns = Array ("/ plain "), initParams = Array ( new WebInitParam ( name = " type ", value = " checking "))) Java
  • 34. @WebServlet Scala @ WebServlet ( name = " HelloWorldServlet ", urlPatterns = Array ("/ plain "), initParams = Array ( new WebInitParam ( name = " type ", value = " checking "))) Java @WebServlet ( name =" HelloWorldServlet ", urlPatterns = {"/ plain "}, initParams = { @WebInitParam ( name = " type ", value = " checking ")})
  • 35. Java アノテーションの書き方 基本形 @Example パラメータ(elements) @Example("FOO") @Example(foo = "FOO", bar = "Bar") 配列 @Example(name = {"John", "Smith"}) これは,String の配列を指定しているのと同じ
  • 36. Scala アノテーションの注意点(1/2) 配列を要求する場合 Java @Example(name = {"John", "Smith"}) この書き方はScala ではエラーになる. Scala
  • 37. Scala アノテーションの注意点(1/2) 配列を要求する場合 Java @Example(name = {"John", "Smith"}) この書き方はScala ではエラーになる. Scala @Example(name = Array("John", "Smith"))
  • 38. Scala アノテーションの注意点(2/2) ネストしたアノテーション Java @Outer(@Inner("valid")) この書き方はScala ではエラーになる. Scala ネストした内側のアノテーションは@ で書けない.
  • 39. Scala アノテーションの注意点(2/2) ネストしたアノテーション Java @Outer(@Inner("valid")) この書き方はScala ではエラーになる. Scala ネストした内側のアノテーションは@ で書けない. @Outer(new Inner("valid")) アノテーションがJVM のクラスであることを思い出す.
  • 40. HelloWorldServlet ふたたび package com. example import javax . servlet . annotation ._ import javax . servlet . http ._ @ WebServlet ( name = " HelloWorldServlet ", urlPatterns = Array ("/ plain "), initParams = Array ( new WebInitParam ( name = " type ", value = " checking " ))) class HelloWorldServlet extends HttpServlet { override def doGet ( req: HttpServletRequest , res: HttpServletResponse ): Unit = { res. setContentType (" text / plain ") val out = res. getWriter out. println (" Hello?Scala?KB?#1") } }
  • 41. Servlet 周辺 ? フィルタ(@WebFilter) ? イベントリスナ(@WebListener) ? 非同期(@WebServlet(asyncSupported=true)) ? セキュリティ(@ServletSecurity) ? マルチパートリクエスト(@MultipartConfig) これまでに説明したアノテーションで書ける.
  • 42. Servlet のライフサイクル !" !"!#$% &'()!*'$% +'&#(,-$% # +,.'#$% +,/,&#$% +,/0#$%
  • 43. Servlet の初期化 Example (Java) MyState state = null @Override public void init ( ServletConfig config ) throws ServletException { state = doTimeConsumingInitProcess ( config ); // ... }
  • 44. init() とScala との相性の悪さ サーブレットのinit() は状態を変更する.
  • 45. init() とScala との相性の悪さ サーブレットのinit() は状態を変更する. var フィールド Scalastyle に怒られる.
  • 46. init() とScala との相性の悪さ サーブレットのinit() は状態を変更する. var フィールド Scalastyle に怒られる. lazy val + mutable なオブジェクト Immutable ではないが,比較的軽微.
  • 47. init() サンプルコード var class MutableServlet extends HttpServlet { var state : MyState = null override def init ( config : ServletConfig ): Unit = { state = MyState . doTimeConsumingInitProcess ( config ) // ... } } lazy val class ImmutableServlet extends HttpServlet { lazy val state = new MyState () override def init ( config : ServletConfig ): Unit = { state . doTimeConsumingInitProcess ( config ) // ... } }
  • 49. Checkpoint 2 サーブレットの話を聞いていたと思っていたら,いつの まにかアノテーションの话を闻いていた.
  • 50. Checkpoint 2 サーブレットの話を聞いていたと思っていたら,いつの まにかアノテーションの话を闻いていた. アノテーション ? 配列{ ... } 記法に注意 ? ネストしたアノテーションに注意
  • 51. Checkpoint 2 サーブレットの話を聞いていたと思っていたら,いつの まにかアノテーションの话を闻いていた. アノテーション ? 配列{ ... } 記法に注意 ? ネストしたアノテーションに注意 init() 問題 ? lazy val + ミュータブルなオブジェクトで対処
  • 53. おわりに Scala でJava EE 7 開発をする際のテクニック
  • 54. おわりに Scala でJava EE 7 開発をする際のテクニック Gradle ? scala, war プラグイン
  • 55. おわりに Scala でJava EE 7 開発をする際のテクニック Gradle ? scala, war プラグイン アノテーション ? 配列記法, ネストしたアノテーション
  • 56. おわりに Scala でJava EE 7 開発をする際のテクニック Gradle ? scala, war プラグイン アノテーション ? 配列記法, ネストしたアノテーション 引数なしコンストラクタ ? def this() { . . . }
  • 57. おわりに Scala でJava EE 7 開発をする際のテクニック Gradle ? scala, war プラグイン アノテーション ? 配列記法, ネストしたアノテーション 引数なしコンストラクタ ? def this() { . . . } @BeanProperty ? getFoo, setFoo(x)
  • 58. 結論 Scala でJava EE 7 を書ける?
  • 59. 結論 Scala でJava EE 7 を書ける? Scala を書ければJava EE 7 を書ける.
  • 60. 結論 Scala でJava EE 7 を書ける? Scala を書ければJava EE 7 を書ける. 利点
  • 61. 結論 Scala でJava EE 7 を書ける? Scala を書ければJava EE 7 を書ける. 利点 ビジネスロジック(Scala) とサービスマッピング(Java Annotations) との分離