본문 바로가기

Development/Web & Server

[Play Framework2] Action composition

PlayFramework에서는 Action이 뭔가 Restful 통신을 할때 반응하는 객체로 쓰여진다... 이번에는 이 Action을 활용하는 방법을 알아보자


자세한 사항은 : https://www.playframework.com/documentation/2.3.x/ScalaActionsComposition


object LoggingAction extends ActionBuilder[Request] {
  def invokeBlock[A](request: Request[A], block: (Request[A]) => Future[Result]) = {
    Logger.info("Calling action")
    block(request)
  }
}

위와 같이LoggingAction을 만들고

def index = LoggingAction {
  Ok("Hello World")
}

Action 대신에 LogginAction을 하면 콘솔창에서 Calling Action 로그를 확인 할 수 있다.



이번에는 Actino을 조금더 조합해서 활용해 보자


case class Logging[A](action: Action[A]) extends Action[A] {

  def apply(request: Request[A]): Future[Result] = {
    Logger.info("Calling action")
    action(request)
  }

  lazy val parser = action.parser
}

 Logging 이라는 Action을 정의하고


object LoggingAction extends ActionBuilder[Request] {

  

  def invokeBlock[A](request: Request[A], block:(Request[A]) => Future[Result]) = {

    Logger.info("***** LoggingAction *****")

    block(request)

    

  }

  

  override def composeAction[A](action: Action[A]) = new Logging(action)

  

}

위에서 정의한 LoggingAction에 composeAction 을 override 한다. 쉽게 구별이 되도록 Log를 틀리게 작성하였다.


def index = LoggingAction {
  Ok("Hello World")
}

의 실행 결과

[info] application - Calling action


def index = Logging {
  Action {
    Ok("Hello World")
  }
}

의 실행결과

[info] application - Calling action

[info] application - ***** LoggingAction *****