for
myeesan@gmail.com
라 스칼라 코딩단
최정열
Play 는 모르셔도 되지만 ,
스칼라는 조금 아셔야 합니다 .
Scala for Play
프레임워크를 찾아서 ...

●

모바일 테스트 서버가 필요해 ...

●

웹 프론트 개발을 위한 베이스 ...

●

무엇보다 만들고 싶은게 많았음 ...
프레임워크 선택 기준 ...
●
●

Quick and Dirty
확장 가능성

●

Testablity & TDD able

●

뚜렷한 지향점

●

JAVA

●
●

JVM
투명성
웹 프레임워크 ...
History - Play 1.x
History - Play 1.x
History - Play 1.x
SBT

Akka

Template
History - Play 2
고민

스칼라를 배워야 하나 ?
결정 !

목숨걸고 한 3 개월 하면 되겠지 ?
잃어버린 2013
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
Simple
Servlet

Play
Simple > All in One
Simple > Code
Restful Routes
GET

/index

controllers.App.index

Straitforward Controllers
Action { Request → Response }
Easy Template
<h1> @name </h1>
Simple > Web Spec
HTTP/1.1(rfc2616)

HTML5 / CSS
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)

}

응답코드에 따른
행동은 플레이가 알아서 ~
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")
Simple > Deploy on Heroku
Procfile
개발 / 배포 설정도 플레이가 알아서 !

web: target/start
-Dhttp.port=${PORT}
-DapplyEvolutions.default=true
-Ddb.default.url=${DATABASE_URL}
-Ddb.default.driver=org.postgresql.Driver

Deploy!
$ git push heroku master
Simple > Deploy on CloudBees
Simple > I18n
conf/messages
error.notfound = Post not found
error.required = Mandatory field is empty
user.confirmPassword = Confirm Password
validation.duplicated = Already exists!
validation.required = Required!

conf/messages.ko
error.notfound = 페이지를 찾을 수 없습니다 .
error.required = 필수로 입력 되어야 합니다 .
user.confirmPassword = 패스워드를 확인해주세요 .
validation.duplicated = 이미 존재합니다 !
validation.required = 필수입니다 .
Simple > Too Simple
하위 호환성은 기대하지 않는게 좋습니다 .
Case Study
Play inside
Project
1

프로젝트 생성

$ play new myApp
2

콘솔 진입

$ play
3

실행

> run

IDE 프로젝트 생성시 소스를 포함하여 빌드
> Idea with-source = true
> eclipse with-source=true
Structure
app
└ assets
└ controllers
└ models
└ views
conf
└ application.conf
└ routes
public
project
test

LESS CSS, CoffeeScript
Application controllers
Application business layer
Templates
Configurations files
Main configuration file
Routes definition
Image, CSS, JavaScript
Build, Plugins Setting
Unit and Integration Test
Play framework
Routes
Routes
...
...
...
...

request
request

Client

dispatch

Controller 1 2
Controller
Controller 1 2
Controller

response
response

View
View

Model
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)
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)
Controller
POST

/article/:id

controllers.App.detail(id: Long)

object App extends Controller {
def detail(num: Long) = Action{ OK(Item.find(num)...) }
def join = WebSocket{ ... }
}
Actions
def r: Result = Action { Ok("Hello World!") }

Action { Ok("Hello World!").withHeaders(
CACHE_CONTROL -> "max-age=3600", ETAG -> "xx" )}
Action.Async {
future.map(i => Ok("Hello World!" + i))}
Action (parse.json) { implicit request: =>
Ok("Request: " + request)
}
WebSocket.using[String] { request: =>
val in = Iteratee.foreach[String]
val out = Enumerator("Hello!")
(in, out)
}
Request

def i = Action { implicit req =>
Ok("Request: [" + req + "]")
}
Request

def i = Action { implicit req: [
Ok("Request: [" + req + "]")
}

] =>
Request

def i = Action { implicit req: AnyContent =>
Ok("Request: [" + req + "]")
}
Request

def j = Action(parse.json) { implicit req =>
Ok("Request: [" + req + "]")
}
Request

def j = Action(parse.json) { implicit req: [
Ok("Request: [" + req + "]")
}

] =>
Request

def j = Action(parse.json) { implicit req: JsValue =>
Ok("Request: [" + req + "]")
}
Scala for Play
플레이를 공부하면서 가장 많이 나온 주제를 정
리했습니다 .
Template
implicit keyword
Form
Option[T] type
Scala for Play
Tem
plate
Template
어느날 제자가 스승에게 물었다 .
스승님 바람에 나뭇가지가 흔들리는 것은 나뭇가지가
흔들리는 것입니까 바람이 흔들리는 것 입니까 ?
그러자 스승이 답했다 .
흔들리는 것은 나뭇가지도 아니고 바람도 아니다 .
바로 너의 마음이다 .
Template
Header.scala.html
@(title: String)
<h1>@title</h1>
convert
Header.template.scala

def apply(title: String) = { format.raw(
"<h1>" + title + "</h1>" )
}
Template

@(title: String, articles: List[article])
@import helper._
<table>
@main(title){
@articles.map{ article =>
<li> @article.title </li>}}
</table>
Template composition

Header

main (header) (side)(content)

side

Content
Implicit Parameter
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)
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)
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)
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""")
Implicit
import play.api.Play.current
def getAll: List[Product] = DB.withConnection {
implicit connection =>
sql().map ( row =>
Product(row[Long]("id"), row[String]("name")
).toList}
Implicit
import play.api.Play.current
def getAll: List[Product] = DB.withConnection {
implicit connection =>
sql().map ( row =>
Product(row[Long]("id"), row[String]("name")
).toList}

Play.api.Play.scala

implicit def current: Application = maybeApplication...
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...
Form (hide nothing)
1 Client
GET /signup

2 Signup.html

3 Validate
Fail
su

/index

5 Redirect

cc

es

s

4 Create
마무리

Pros & Cons ( 순전히 개인적인 )
Pros
단점 빼고 다 좋습니다 !
Pros
단점 빼고 다 좋습니다 ! 라고 하면 ...
Pros

●

Simple

●

Type Safe everywhere

●

Java ↔ Scala
Cons

●

SBT

●

Type Safe

●

불완전한 IDE

●

적은 유저
2.3 Roadmap
●
●
●
●
●

브라우저 내에서의 개발환경 구성
WebJar - Jquery, require.js, ecc
JSUnit test
Bootstrap 탬플릿 향상
JSON API → Form 매핑

Java
● JDK8 Compat Library
● Java 8 – template
질문

여러분은 무엇을 만들고 싶으세요 ?
이렇게 시작해서 ...
이렇게 시작해서 ...
언젠가는 ...

발표에 사용된 예제 코드 : https://github.com/organizations/ScalaPlayers
감사합니다 !

라 스칼라 코딩단
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
Scala

"Scala is deep where other languages are broad."

More Related Content

PDF
Ksug2015 jpa5 스프링과jpa
PPTX
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
PDF
자바모델 클래스에 날개를달자_롬복(Lombok)
PPTX
Java Virtual Machine, Call stack, Java Byte Code
PDF
Spring Boot 2
PPT
자바야 놀자 PPT
PPTX
HTTP web server 구현
PDF
[162] jpa와 모던 자바 데이터 저장 기술
Ksug2015 jpa5 스프링과jpa
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
자바모델 클래스에 날개를달자_롬복(Lombok)
Java Virtual Machine, Call stack, Java Byte Code
Spring Boot 2
자바야 놀자 PPT
HTTP web server 구현
[162] jpa와 모던 자바 데이터 저장 기술

What's hot (20)

PDF
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
PDF
[1B4]안드로이드 동시성_프로그래밍
PPTX
4-3. jquery
PPTX
[115] clean fe development_윤지수
PDF
스프링캠프 2016 발표 - Deep dive into spring boot autoconfiguration
PDF
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
PDF
(IT실무교육/국비지원교육/자바/스프링교육추천)#15.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
PDF
Spring Boot 1
PDF
spring.io를 통해 배우는 spring 개발사례
PDF
Secrets of the JavaScript Ninja - Chapter 12. DOM modification
PPTX
Jdk 7 3-nio2
PPTX
5-4. html5 offline and storage
PPTX
Web Components 101 polymer & brick
PPTX
Jdk(java) 7 - 5. invoke-dynamic
PDF
Scala
PDF
#32.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
PPTX
Hacosa jquery 1th
PDF
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
PDF
[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...
PDF
#20.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
[1B4]안드로이드 동시성_프로그래밍
4-3. jquery
[115] clean fe development_윤지수
스프링캠프 2016 발표 - Deep dive into spring boot autoconfiguration
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
(IT실무교육/국비지원교육/자바/스프링교육추천)#15.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
Spring Boot 1
spring.io를 통해 배우는 spring 개발사례
Secrets of the JavaScript Ninja - Chapter 12. DOM modification
Jdk 7 3-nio2
5-4. html5 offline and storage
Web Components 101 polymer & brick
Jdk(java) 7 - 5. invoke-dynamic
Scala
#32.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
Hacosa jquery 1th
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...
#20.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
Ad

Viewers also liked (12)

PDF
Akka & Actor model
PDF
Spring Scala : 스프링이 스칼라를 만났을 때
PPTX
Akka라이브러리를 이용해 구현하는 결함 내성 (발렌타인 발표자료)
PDF
맛만 보자 액터 모델이란
PDF
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
PPTX
빠르게훓어보는 Node.js와 Vert.x
PDF
Cascadia.js: Don't Cross the Streams
PDF
Functional Reactive Programming With RxSwift
PPTX
Functional Reactive Programming with RxJS
PDF
서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015
PPTX
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
PPTX
RxJS and Reactive Programming - Modern Web UI - May 2015
Akka & Actor model
Spring Scala : 스프링이 스칼라를 만났을 때
Akka라이브러리를 이용해 구현하는 결함 내성 (발렌타인 발표자료)
맛만 보자 액터 모델이란
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
빠르게훓어보는 Node.js와 Vert.x
Cascadia.js: Don't Cross the Streams
Functional Reactive Programming With RxSwift
Functional Reactive Programming with RxJS
서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
RxJS and Reactive Programming - Modern Web UI - May 2015
Ad

Similar to Scala for play (12)

PDF
GraphQL in Action - REST와 이별할 때 생각해야 하는 것들
PDF
GraphQL 적용기
KEY
[H3 2012] 꽃보다 Scala
PPTX
Open source engineering - 0.1
PPTX
Kotlin with fp
PDF
[D2 campus seminar]스칼라를 통한 다양한 언어의 패러다임 맛보기
PPTX
반복적인 코드 작업 자동화, Codebone으로 손쉽게
PPTX
GraphQL overview
PDF
Hello, GraphQL!
PDF
Portfolio
PPTX
Big Data platform을 위한 Sencha Ext JS 사례.
PDF
테스터도 알아야 할 웹 개발(테스트 교육 3장 1절 부분발췌)
GraphQL in Action - REST와 이별할 때 생각해야 하는 것들
GraphQL 적용기
[H3 2012] 꽃보다 Scala
Open source engineering - 0.1
Kotlin with fp
[D2 campus seminar]스칼라를 통한 다양한 언어의 패러다임 맛보기
반복적인 코드 작업 자동화, Codebone으로 손쉽게
GraphQL overview
Hello, GraphQL!
Portfolio
Big Data platform을 위한 Sencha Ext JS 사례.
테스터도 알아야 할 웹 개발(테스트 교육 3장 1절 부분발췌)

Scala for play