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.)
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (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.)
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (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.)