SlideShare a Scribd company logo
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
Younghan Kim
 
PPTX
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Javajigi Jaesung
 
PDF
자바모델 클래스에 날개를달자_롬복(Lombok)
탑크리에듀(구로디지털단지역3번출구 2분거리)
 
PPTX
Java Virtual Machine, Call stack, Java Byte Code
Javajigi Jaesung
 
PDF
Spring Boot 2
경륜 이
 
PPT
자바야 놀자 PPT
JinKyoungHeo
 
PPTX
HTTP web server 구현
Javajigi Jaesung
 
PDF
[162] jpa와 모던 자바 데이터 저장 기술
NAVER D2
 
Ksug2015 jpa5 스프링과jpa
Younghan Kim
 
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Javajigi Jaesung
 
자바모델 클래스에 날개를달자_롬복(Lombok)
탑크리에듀(구로디지털단지역3번출구 2분거리)
 
Java Virtual Machine, Call stack, Java Byte Code
Javajigi Jaesung
 
Spring Boot 2
경륜 이
 
자바야 놀자 PPT
JinKyoungHeo
 
HTTP web server 구현
Javajigi Jaesung
 
[162] jpa와 모던 자바 데이터 저장 기술
NAVER D2
 

What's hot (20)

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

Viewers also liked (12)

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

Similar to Scala for play (20)

PDF
Front-end Development Process - 어디까지 개선할 수 있나
JeongHun Byeon
 
PPTX
Nodejs, PhantomJS, casperJs, YSlow, expressjs
기동 이
 
PPTX
스프링군살없이세팅하기(The way to setting the Spring framework for web.)
EunChul Shin
 
PDF
[오픈소스컨설팅] 스카우터 사용자 가이드 2020
Ji-Woong Choi
 
PDF
제 5회 Lisp 세미나 - 클로저 개발팀을 위한 지속적인 통합
NAVER D2
 
PDF
Ji 개발 리뷰 (신림프로그래머)
beom kyun choi
 
PDF
Jstl_GETCHA_HANJUNG
Jung Han
 
PDF
From MSSQL to MySQL
I Goo Lee
 
ODP
Django와 flask
Jiho Lee
 
PDF
도커(Docker) 메트릭스 & 로그 수집
Daegwon Kim
 
PDF
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
현철 조
 
PPTX
Bigquery와 airflow를 이용한 데이터 분석 시스템 구축 v1 나무기술(주) 최유석 20170912
Yooseok Choi
 
PPTX
[114]angularvs react 김훈민손찬욱
NAVER D2
 
PPTX
Python on Android
용 최
 
PDF
자바스크립트 프레임워크 살펴보기
Jeado Ko
 
PPTX
Java mentoring of samsung scsc 2
도현 김
 
PDF
Partner Story(Megazone): 금융사 실전 프로젝트 DeepDive
Elasticsearch
 
KEY
Html5 performance
yongwoo Jeon
 
PPTX
2.apache spark 실습
동현 강
 
PDF
SpringCamp 2013 : About Jdk8
Sangmin Lee
 
Front-end Development Process - 어디까지 개선할 수 있나
JeongHun Byeon
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
기동 이
 
스프링군살없이세팅하기(The way to setting the Spring framework for web.)
EunChul Shin
 
[오픈소스컨설팅] 스카우터 사용자 가이드 2020
Ji-Woong Choi
 
제 5회 Lisp 세미나 - 클로저 개발팀을 위한 지속적인 통합
NAVER D2
 
Ji 개발 리뷰 (신림프로그래머)
beom kyun choi
 
Jstl_GETCHA_HANJUNG
Jung Han
 
From MSSQL to MySQL
I Goo Lee
 
Django와 flask
Jiho Lee
 
도커(Docker) 메트릭스 & 로그 수집
Daegwon Kim
 
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
현철 조
 
Bigquery와 airflow를 이용한 데이터 분석 시스템 구축 v1 나무기술(주) 최유석 20170912
Yooseok Choi
 
[114]angularvs react 김훈민손찬욱
NAVER D2
 
Python on Android
용 최
 
자바스크립트 프레임워크 살펴보기
Jeado Ko
 
Java mentoring of samsung scsc 2
도현 김
 
Partner Story(Megazone): 금융사 실전 프로젝트 DeepDive
Elasticsearch
 
Html5 performance
yongwoo Jeon
 
2.apache spark 실습
동현 강
 
SpringCamp 2013 : About Jdk8
Sangmin Lee
 

Scala for play