play2 페이징 샘플을 찾던 와중에 발견.

https://index.scala-lang.org/gakuzzzz/play2-pager/play2-pager/0.1.0

불러오는 중입니다...

프로젝트 clone하고, 바로 해당 경로 가서 

$> sbt run 실행

 

무언가 오랫동안 다운받고 실행되나 싶더니 에러 발생

 

[info] Loading project definition from D:\works_scala\play2-pager\project
[info] Set current project to root (in build file:/D:/works_scala/play2-pager/)
java.lang.RuntimeException: No main class detected.
        at scala.sys.package$.error(package.scala:27)
[trace] Stack trace suppressed: run last root/compile:run for the full output.
[error] (root/compile:run) No main class detected.
[error] Total time: 0 s, completed 2020. 1. 6. 오후 3:30:10

 

메인 클래스를 찾는듯. java의 일반 application을 실행 시켰을때 main메소드를 찾는 것 처럼.

 

build.sbt 에서 PlayScala 플러그인 설정을 추가해 준다. 

https://stackoverflow.com/questions/24684799/play-framework-java-lang-runtimeexception-no-main-class-detected

 .enablePlugins(PlayScala) 이게 없었음.

내가 사용하고 있는 play버전이 달라서 그런지는 모르겠지만,,

lazy val sample = (project in file("sample")).
  dependsOn(core, scalikejdbc).
  enablePlugins(PlayScala).
  settings(

$> sbt "project sample" run 실행

localhost:9000 으로 들어가보면 DB에 테스트데이터를 넣는데, 스크립트 실행 버튼을 클릭해줘야 한다.

오우 잘 된다...

 

요 프로젝트의 스칼라 버전은 2.12.x 였기 때문에 jdk11로는 오류발생. jdk8로 환경변수를 잡아주었다.

'Play2' 카테고리의 다른 글

[play2] play와 implicit 그리고 message  (0) 2019.12.27
[play2] Intellij 인코딩 세팅  (0) 2019.12.26

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사용에 대한 차이가 있을 수 있음.

'Play2' 카테고리의 다른 글

play2-pager 샘플 소스 구동기  (0) 2020.01.06
[play2] Intellij 인코딩 세팅  (0) 2019.12.26

conf/messages 에 한글 메시지를 정의하면 깨지는 경우 발생.

 

product.food = 과자

 

���� 요렇게...

 

다음과 같이 인텔리j의 인코딩 설정을 바꿔주고 리빌드 해본다.

 

 

한글이 잘 표시되는 것을 볼 수 있다.

'Play2' 카테고리의 다른 글

play2-pager 샘플 소스 구동기  (0) 2020.01.06
[play2] play와 implicit 그리고 message  (0) 2019.12.27

+ Recent posts