14. Play framework
Simple
Great Testing Support
URL Routing
JPA/Ebean Support (Java only)
Class Reloading
NIO Server(Netty)
Share-Nothing
Asset Compiler
Java & Scala Support
i18n
Compile time checking
Instant deply on Heroku, Cloud bees
20. Simple > Http Result
Result.scala
def SeeOther(url: String): SimpleResult = Redirect(url, 303)
val BadRequest = new Status(400)
val NotFound = new Status(404)
val InternalServerError = new Status(500)
val NoContent = SimpleResult(
header = ResponseHeader(204),
body = Enumerator.empty,
connection = HttpConnection.KeepAlive)
}
응답코드에 따른
행동은 플레이가 알아서 ~
21. Simple > Test
Integration
Test
browser.goTo("http://localhost:" + port)
browser.pageSource must contain("Hello")
Unit
Test
val home = route(FakeRequest(GET, "/")).get
status(home) must equalTo(OK)
contentType(home) must beSome.which("text/html")
contentAsString(home) must contain ("Hello")
31. Routes
Http method
Uri
Body (scala code)
GET
/
controllers.App.index
GET
/add
controllers.App.blank
POST
/article
controllers.App.insert
GET
/article/$num<d{9}>
controllers.App.details(num: Long)
POST
/article/:id
controllers.App.update(id: Long)
POST
/article/:id/delete
controllers.App.delete(id: Long)
GET
/assets/*file
controllers.Assets.at(path="/public", file)
32. Routes
Http method
Uri
Body (scala code)
GET
/
controllers.App.index
GET
/add
controllers.App.blank
POST
/article
controllers.App.insert
GET
/article/$num<d{9}>
controllers.App.details(num: Long)
POST
/article/:id
controllers.App.update(id: Long)
POST
/article/:id/delete
controllers.App.delete(id: Long)
GET
/assets/*file
controllers.Assets.at(path="/public", file)
48. Implicit
val db: DB = application.getDatabase()
def query(str: String)(db: DB): List[User]
val users = query("""SELECT * FROM USER""")(db)
val posts = query("""SELECT * FROM POST WHERE ...""")(db)
val pets = getPost("""SELECT * FROM PET""")(db)
49. Implicit
val db: DB = application.getDatabase()
def query(str: String)(db: DB): List[User]
val users = query("""SELECT * FROM USER""")(db)
val posts = query("""SELECT * FROM POST WHERE ...""")(db)
val pets = getPost("""SELECT * FROM PET""")(db)
50. Implicit
implicit val db: DB = application.getDatabase()
def query(str: String)(implicit db: DB): List[User]
val users = query("""SELECT * FROM USER""")(db)
val posts = query("""SELECT * FROM POST WHERE ...""")(db)
val pets = getPost("""SELECT * FROM PET""")(db)
51. Implicit
implicit val db: DB = application.getDatabase()
def query(str: String)(implicit db: DB): List[User]
val users = query("""SELECT * FROM USER""")
val posts = query("""SELECT * FROM POST WHERE ...""")
val pets = getPost("""SELECT * FROM PET""")
54. Option Type
List 와 함께 가장 중요한 타입입니다 . 처음부터 잘 살펴 보세요 >_<
스칼라 코드에서 여러분이 null 을 보실 일은 거의 없습니다 .
가능한 null 체크를 사용하지 않도록 노력 해보세요 ~ (null object pattern)
Scala.Option.scala
def apply[A](x: A): Option[A] = if (x == null) None else Some(x)
// mothods
flatMap, Flatten, map, foreach, idDefined, isEmpty...
55. Form (hide nothing)
1 Client
GET /signup
2 Signup.html
3 Validate
Fail
su
/index
5 Redirect
cc
es
s
4 Create
65. 언젠가는 ...
발표에 사용된 예제 코드 : https://github.com/organizations/ScalaPlayers
66. 감사합니다 !
라 스칼라 코딩단
GoogleGroups/ScalaKorea
https://groups.google.com/forum/#!forum/scala-korea
발표에 사용된 샘플 코드 (2013-11-01 이후 업로드 )
github.com/ScalaPlayers/SpringCampWithScala2013
최정열
SNS: facebook.com/choijeongyeol
Email: myeesan@gmail.com