Lagom with Scala 해주세요! 【그 2:최소 서비스의 작성】
Lagom with Scala 해주세요! 【그 1:환경 구축】
전회까지로, 환경 구축은 끝났으므로, 이번은 새롭게 서비스를 작성합니다.
제공되고 있는 Hello World는 여러가지 것이 기재되어 있어 이해가 어려웠으므로, 한층 더 코드를 깎아내어, 최저한 움직이는 서비스(Get 메소드로 String를 취득하는 것만)를 만듭니다.
이번에 만든 코드
여기에 있습니다.
htps : // 기주 b. 이 m / 가쿠 3601 / s dy-o m / t Ree / s는 p2
api와 impl 폴더 만들기
PJ 루트에 my-study-lagom-api와 my-study-lagom-impl 폴더를 만듭니다. 이 상태라면 아직 module로 인식되지 않은 상태군요.
모듈 추가
study-lagom/build.sbt를 다음과 같이 수정합니다.
study-lagom/build.sbtorganization in ThisBuild := "com.example"
version in ThisBuild := "1.0-SNAPSHOT"
// the Scala version that will be used for cross-compiled libraries
scalaVersion in ThisBuild := "2.13.0"
val macwire = "com.softwaremill.macwire" %% "macros" % "2.3.3" % "provided"
val scalaTest = "org.scalatest" %% "scalatest" % "3.1.1" % Test
// 追記
lazy val `study-lagom` = (project in file("."))
.aggregate(`my-study-lagom-api`, `my-study-lagom-impl`, `study-lagom-api`, `study-lagom-impl`, `study-lagom-stream-api`, `study-lagom-stream-impl`)
// 追加
lazy val `my-study-lagom-api` = (project in file("my-study-lagom-api"))
.settings(
libraryDependencies ++= Seq(
lagomScaladslApi
)
)
// 追加
lazy val `my-study-lagom-impl` = (project in file("my-study-lagom-impl"))
.enablePlugins(LagomScala)
.settings(
libraryDependencies ++= Seq(
macwire,
)
)
.dependsOn(`my-study-lagom-api`)
lazy val `study-lagom-api` = (project in file("study-lagom-api"))
.settings(
libraryDependencies ++= Seq(
lagomScaladslApi
)
)
lazy val `study-lagom-impl` = (project in file("study-lagom-impl"))
.enablePlugins(LagomScala)
.settings(
libraryDependencies ++= Seq(
lagomScaladslPersistenceCassandra,
lagomScaladslKafkaBroker,
lagomScaladslTestKit,
macwire,
scalaTest
)
)
.settings(lagomForkedTestSettings)
.dependsOn(`study-lagom-api`)
lazy val `study-lagom-stream-api` = (project in file("study-lagom-stream-api"))
.settings(
libraryDependencies ++= Seq(
lagomScaladslApi
)
)
lazy val `study-lagom-stream-impl` = (project in file("study-lagom-stream-impl"))
.enablePlugins(LagomScala)
.settings(
libraryDependencies ++= Seq(
lagomScaladslTestKit,
macwire,
scalaTest
)
)
.dependsOn(`study-lagom-stream-api`, `study-lagom-api`)
이제 모듈로 인식되어야합니다.
구현
우선, 이해하고 있는 부분에는 코멘트를 기재했습니다. 이해할 수 없는 곳은 푹신한 코멘트를 기재하고 있습니다만, 스루 주시면 다행입니다. (자신의 각서용으로. 이해할 수 있으면 갱신합니다.
api 구현
다음과 같이 계층 구조를 만들고 서비스 파일을 만듭니다.
그래서 이런 식으로 구현.
MyStudyLagomService.scalapackage com.example.mystudylagom.api
import akka.NotUsed
import com.lightbend.lagom.scaladsl.api.{Descriptor, Service, ServiceCall}
trait MyStudyLagomService extends Service {
/**
* Example: curl http://localhost:9000/api/hello2/Alice
* id: stringには/api/hello2/:idのidが入ってくる
* ServiceCall[NotUsed, String]のNotUsed部分にはrequest bodyが、Stringはresponseの肩
* 今回、request bodyはNotUsedで使わないことを宣言している→つまり取得処理
* lagomはServiceCall[NotUsed, String]自動的にGetメソッドと判断する
*/
def hello(id: String): ServiceCall[NotUsed, String]
override final def descriptor: Descriptor = {
import Service._
named("my-study-lagom")
.withCalls(
pathCall("/api/hello2/:id", hello _), // APIルーティングを定義
)
.withAutoAcl(true) // これはつけとかないと動かない。
}
}
ServiceImpl 만들기
계층은 이런 느낌.
에서 MyStudyLagomServiceImpl.scala
MyStudyLagomServiceImpl.scalapackage com.example.mystudylagom.impl
import akka.NotUsed
import com.example.mystudylagom.api.MyStudyLagomService
import com.lightbend.lagom.scaladsl.api.ServiceCall
import scala.concurrent.Future
class MyStudyLagomServiceImpl() extends MyStudyLagomService {
// apiの実装の中身。「_ =>」の_にはpostの場合、request bodyが入ってくるみたい。
override def hello(id: String): ServiceCall[NotUsed, String] = ServiceCall { _ =>
// なんでもかんでもFutureで返せばOKっぽい?
Future.successful("test")
}
}
이제 시작하면 움직이는 것 같지만 오류가 발생합니다. 살짝 조사한 느낌 DI를 하기 위한 Loader가 필요하다는 것.
이런 식으로 구현
MyStudyLagomLoader.scalapackage com.example.mystudylagom.impl
import com.example.mystudylagom.api.MyStudyLagomService
import com.lightbend.lagom.scaladsl.api.ServiceLocator
import com.lightbend.lagom.scaladsl.api.ServiceLocator.NoServiceLocator
import com.lightbend.lagom.scaladsl.server._
import com.lightbend.lagom.scaladsl.devmode.LagomDevModeComponents
import play.api.libs.ws.ahc.AhcWSComponents
import com.softwaremill.macwire._
/*
* これはDIの仕組みを行うために必要?
* このfileを作らないと動かない
* とりあえず、いらないものを削ぎ落として、最低限動くようにしたもの
* akkaとかcassandraの読み込みもここで行うようなので、また別の機会でほそぼそ試す。
*/
class MyStudyLagomLoader extends LagomApplicationLoader {
// loadとloadDevModeで、おそらく、本番・開発環境で使う依存を管理する感じかな?
override def load(context: LagomApplicationContext): LagomApplication =
new MyStudyLagomApplication(context) {
override def serviceLocator: ServiceLocator = NoServiceLocator
}
// このメソッド、消しても動く?と思って消してみたらエラー出た。
override def loadDevMode(context: LagomApplicationContext): LagomApplication =
new MyStudyLagomApplication(context) with LagomDevModeComponents
}
abstract class MyStudyLagomApplication(context: LagomApplicationContext)
extends LagomApplication(context)
with AhcWSComponents {
// こんな感じでバインドするみたい
override lazy val lagomServer: LagomServer = serverFor[MyStudyLagomService](wire[MyStudyLagomServiceImpl])
}
그리고, 이 Loader를 conf로 지정해 준다.
application.conf# Loaderの読み込みでこの一行は必要
play.application.loader = com.example.mystudylagom.impl.MyStudyLagomLoader
시작
여기까지 할 수 있으면 기동해 본다. 에서 만든 API에 curl 던지면
gakumbp:study-lagom gaku$ curl http://localhost:9000/api/hello2/Alice
test
뭔가 돌아온다!
그리고 다른 서비스의 study-lagom API에 curl 던지면
gakumbp:study-lagom gaku$ curl http://localhost:9000/api/hello/Alice
Hello, Alice!
이쪽도 뭔가 돌아온다🥳
끝
무려 ~ 쿠. 알고는 오고 있지만, 여기에서 어떻게 서비스간에 제휴하는 것인가, 어떻게 영속화를 할 것인가.
CQRS는 어때? 집계 루트 어떻게 쓰나요?
같은 곳이 산적이므로, 여가 시간에 몰래 가고 싶다.
Reference
이 문제에 관하여(Lagom with Scala 해주세요! 【그 2:최소 서비스의 작성】), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/gaku3601/items/c7c2efa6b0a5fd4399b0
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
organization in ThisBuild := "com.example"
version in ThisBuild := "1.0-SNAPSHOT"
// the Scala version that will be used for cross-compiled libraries
scalaVersion in ThisBuild := "2.13.0"
val macwire = "com.softwaremill.macwire" %% "macros" % "2.3.3" % "provided"
val scalaTest = "org.scalatest" %% "scalatest" % "3.1.1" % Test
// 追記
lazy val `study-lagom` = (project in file("."))
.aggregate(`my-study-lagom-api`, `my-study-lagom-impl`, `study-lagom-api`, `study-lagom-impl`, `study-lagom-stream-api`, `study-lagom-stream-impl`)
// 追加
lazy val `my-study-lagom-api` = (project in file("my-study-lagom-api"))
.settings(
libraryDependencies ++= Seq(
lagomScaladslApi
)
)
// 追加
lazy val `my-study-lagom-impl` = (project in file("my-study-lagom-impl"))
.enablePlugins(LagomScala)
.settings(
libraryDependencies ++= Seq(
macwire,
)
)
.dependsOn(`my-study-lagom-api`)
lazy val `study-lagom-api` = (project in file("study-lagom-api"))
.settings(
libraryDependencies ++= Seq(
lagomScaladslApi
)
)
lazy val `study-lagom-impl` = (project in file("study-lagom-impl"))
.enablePlugins(LagomScala)
.settings(
libraryDependencies ++= Seq(
lagomScaladslPersistenceCassandra,
lagomScaladslKafkaBroker,
lagomScaladslTestKit,
macwire,
scalaTest
)
)
.settings(lagomForkedTestSettings)
.dependsOn(`study-lagom-api`)
lazy val `study-lagom-stream-api` = (project in file("study-lagom-stream-api"))
.settings(
libraryDependencies ++= Seq(
lagomScaladslApi
)
)
lazy val `study-lagom-stream-impl` = (project in file("study-lagom-stream-impl"))
.enablePlugins(LagomScala)
.settings(
libraryDependencies ++= Seq(
lagomScaladslTestKit,
macwire,
scalaTest
)
)
.dependsOn(`study-lagom-stream-api`, `study-lagom-api`)
우선, 이해하고 있는 부분에는 코멘트를 기재했습니다. 이해할 수 없는 곳은 푹신한 코멘트를 기재하고 있습니다만, 스루 주시면 다행입니다. (자신의 각서용으로. 이해할 수 있으면 갱신합니다.
api 구현
다음과 같이 계층 구조를 만들고 서비스 파일을 만듭니다.
그래서 이런 식으로 구현.
MyStudyLagomService.scala
package com.example.mystudylagom.api
import akka.NotUsed
import com.lightbend.lagom.scaladsl.api.{Descriptor, Service, ServiceCall}
trait MyStudyLagomService extends Service {
/**
* Example: curl http://localhost:9000/api/hello2/Alice
* id: stringには/api/hello2/:idのidが入ってくる
* ServiceCall[NotUsed, String]のNotUsed部分にはrequest bodyが、Stringはresponseの肩
* 今回、request bodyはNotUsedで使わないことを宣言している→つまり取得処理
* lagomはServiceCall[NotUsed, String]自動的にGetメソッドと判断する
*/
def hello(id: String): ServiceCall[NotUsed, String]
override final def descriptor: Descriptor = {
import Service._
named("my-study-lagom")
.withCalls(
pathCall("/api/hello2/:id", hello _), // APIルーティングを定義
)
.withAutoAcl(true) // これはつけとかないと動かない。
}
}
ServiceImpl 만들기
계층은 이런 느낌.
에서 MyStudyLagomServiceImpl.scala
MyStudyLagomServiceImpl.scala
package com.example.mystudylagom.impl
import akka.NotUsed
import com.example.mystudylagom.api.MyStudyLagomService
import com.lightbend.lagom.scaladsl.api.ServiceCall
import scala.concurrent.Future
class MyStudyLagomServiceImpl() extends MyStudyLagomService {
// apiの実装の中身。「_ =>」の_にはpostの場合、request bodyが入ってくるみたい。
override def hello(id: String): ServiceCall[NotUsed, String] = ServiceCall { _ =>
// なんでもかんでもFutureで返せばOKっぽい?
Future.successful("test")
}
}
이제 시작하면 움직이는 것 같지만 오류가 발생합니다. 살짝 조사한 느낌 DI를 하기 위한 Loader가 필요하다는 것.
이런 식으로 구현
MyStudyLagomLoader.scala
package com.example.mystudylagom.impl
import com.example.mystudylagom.api.MyStudyLagomService
import com.lightbend.lagom.scaladsl.api.ServiceLocator
import com.lightbend.lagom.scaladsl.api.ServiceLocator.NoServiceLocator
import com.lightbend.lagom.scaladsl.server._
import com.lightbend.lagom.scaladsl.devmode.LagomDevModeComponents
import play.api.libs.ws.ahc.AhcWSComponents
import com.softwaremill.macwire._
/*
* これはDIの仕組みを行うために必要?
* このfileを作らないと動かない
* とりあえず、いらないものを削ぎ落として、最低限動くようにしたもの
* akkaとかcassandraの読み込みもここで行うようなので、また別の機会でほそぼそ試す。
*/
class MyStudyLagomLoader extends LagomApplicationLoader {
// loadとloadDevModeで、おそらく、本番・開発環境で使う依存を管理する感じかな?
override def load(context: LagomApplicationContext): LagomApplication =
new MyStudyLagomApplication(context) {
override def serviceLocator: ServiceLocator = NoServiceLocator
}
// このメソッド、消しても動く?と思って消してみたらエラー出た。
override def loadDevMode(context: LagomApplicationContext): LagomApplication =
new MyStudyLagomApplication(context) with LagomDevModeComponents
}
abstract class MyStudyLagomApplication(context: LagomApplicationContext)
extends LagomApplication(context)
with AhcWSComponents {
// こんな感じでバインドするみたい
override lazy val lagomServer: LagomServer = serverFor[MyStudyLagomService](wire[MyStudyLagomServiceImpl])
}
그리고, 이 Loader를 conf로 지정해 준다.
application.conf
# Loaderの読み込みでこの一行は必要
play.application.loader = com.example.mystudylagom.impl.MyStudyLagomLoader
시작
여기까지 할 수 있으면 기동해 본다. 에서 만든 API에 curl 던지면
gakumbp:study-lagom gaku$ curl http://localhost:9000/api/hello2/Alice
test
뭔가 돌아온다!
그리고 다른 서비스의 study-lagom API에 curl 던지면
gakumbp:study-lagom gaku$ curl http://localhost:9000/api/hello/Alice
Hello, Alice!
이쪽도 뭔가 돌아온다🥳
끝
무려 ~ 쿠. 알고는 오고 있지만, 여기에서 어떻게 서비스간에 제휴하는 것인가, 어떻게 영속화를 할 것인가.
CQRS는 어때? 집계 루트 어떻게 쓰나요?
같은 곳이 산적이므로, 여가 시간에 몰래 가고 싶다.
Reference
이 문제에 관하여(Lagom with Scala 해주세요! 【그 2:최소 서비스의 작성】), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/gaku3601/items/c7c2efa6b0a5fd4399b0
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
gakumbp:study-lagom gaku$ curl http://localhost:9000/api/hello2/Alice
test
gakumbp:study-lagom gaku$ curl http://localhost:9000/api/hello/Alice
Hello, Alice!
무려 ~ 쿠. 알고는 오고 있지만, 여기에서 어떻게 서비스간에 제휴하는 것인가, 어떻게 영속화를 할 것인가.
CQRS는 어때? 집계 루트 어떻게 쓰나요?
같은 곳이 산적이므로, 여가 시간에 몰래 가고 싶다.
Reference
이 문제에 관하여(Lagom with Scala 해주세요! 【그 2:최소 서비스의 작성】), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/gaku3601/items/c7c2efa6b0a5fd4399b0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)