뽀송뽀송...
Spiffy는 Scala, Akka(Scala 액터 구현) 및 Java Servelet 3.0 API를 사용하는 웹 프레임워크입니다. 비동기 인터페이스를 활용하며 웹 애플리케이션을 위한 대규모 병렬 및 확장 가능 환경을 제공하는 것을 목표로 합니다. Spiffy의 다양한 구성 요소는 모두 소량의 작업을 매우 빠르게 수행하고 요청을 파이프라인의 다음 구성 요소에 전달하는 독립적이고 최소한의 모듈이어야 한다는 아이디어를 기반으로 합니다. 마지막 구성 요소가 요청 처리를 완료한 후 요청을 "완료"하고 클라이언트에 다시 보냄으로써 서블릿 컨테이너에 신호를 보냅니다.
일부 경로를 추가합니다.
// index page, no code, just text
"""^/$""".r -> "Welcome to Spiffy!",
// main news page
new Regex("""^/(news)/$""") -> NewsController(),
// view some news by id
new Regex("""^/(news)/(view)/(d+)/$""") -> NewsController()
컨트롤러를 작성합니다:
def receive = {
// handles "news/add/"
case ControllerMsg(List("news", "save"), req, res, ctx) => {
// run validation on the request using Spiffy's validation DSL
var errors:Map[String, Set[String]] = validate (req) (
"email" as email confirmedBy "email_confirm",
"email_confirm" as email,
"title" as (string, 32),
"body" as string,
"tag" as string optional
) match {
case Some(List(errs,warns)) => { // Problem validating
errs
}
case None => None.toMap // passed validation
}
}
// handles "/news/"
case ControllerMsg(List("news"), req, res, ctx) => {
// load up news and stuff in map then render
val params = loadNews
view() ! ViewMsg("news", params, req, res, ctx)
}
// handles "/news/view/$newsId/"
case ControllerMsg(List("news", "view", newsId), req, res, ctx) => {
// usually you want to load the item, in this example we dont
// load item and set the params that the view will render
val news = loadNewsItem(newsId)
val params:Map[Any,Any] = Map("news" -> news)
// ask the view to render
view() ! ViewMsg("newsView", params, req, res, ctx)
}
}
그런 다음 몇 가지 템플릿을 만듭니다. NewsController 및 SpiffyConfig를 보면 이 예제에 대한 자세한 내용을 찾을 수 있습니다.
현재 Spiffy를 사용하려면 jar(mvn jar:jar)를 빌드하고 애플리케이션 클래스 경로에 추가해야 합니다. 또한 다음 환경 변수를 정의해야 합니다(context.xml이 수행함).
<Environment name="SpiffyConfigObject" value="org.spiffy.config.SpiffyBuiltinConfig" type="java.lang.String"/>
org.spiffy.config.SpiffyBuiltinConfig
org.spiffy.config.SpiffyConfig
확장하고 필요한 모든 값을 제공하는 객체로 바꿔야 합니다. 예를 들어 SpiffyConfig를 살펴보세요.
Spiffy는 Akka 액터를 사용하여 다양한 구성 요소를 모두 분류하고 격리합니다. Spiffy 파이프라인의 모든 구성 요소(초기 필터 제외)는 Akka 액터 풀로 구성됩니다. Spiffy 액터는 다양한 유형의 디스패처로 구성된 로드 밸런싱 풀의 지원을 받습니다.
Spiffy는 필터로 구현됩니다. 필터가 요청을 받은 후 이를 비동기 모드로 설정하고 라우터로 보냅니다. 그런 다음 라우터는 요청 URL을 검사하고 이를 알려진 컨트롤러 매핑 목록과 비교하여 평가하여 요청으로 수행할 작업을 결정합니다. 매핑은 요청된 URL과 일치하고 이를 해당 컨트롤러에 할당하는 정규식입니다. 성공적으로 일치하는 항목이 발견되면 라우터는 요청(및 함께 보내야 하는 모든 필수 개체)과 함께 컨트롤러에 메시지를 보냅니다. 그 시점에서 라우터의 작업이 완료되고 새로 들어오는 요청을 자유롭게 처리할 수 있습니다. 컨트롤러는 요청을 받은 후 요청에 필요한 로직을 수행하고 요청을 종료할지 아니면 Spiffy의 다른 구성요소(보통 뷰 핸들러)에 전달할지 결정할 수 있습니다.
Spiffy는 후크 개념을 사용하여 프레임워크 파이프라인의 특정 구성 요소 전후에 캡슐화하고 실행할 수 있는 논리를 수행합니다. 후크는 컨트롤러와 뷰 전후에 실행될 수 있습니다. 컨트롤러가 컨트롤러를 완전히 우회하기로 결정하기 전에 실행되는 후크는 단순히 인증과 같은 일부 논리를 수행하거나 컨트롤러가 작업할 기회를 갖기 전에 요청 자체를 수정할 수도 있습니다. 컨트롤러 이후에 실행되는 후크는 요청을 다른 컨트롤러로 다시 라우팅하거나, 수정하거나, 거기서 종료한 다음 다시 클라이언트로 보낼 수 있습니다. 후크가 뷰의 렌더링을 완전히 중지하거나 렌더링된 출력에 대해 추가 작업을 수행할 수 있는 프레임워크의 다른 부분에 렌더링된 출력을 전달할 수 있는 전면 및 후면 뷰에도 동일한 논리가 사용됩니다.