Scala/Play framework

Play Framework 2.5. routes와 Controller 클래스

partner_jun 2017. 4. 12. 14:21

Spring Framework는 자바 리플렉션을 적극적으로 활용한다. 그래서인지 각 메소드별로 @RequestMapping 어노테이션을 이용해 Request의 진입 경로를 설정한다. 하지만 Play Framework는  conf/routes  파일에 Request Method와 Request를 처리할 함수를 설정해 둔다. 또, routes 파일은 template의 링크 주소나 Redirect 주소로도 사용된다. routes를 참조해 작성한다면 URL이 변경되었을 때 routes 수정만으로 사이트 전체에서 참조하고 있는 URL도 변경되는 장점이 있다.



1. 기본


GET        /                    controllers.SimpleController.index

# Map static resources from the /public folder to the /assets URL path
GET /assets/*file controllers.Assets.at(path="/public", file)

GET 형식으로 /에 요청된 Request를 controllers 패키지의 SimpleController 클래스가 가진 index 메소드가 처리하도록 작성



import javax.inject.{Inject, Singleton}
@Singleton
class SimpleController @Inject()() extends Controller{

def index = Action { implicit request =>
Ok("Hello World!")
}

}

controllers 패키지의 SimpleController 클래스


( Controller 클래스를 작성할 때 javax.inject의 Inject와 Singleton 어노테이션을 import하는 것을 잊으면 안 된다. 이유는 알 수 없지만 IntelliJ에서 import가 빠졌음에도 표시되지 않아 컴파일 에러가 발생한 경험이 있다. )




2. Request Parameter 처리

Spring에서는 RequestMapping 어노테이션이 붙은 메소드의 파라미터로 Request의 파라미터가 주입된다. Play Framework에서도 마찬가지지만 routes와 메소드 모두에 파라미터를 적어야 한다.


GET        /                    controllers.SimpleController.index(message: String)
def index(message: String) = Action { implicit request =>
Ok(message)
}

String타입 message라는 이름의 파라미터를 받아 출력하는 메소드.

/?message=hello 라는 URL로 접속하면 hello 메시지가 출력된다.




3. Path Parameter

URL의 일부를 변수로 받는 Spring에서의 PathVariable과 같은 기능도 존재한다. 

GET        /:message                    controllers.SimpleController.index(message: String)
def index(message: String) = Action { implicit request =>
Ok(message)
}

/A라는 URL로 접속하면 A가, /B라는 URL로 접속하면 B가 출력된다.


/A/B 같은 URL로 접속하면 에러가 발생한다. 두번째 슬래시 이후의 주소가 routes에 적히지 않았기 때문이다. 이렇게 받아야 하는 Path Parameter가 /를 포함했다면 : 대신 *을 적으면 된다.

GET        /*message                    controllers.SimpleController.index(message: String)

/A/B/C로 접속하면 A/B/C라는 문자열이 출력된다.





3. POST, PUT, DELETE

하지만 스프링과 다르게 routes에 적어둔 파라미터 값은 URL에 적힌 값만 가져온다. 

routes는 URL만을 명시하는데, POST나 PUT같은 Request Method의 값들은 Request body에 데이터를 담아 보내기 때문이다.

POST        /                    controllers.SimpleController.index
def index = Action { implicit request =>
val message: Option[String] = request.getQueryString("message")
Ok(message.getOrElse("No Message"))
}

request 객체에서 직접 message를 얻어왔다.  getQueryString 메소드의 리턴타입은 Option[String]이다.


값을 하나씩 가져오는 getQueryString 메소드 외에도 Spring의 @ModelAttritube처럼 Request body의 값들을 폼 데이터 객체로 매핑하는 bindFromRequest 메소드, Json 객체나 Map을 폼 데이터 객체로 매핑하는 bind 와 같은 메소드가 존재한다.




4. Assets

Play Framework는 Image나 CSS, Javascript같은 static한 파일도 routes에 적힌 방법대로 가져온다. 프로젝트 생성 시 기본적으로 적혀있는 방법 외에도 필요한 용도에 따라 routes에 작성할 수 있다.

GET        /assets/*file        controllers.Assets.at(path="/public", file)

프로젝트 생성 시 기본적으로 적힌 /assets/*file URL.



공식 문서에 따르면 Play Framework 2.5.x 버전에서는 GET, PATCH, POST, PUT, DELETE, HEAD의 6가지 Request Method를 지원하고 있다.