74
Grails 1.4.0 2.0 の話 -更新メモ- 2011-07-29@jggug @tyama 途中経過観察 1

Grails 2.0.0.M1の話

Embed Size (px)

Citation preview

Page 1: Grails 2.0.0.M1の話

Grails 1.4.0 2.0 の話

-更新メモ-

2011-07-29@jggug

@tyama

途中経過観察

1

Page 2: Grails 2.0.0.M1の話

Who?山本です。

@tyama

はてな id:mottsnite ←ブログここ。

2

Page 3: Grails 2.0.0.M1の話

経歴・仕事• 仕事

• newcast inc. ってデザイン会社で、印刷系パッケージソフト開発。あと経営。

• 主に、Grails,Groovy,Java,Obj-C,人材等を扱います。

• Grailsの経歴

• 2006/7 旧Grailsドキュメント翻訳。

• 2006/12 Acegiプラグインを公開。

• 2007/10 ”Grails eXchange 2007”に、スピーカーとして参加。

• 2008/8 Grails徹底入門 共著。

• 2006 - 201X Grails日本語リリースノートを即配信を趣味としてる。

3

Page 4: Grails 2.0.0.M1の話

もう7月も終わりますが、前半

はイベントがいっぱいでした。

4

Page 5: Grails 2.0.0.M1の話

7月前半のイベント• 7/1 富士山 山開き

• 7/2 キャラ・スーンの誕生日(ZZ)  

ミーア・キャンベルの誕生日(SEED DESTINY)

• 7/3  2005年にGrails最初のコミットされた日!

• 7/4  アメリカ独立記念日!

• 7/5  @tyama 誕生日!

• 7/6「プログラミングGroovy」発売!

• 7/7 七夕!

• 7/8 質屋の日!5

Page 6: Grails 2.0.0.M1の話

プログラミングGroovy!発売!•プログラミングGROOVY [単

行本(ソフトカバー)]

•価格: ¥3,360

6

Page 7: Grails 2.0.0.M1の話

BTW,

Do you know Grails?

7

Page 8: Grails 2.0.0.M1の話

8

Grails聖書DGGより、

Grailsは、

プラットフォームです

Page 9: Grails 2.0.0.M1の話

Grailsを追え。

9

Page 10: Grails 2.0.0.M1の話

Grails萌え。

10

Page 11: Grails 2.0.0.M1の話

Grails萌えを追え。• ある程度の。

• 最新のWeb開発アーキテクチャを知る事ができる。

• 最先端・流行のJava開発を知る事ができる。

• Grailsでの開発

• 開発効率の追求。(究極なDRY) 

• シンプルかつ柔軟。(DSL) 

• DDD。

• ただし!

• 柔軟過ぎて質の悪いアプリケーションも構築できる。

• 意外と作り手によっては、おかしな物になる。11

Page 12: Grails 2.0.0.M1の話

Grails 1.4.0.M1

12

Page 13: Grails 2.0.0.M1の話

1.4.0 !? to 2.0 !!!1.4にしておくには、もったいないぐらい内容が良いから2.0になった!

13

Page 14: Grails 2.0.0.M1の話

Grails 2.0.M1

14

Page 15: Grails 2.0.0.M1の話

まだM1です!

変わる可能性もあるので、わかる範囲でお伝えします。

動く動かないの前に、自分の環境も確かめましょう。

15

Page 16: Grails 2.0.0.M1の話

Grails 2.0での更新(予定)内容•コア+その他。

Groovy 1.8, Spring 3.1 M1, Hibernate 3.6,Servlet 3.0, Tomcat 7への更新。Javaエージェントで開発時リロード改善パフォーマンス強化・速度向上!新しいコンソールUIとインタラクティブ(interactive)モードスカッフォルドUIがHTML5に!エラーレポートとスタックトレース表示

•リソース静的リソースハンドリング機能PrototypeからjQueryへ

•GORMGORM API大幅改良、機能強化AST変換を使用したGORM API抽象クラス継承のサポート

•DB基本データベースをH2への変更DBコンソール複数データソースサポートマイグレーションとリバースエンジニアリング

•テストMixinベースUnitテストSpockもサポートした新しいテストAPIUnitテストスカッフォールディング強化されたユニットテストのコンソールへの書き出し

•プラグインバイナリープラグインプラグイン使用統計トラッキングプラグイン開発用のAST変換API

16

Page 17: Grails 2.0.0.M1の話

Upgradeで更新!

はじめに!いつも気になる事。。。

17

Page 18: Grails 2.0.0.M1の話

grails upgrade•注意!

BuildConfgで「grails.project.work.dir="target/work"」を定義してると起動しないよ!

成功例

18

Page 19: Grails 2.0.0.M1の話

1.3.7 to 2.0.M1 (diff)

19

Page 20: Grails 2.0.0.M1の話

単純な物は

無問題。

20

Page 21: Grails 2.0.0.M1の話

コア+その他。

21

Page 22: Grails 2.0.0.M1の話

コア+その他。• Groovy 1.8, Spring 3.1, Hibernate 3.6,

Servlet 3.0, Tomcat 7への更新。

• Javaエージェントで開発時リロード改善

•パフォーマンス強化・速度向上!

•スカッフォルドUIがHTML5に!

•新しいコンソールUIとインタラクティブ(interactive)モード

•エラーレポートとスタックトレース表示

22

Page 23: Grails 2.0.0.M1の話

コア• Groovy 1.8

•超強化されたGroovyをバンドル

• Spring 3.1

• SpringプロファイルとGrails環境のブリッジ。

• Servlet 3.0

• Asyncとか個人的には注目してる。

• Tomcat 7

• Hibernate 3.623

Page 24: Grails 2.0.0.M1の話

開発時リロード改善• Javaエージェントの実装により、未サポート

だった静的型のサービス、ドメインクラス等のリロードが可能に。

• -javaagentオプションにSpring-Loaded指定して実装されている。

•起動時の指定でON/OFF可能。

% grails -noreloading

24

Page 25: Grails 2.0.0.M1の話

パフォーマンス強化・速度向上!

http://www.jtict.com/blog/rails-wicket-grails-play-lift-jsp/

GSPが再度最適化がされた!25

Page 26: Grails 2.0.0.M1の話

賛否両論あります

が・・。

26

Page 27: Grails 2.0.0.M1の話

スカッフォルドUI(HTML5)

<input type="number" name="price" required="" value="" id="price" />

Firefox5だと

27

Page 28: Grails 2.0.0.M1の話

コンソールUI•コンソール表示が1行で表示されるように!

• grails (Ent) で、インタラクティブモードに突入。タブ補完、コマンド履歴有り。(jline使用)

28

Page 29: Grails 2.0.0.M1の話

コンソール• grails (Ent) で、インタラクティブモードに突入

するので。

29

% grails --help% grails -version

Page 30: Grails 2.0.0.M1の話

コンソールUI• Entでの前コマンド再実行が無くなった。

•でも、クラス名は補完。

30

Page 31: Grails 2.0.0.M1の話

エラーレポートとスタックトレース表示

31

Page 32: Grails 2.0.0.M1の話

Grailsソースの構成改良•ソースツリーのお掃除!

• Gradle使ってる人参考になると思う。

32

Page 33: Grails 2.0.0.M1の話

リソース

33

Page 34: Grails 2.0.0.M1の話

リソース•静的リソースハンドリング機能

• resourcesプラグインがコアへ(プラグイン提供)

• http://grails.org/plugin/resources

• PrototypeからjQueryへ

•リソースの改善と平行して、jQueryへの移行も行われた。

34

Page 35: Grails 2.0.0.M1の話

リソースプラグイン• js,cssをモジュール管理

•リソースをDSLで定義modules = {    core {        dependsOn 'jquery, utils'        resource url: '/js/core.js', disposition: 'head'        resource url: '/js/ui.js'        resource url: '/css/main.css',        resource url: '/css/branding.css'        resource url: '/css/print.css', attrs: [media: 'print']    }    utils {        dependsOn 'jquery'        resource url: '/js/utils.js'    }    forms {        dependsOn 'core,utils'        resource url: '/css/forms.css'        resource url: '/js/forms.js'    }}

<html> <head> <r:require module="jquery"/> <r:layoutResources/> </head> <body> … <r:layoutResources/> </body></html>

35

Page 36: Grails 2.0.0.M1の話

リソースプラグイン•連動するプラグイン

•キャッシュ

• http://grails.org/plugin/cached-resources

• gzip

• http://grails.org/plugin/zipped-resources

36

Page 37: Grails 2.0.0.M1の話

ドキュメント追記されてると思

うが、使い方がわかりにくかっ

たので。。。

37

Page 38: Grails 2.0.0.M1の話

簡易resourcesプラグイン講座•まだM1だから、いきなり説明不足。

•公式Doc 6.7 AJAXを試しても。

• <g:javascript library="jquery"/>

•動きません

• Grails初心者キラー。

38

Page 39: Grails 2.0.0.M1の話

簡易resourcesプラグイン講座• How?

AJAXする対象ページに、 スクリプトタグ追加。以下のどれでも良い        <g:javascript library="jquery" plugin="jquery"/>        <g:javascript library="jquery"/>        <r:require modules="jquery"/>2.0からは、<r:require modules="jquery"/> が、望ましいね。

main.gspの<g:layoutHead/>の下辺りに、<r:layoutResources/>これが無いとJSが出ない。

さらに、これが無いと動かない。Config.groovyにgrails.views.javascript.library="jquery"

39

Page 40: Grails 2.0.0.M1の話

DB & GORM

40

Page 41: Grails 2.0.0.M1の話

DB,GORM•基本データベースをH2へ変更

• DBコンソール

•複数データソースサポート

•マイグレーションとリバースエンジニアリング

• GORM API大幅改良、機能強化

• AST変換を使用したGORM API

•抽象クラス継承のサポート41

Page 42: Grails 2.0.0.M1の話

DB変わったよ!

• HSQDB → H2

• BuildConfigに、runtime 'hsqldb:hsqldb:1.8.0.10'

•何ならこれを期に、H2にしてしまおう!

• jdbcの設定も変えないとね!42

Page 43: Grails 2.0.0.M1の話

DBコンソール• URLに、 /dbconsoleを指定

43

Page 44: Grails 2.0.0.M1の話

DBコンソール•基本は開発モードのみで使用可能。

指定する事で productionモードでも可能。(セキュリティ必要)

environments {    production {        grails.serverURL = "http://www.changeme.com"        grails.dbconsole.enabled = true        grails.dbconsole.urlRoot = '/admin/dbconsole'    }    development {        grails.serverURL = "http://localhost:8080/${appName}"    }    test {        grails.serverURL = "http://localhost:8080/${appName}"    }}

44

Page 45: Grails 2.0.0.M1の話

複数データソースサポートdataSource {    pooled = true    driverClassName = 'org.h2.Driver'    url = 'jdbc:h2:mem:testDb'    username = 'sa'    password = ''    dbCreate = 'update'}

dataSource_ds2 {    pooled = true    driverClassName = 'org.h2.Driver'    url = 'jdbc:h2:mem:testDb2'    username = 'sa'    password = ''    dialect = org.hibernate.dialect.H2Dialect    dbCreate = 'update'}

DataSource.groovy

def book = Book.ds2.get(100)

class Book {    String title    static mapping = {        datasource 'ALL'    }}

class Comment {    String message    static mapping = {        datasource 'ds2'    }}

ドメインに定義

45

Page 46: Grails 2.0.0.M1の話

マイグレーションリバースエンジニアリング

•プラグインで提供。詳しくはドキュメントを読みましょう!

• http://grails.org/plugin/database-migration

• http://grails.org/plugin/db-reverse-engineer

46

Page 47: Grails 2.0.0.M1の話

GORM API大幅改良・機能強化• GORM APIがJavaから使用可能に。

• GORMでの抽象クラス継承のサポート。

• OrCreateとOrSaveクエリーの実装追加。

•名前付きクエリから関係先の名前付きクエリを参照。

•共有制約とコマンドオブジェクト。

47

Page 48: Grails 2.0.0.M1の話

GORM APIがJavaから使用可能に

• GORM APIは、Groovy ASTによって、GORMエンティティのバイトコードとして注入されます。これによりGORMのメソッドは、Javaコードから、呼び出したり見たりできます。

Book book = new Book();book.setTitle("The Stand")book.save();System.out.println(Book.count());System.out.println(Book.list());

48

Page 49: Grails 2.0.0.M1の話

GORMでの抽象クラス継承のサポート

• GORMが抽象クラス継承をサポートしました。関連リンクやクエリ等を抽象クラスに定義することができます。

abstract Media { String title …}class Book extends Media {}class Album extends Media {

}class Account { static hasMany = [purchasedMedia:Media]}

..

def allMedia = Media.list()

49

Page 50: Grails 2.0.0.M1の話

OrCreateとOrSaveクエリーの実装追加

• ドメインクラスに、findWhereやfindByメソッドに似た、nullを返さない、findOrCreateWhere, findOrSaveWhere, findOrCreateBy, findOrSaveByのクエリーをサポート。

• 実行結果にインスタンスが見つからない場合は、指定された値で、新規にインスタンスを作成して返します。findOrSaveWhereとfindOrSaveByの場合はインスタンスを保存してからインスタンスを返します。

def book = Book.findOrCreateWhere(author: 'Douglas Adams', title: "The Hitchiker's Guide To The Galaxy")

def book = Book.findOrSaveWhere(author: 'Daniel Suarez', title: 'Daemon')

def book = Book.findOrCreateByAuthorAndTitle('Daniel Suarez', 'Daemon')

def book = Book.findOrSaveByAuthorAndTitle('Daniel Suarez', 'Daemon')

50

Page 51: Grails 2.0.0.M1の話

名前付きクエリ•名前付きクエリがドメインクラスのリレーショ

ンを含んでいる場合、そのリレーション先の名前付きクエリを使用することが可能に。

class Author { static hasMany = [publications:Publication]

static namedQueries = { authorsWithRecentPublications { publications { //ここ。 recentPublications() } } }}class Publication { Author author static namedQueries = { recentPublications {//これ def now = new Date() gt 'datePublished', now - 10 } }}

51

Page 52: Grails 2.0.0.M1の話

共有制約とコマンドオブジェクト

•コマンドオブジェクトが共有制約をサポートしました。実装方法は以前に追加されたドメインクラスと同じです。

grails.gorm.default.constraints = { '*'(nullable: true, size: 1..20)}grails.gorm.default.constraints = { myShared(nullable: true, size: 1..20)}class User { ... static constraints = { login(shared: "myShared") }}

52

Page 53: Grails 2.0.0.M1の話

テスト

53

Page 54: Grails 2.0.0.M1の話

Unitテスト• Unitテスト大幅改良!

•フィルター・URLマッピング・ファイルアップロード・コンテントネゴシエーション・テンプレートビューレンダリング・ドメインクラスクライテリアクエリ

• http://grails.org/doc/1.4.x/guide/9.%20Testing.html#9.1%20Unit%20Testing

54

Page 55: Grails 2.0.0.M1の話

Unitテスト• MixinベースUnitテスト

• (未確認)Spockもサポートした新しいテストAPI

• Unitテストスカッフォールディング

• generate-allでスカッフォールドの内容用のUnitテストが自動生成される。(コード参照)

•強化されたユニットテストのコンソール表示

55

Page 56: Grails 2.0.0.M1の話

@TestMixin

@Mock

@TestFor56

Page 57: Grails 2.0.0.M1の話

Unitテスト•コントローラテストの方法が、

公式ドキュメントの "9.1" に詳しく掲載!

•リロード良くなったので、新コンソール(インタラクティブ)でテストしよう!

•ドメインテスト注意点。

• Car.findAllByMaker(.....)とかの、フィールド(この場合maker)にはインデックス定義必要。mappings に maker index:true 。

57

Page 58: Grails 2.0.0.M1の話

コンソール表示と結果レポート

58

Page 59: Grails 2.0.0.M1の話

プラグイン

59

Page 60: Grails 2.0.0.M1の話

プラグイン•プラグイン使用統計トラッキング

•プラグイン使用レポートを収集する機能が実装されました。近いうちにプラグイン使用統計がGrailsのサイトで公開されます。

•プラグイン開発用のAST変換API

• @Artefact ??

•バイナリープラグイン

60

Page 61: Grails 2.0.0.M1の話

バイナリープラグイン•プラグインを通常のJARファイルとしてプリコ

ンパイルパッケージ可能になります。• Mavenリポジトリで通常のJARファイルで配布可能。

• バイナリプラグインは他のJARと同じように依存管理が行える。

• ソースコードを公開しない商用プラグインが可能。

• 通常のJARになることによって、IDE等の環境で扱いやすくなる。

%grails package-plugin --binary

61

Page 62: Grails 2.0.0.M1の話

まだあった!

62

Page 63: Grails 2.0.0.M1の話

アクションがメソッドに•今まではアクションがクロージャで実装されて

ました。今後はメソッドで実装を推奨します!(もちろんクロージャもサポートしてます)

•メソッドにすることによっての利点• メモリ効率

• ステートレスコントローラの使用 (シングルトンスコープ指定)

• サブクラスでのアクションのオーバーライドが可能。スーパークラスのアクションメソッド呼び出しが可能。super.actionName()

• クロージャはフィールドのため複雑だったスタンダードなプロキシを使用したメソッドのインターセプトが可能。

63

Page 64: Grails 2.0.0.M1の話

アクションがメソッドに

64

grails.compile.artefacts.closures.convert = true

クロージャを使用したい場合、旧版対応:AST変換を使用してクロージャをメソッドに変換したバイトコードを生成

def index() {    redirect(action: "list", params: params)}

def list() {    params.max = Math.min(params.max ? params.int('max') : 10, 100)    [bookList: Book.list(params), bookTotal: Book.count()]}

Page 65: Grails 2.0.0.M1の話

アクションのメソッドに引数を指定

<g:form name="myForm" action="save">! <input name="name" />! <input name="age" />!</g:form>

def save(String name, int age) {! // remaining}

アクションメソッドに引数を指定してバインド。

指定した型に変換されます。

65

Page 66: Grails 2.0.0.M1の話

Servlet 3.0 Async•非同期処理。AsyncContext

grails.servlet.version = "3.0"

BuildConfigにサーブレットバージョン指定

def index() { def ctx = startAsync() ctx.start { new Book(title:"The Stand").save() render template:"books", model:[books:Book.list()] ctx.complete() }}

使用方法: def ctx = startAsync()

66

Page 67: Grails 2.0.0.M1の話

便利API

LinkGenerator grailsLinkGeneratordef generateLink() {! grailsLinkGenerator.link(controller:"book", action:"list")}

Link Generation API

PageRenderer groovyPageRenderervoid welcomeUser(User user) {! def contents = groovyPageRenderer.render(

view:"/emails/welcomeLetter", model:[user: user])! sendEmail {! ! to user.email! ! body contents! }}

Page Rendering API

Grailsのルールでリンクを生成するAPI

Webリクエスト以外の場所でGSPをレンダリングするAPI

67

Page 68: Grails 2.0.0.M1の話

フィルターの除外定義•フィルターでのコントローラ・アクション・URI

の除外指定が実装されました。filter1(actionExclude: 'log*') { before = { // 共通の前処理 }}filter2(controllerExclude: 'auth') { before = { // 処理 }}

filter3(uriExclude: '/secure*') { before = { // … }}

68

Page 69: Grails 2.0.0.M1の話

data-mappingの名前が変更され!?• spring-data-mappingが

grails-data-mappimgに変更!?org.grailsのリネームされた。

今後どうなるのかな?

リンク切れ!?

http://www.springsource.org/spring-data

69

Page 70: Grails 2.0.0.M1の話

さらにその他。•依存ライブラリ・プラグインにSNAPSHOTが有

る場合の自動更新

•パーマネントリダイレクト(301)のサポート• redirect() メソッドにtrueを指定すると、リダイレクトは、301の

HTTPステータスで送信され、その逆であれば、302で送信されます。

• JsonBuilderは非推奨となりました。

•全てのスタティックホルダーは非推奨。

• GORMエンティティを拡張した抽象クラスは必ずsrc/groovyに入れましょう。

70

Page 71: Grails 2.0.0.M1の話

そして、さらに多くの

細かなFixが多数!!

71

Page 72: Grails 2.0.0.M1の話

でも、

まだM1です!

72

お気を付けて使用しましょう!

Page 73: Grails 2.0.0.M1の話

Q&A

73

Page 74: Grails 2.0.0.M1の話

Thank you.

日本Grails/Groovyユーザーグループhttp://www.jggug.org/

74