Play2

[play2] play와 implicit 그리고 message

Rust Choi 2019. 12. 27. 14:23

implicit라는 것은 "암시적"이라고 하는 것인데, 선뜻 그 쓰임새가 쉽게 이해되지 않는다.

 

파라미터 측면으로 보자면, 파라미터를 넣지 않아도 자동으로 세팅되어 들어간다는 뜻인데,

암시적으로 들어갈 파라미터를 어딘가에 미리 만들어 놓고 컴파일러가 이를 찾아 적용한다.

 

class MyTest1(val  tell : String)

class MyTest2(val tell : String)



object Greeter {

def greet (name : String) ( implicit  test  : MyTest1 ,  test2 : MyTest2 ) {

		println(name)

		println(test.tell)

		println(test2.tell)  

    }

}

object HamaPrefs {

	implicit val test = new MyTest1 ("삐약")

	implicit val test2 = new MyTest2 ("개굴")

}



출처: https://hamait.tistory.com/605?category=79134 [HAMA 블로그]

Greeter.greet("Tiger") 단일 파라미터를 던져도 나머지 암시적 파라미터를 찾아 작동한다.

 

Play2에서 다국어 메시지를 이용한다고 가정해보자.

 

내가 여기저기 검색하며 써 본 방식은 아래 코드였다.

class Products @Inject() (val controllerComponents: ControllerComponents)(langs: Langs, messagesApi: MessagesApi) extends BaseController{

 def show(ean: Long) = Action { implicit request =>

    val availableLangs: Seq[Lang] = langs.availables.filter(_ == Lang("en"))
    println("availableLangs :" + availableLangs)

    val messages = messagesApi.preferred(availableLangs)

    Product.findByEan(ean).map { product =>
      Ok(views.html.products.details(product)(messages))
    }.getOrElse(NotFound)

  }	
}

detail.scala.html 의 내용

@(product: Product)(messages: Messages)

  <h2>
    제품상세 - @messages.messages("product.details")
  </h2>
  
 =============================================== 

(참고) messagesApi.preferred(request) 로 세팅해서 넘기면 locale에 따라 자동으로 해당 언어의 메시지로 출력 될 것이다.

 

이렇게 메소드별로 번번이 파라미터로 전달해야 할까~~~

그래서 implicit가 필요하다.

class Products @Inject() (val controllerComponents: ControllerComponents)
  (langs: Langs, messagesApi: MessagesApi) 
  extends BaseController 
  with I18nSupport{

  def show(ean: Long) = Action { implicit request =>

    Product.findByEan(ean).map { product =>
      Ok(views.html.products.details(product))
    }.getOrElse(NotFound)

  } 
}


detail.scala.html

@(product: Product)(implicit messages: Messages)

with I18nSupport 를 선언하여 Products Action이 수행되는 뷰에서 messages를 implicit로 호출하면 된다.

I18nSupport은 trait (자바의 인터페이스 + 추상클래스) 인데, MessagesApi를 멤버 메소드로 가지고 있다.

 

play2의 2.8.x 로 개발하고 있기에 다른 버전에서 api사용에 대한 차이가 있을 수 있음.