관리 메뉴

HAMA 블로그

[Play2] Actions, Controllers and Results 이란 [번역] 본문

PlayFramework2

[Play2] Actions, Controllers and Results 이란 [번역]

[하마] 이승현 (wowlsh93@gmail.com) 2016.09.28 15:24

Actions, Controllers and Results

Action 이란 무엇인가?


스프링에서 컨트롤러 함수의 예가  다음과 같은 모습을 취하는 반면 

@RequestMapping(method = RequestMethod.GET)
public String printHello(ModelMap model) {
model.addAttribute("message", "Hello Spring MVC Framework!");
return "hello";
}

스칼라언어 기반 Play 프레임워크 웹개발에서는 (위의 자바 예와 동일한 내용의 예가 아닙니다) 

def doSomething = Action{
Ok.apply(views.html.index("Hi there"))
}

이런 모양새로 이루어지는데 여기서 Action 이 무엇일까요? 


위의 예는 다음과 같이 풀어지게 되는데요

def doSomething: Action[AnyContent] = Action.apply({
    Ok.apply(views.html.index("Hi there"))
})

위의 apply 메소드의 정의는  apply(block: => Result) 이라는 인자없고 리턴이 Result 인 익명의 함수가 들어가게 됩니다. 다시 말해서 Action.apply 함수의 apply() 는 생략가능이고 apply 함수내에는 인자가 없고 Result 를 리턴하는 익명함수가 들어가네요. 

이 함수 말이죠. 

{
Ok.apply(views.html.index("Hi there"))
}

그리고 doSomething 메소드는  Action[AnyContent]  클래스의 인스턴스를 리턴합니다.

아래는 공식 문서 내용입니다.

액션은 무엇인가?

Play2 애플리케이션이 수신한 대부분의 요청은 액션에 의해 처리됩니다.
play.api.mvc.Action은 기본적으로 요청을 처리하고 클라이언트에 보낼 결과를
생성하는 (play.api.mvc.Request => play.api.mvc.Result) 함수입니다.

val echo = Action { request =>

  Ok("Got request [" + request + "]")

}

액션은 웹 클라이언트에 보낼 HTTP 응답을 나타내는 play.api.mvc.Result 값을 반환합니다.
이 예에서 Ok는 text / plain 응답을 포함하는 200 OK 응답을 생성합니다.


액션 만들기 

play.api.mvc.Action 동반자 객체는 Action 값을 생성하는 여러 가지 도우미 메서드를 제공합니다.
첫 번째 간단한 방법은 결과를 반환하는 표현식 블록(익명함수)을 인수로 취하는 것입니다.

Action {

  Ok("Hello world")

}

이것은 액션을 만드는 가장 간단한 방법이지만 들어오는 Request 에 대한 자세한 참조를 얻지는 못합니다.
따라서 Request => Result 함수를 인수로 취하는 또 다른 Action 빌더가 있습니다.

Action { request =>

  Ok("Got request [" + request + "]")

}

요청 매개 변수를 암시적으로 표시하면 필요로 하는 다른 API에서 암시적으로 사용할 수 있습니다.

Action { implicit request =>

  Ok("Got request [" + request + "]")

}

Action 값을 만드는 마지막 방법은 추가 BodyParserargument를 지정하는 것입니다.

Action(parse.json) { implicit request =>

  Ok("Got request [" + request + "]")

}

Body 파서는 이 설명서 뒷부분에서 다룰 것입니다. =>  body parser 이해하기 
지금은
기본 Any Content body 파서를 사용한다는 것을 알면 됩니다.


컨트롤러는 액션 생성기이다.

컨트롤러는 Action 값을 생성하는 싱글톤 객체일 뿐 입니다. 액션 생성기를 정의하는 가장 간단한
사용 사례는 액션 값을 반환하는 매개 변수가 없는 메소드입니다.

package controllers

import play.api.mvc._

class Application extends Controller {

  def index = Action {

    Ok("It works!")

  }

}

물론 액션 생성기 메소드는 매개 변수를 가질 수 있으며 이러한 매개 변수는 액션 클로저에 의해 캡처 될 수 있습니다.

def hello(name: String) = Action {

  Ok("Hello " + name)

}


단순 results

지금은 단순한 결과에만 관심이 있습니다. 상태 코드, HTTP 헤더 세트 및 웹 클라이언트로 보낼 본문이 있는 HTTP 결과. 이 결과는 play.api.mvc.Result에 의해 정의됩니다

def index = Action { 

 Result(

    header = ResponseHeader(200, Map(CONTENT_TYPE -> "text/plain")),

    body = Enumerator("Hello world!".getBytes())

  )

}

물론 위의 예제에서 Ok result와 같은 일반적인 결과를 만들 수 있는 여러 도우미가 있습니다.

def index = Action {

  Ok("Hello world!")

}


val ok = Ok("Hello world!")

val notFound = NotFound

val pageNotFound = NotFound(<h1>Page not found</h1>)

val badRequest = BadRequest(views.html.form(formWithErrors))

val oops = InternalServerError("Oops")

val anyStatus = Status(488)("Strange response type")

이러한 헬퍼는 모두 play.api.mvc.Results 특성 및 동반자 개체에서 찾을 수 있습니다.


Redirects 또한 simple results 이다.

브라우저를 새로운 URL로 리디렉션하는 것은 다른 종류의 간단한 Result 타입일 뿐 입니다. 그러나
이 결과 타입은 응답 바디를 사용하지는 않습니다.

리다이렉션 결과를 만들 수있는 여러 도우미가 있습니다.

def index = Action {

  Redirect("/user/home")

}

기본값은 303 SEE_OTHER 응답 유형을 사용하는 것이지만 필요한 경우보다 구체적인 상태 

코드를 설정할 수도 있습니다.

def index = Action {

  Redirect("/user/home", MOVED_PERMANENTLY)

}



0 Comments
댓글쓰기 폼