Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

uroboroSQLの紹介 (OSC2017 Nagoya) #oscnagoya

336 views

Published on

カバレッジが取れてREPLでサクサクのSQL開発?

オープンソースカンファレンス2017 Nagoya
2017/05/27 (土) 15:15からのフューチャーアーキテクトのセッションにおける資料です。

https://www.ospn.jp/osc2017-nagoya/modules/eguide/event.php?eid=35

Published in: Software
  • Be the first to comment

  • Be the first to like this

uroboroSQLの紹介 (OSC2017 Nagoya) #oscnagoya

  1. 1. uroboroSQL 〜カバレッジが取れてREPLでサクサクのSQL開発?〜 Future Architect Technology Innovation Group 星 賢一 2017/5/27
  2. 2. Who am I ? 星 賢一(Kenichi Hoshi) フューチャーアーキテクト株式会社  Technology Innovation Group所属  技術統括、シニアアーキテクト Activity  uroboroSQL プロダクトオーナー&テスター&ディベロッ パー  社内OSS活動推進、Tech系広報  技術ブログ責任者&レビューア Like  Golang、ES6  猫
  3. 3. そもそもSQLとは 歴史  1976年、IBM社によるSEQUEL2がルーツ  ANSI/ISOによって規格化、バージョンアップを重ねた 近年  ベンダー拡張により標準SQLとは名ばかりの状況は変わらず  Cassandora、HadoopといったNoSQLでも SQLライクなクエリ言語の需要は高い SQL87 SQL89 SQL99 SQL:2003 SQL:2008 SQL92
  4. 4. JavaとRDBの微妙な関係 インピーダンスミスマッチ  RDBの特性に合わせたデータモデルと、オブジェクト志向における 現実世界のモデルとのギャップ(マッピング作業) O/Rマッパー  インピーダンスミスマッチ問題の解決策として、オブジェクトとRDBのモデ ルの自動マッピングをするフレームワーク(ライブラリ)  Javaでは歴史あるフレームワークとしてはHibernateといったOSSや、 Java標準のJPA(EclipseLink、OpenJPA)など、数多のライブラリが存在
  5. 5. O/Rマッパーの種類(1) QueryBuilder  FluentAPIによりSQLを自動生成する方式  タイプセーフなAPIでJavaの世界でデータアクセスが可能なものもある  動的に条件を変えたりすることが可能でカバレッジもJavaの世界で可能 List<Customer> customers = db.from(c). innerJoin(o).on(c.customerId).is(o.customerId). where(o.total).greaterThan(new BigDecimal("500.00")). groupBy(c.customerId).select(); List<Customer> employees = jdbcManager.from(Employee.class) .innerJoin("department") .where(new SimpleWhere() .eq("name", name) .eq("department.name", deptName) .getResultList(); S2JDBC
  6. 6. O/Rマッパーの種類(2) DAO  DBのテーブル単位でエンティティクラスとDAOクラスを用意(通常は自動生成)  DAOはGenericDAOとして1クラスのパターンもある  DAOがCRUDのSQLを自動生成する EmployeeDao employeeDao = new EmployeeDaoImpl(); Employee employee1 = new Employee() employee1.name = "HOGE"; employee1.age = 20; employeeDao.insert(employee1); Employee employee2 = employeeDao.selectById(1); employee1.age = 30; employeeDao.update(employee2); employeeDao.delete(employee2);
  7. 7. O/Rマッパーの種類(3) SQL Template  SQLのテンプレートファイルを別ファイル管理して、パラメータを動的にバインド  2Way-SQLと呼ばれる通常のSQLとしても実行が可能で、 コメントでIF/ELSE分岐が可能なものもあり EmployeeDao employeeDao = new EmployeeDaoImpl(); List<Employee> employees = employeeDao.selectByAge(35); SELECT /*%expand*/* FROM EMPLOYEE WHERE AGE < /* age */0 selectByAge.sql @Select List<Employee> selectByAge(Integer age); EmployeeDao.java
  8. 8. 2Way-SQL S2Dao発のSQL実行手法  元々はSQLプログラマとJavaプログラマの分業が目的(そもそも分業してる?)  SQLのツールでSQLを実行して思い通りの結果を出力するようになったら、 それに対して、コメントを埋め込んでいくことで生産性が上がるメリットがある SELECT * FROM EMPLOYEE WHERE /*IF salaryMin != null*/ SALARY >= /*salaryMin*/1000 /*END*/ /*IF salaryMax != null*/ AND SALARY <= /*salaryMax*/2000 /*END*/ SELECT * FROM EMPLOYEE WHERE SALARY >= ?/*salaryMin*/ salaryMinをパラメータとして渡された SQLクライアントで、そのままSQLとして 実行される Javaから呼び出されると、 実行時にIF分岐を評価されて実行される
  9. 9. 2Way-SQLの歴史 SeasarプロジェクトのS2Daoが発祥となり、 2Way-SQLを実装する複数のプロダクトが誕生 S2Dao Mirage-SQL 2006年2003年 2007年 2014年 2017年S2JDBC 2012年
  10. 10. uroboroSQLのはじまり 2006-2007年頃にS2Daoを参考に社内で開発  もはや当時のことはわからないが、おそらくバグ踏んだときに 迅速に対応したかった・・・?  その後、社内で似たようなライブラリが開発され、 覇権を争ったが、最終的に生き残り、改善が続けられてきた  現在、社内では、Webアプリケーションフレームワークや 各種設計開発支援ツールと連携・統合され利用中 社内Webアプリケーションフレームワーク 設計開発支援ツール
  11. 11. なぜOSS化しようと思ったのか?
  12. 12. とある新人や開発パートナーさん が口を揃えて、こう言います
  13. 13. ググれないから 生産性上がりません
  14. 14. いやいや、開発者向けに ドキュメント作ってますよ!?
  15. 15. どこに書いてあるか わかりませんよ
  16. 16. ・・・
  17. 17. こうなったら してやる!! もうググれないとか言わせないんだからね!!
  18. 18. 2016年5月 OSS化始動 業務の合間をぬって、週1,2時間くらい
  19. 19. OSS化にあたって プロダクト名を決める テストコードの充実 よくよく見るとイケてない実装のリファクタリング Java8対応(LocalDate、Optional、Stream) 公開準備  ロゴ作り  Githubリポジトリ作成  GithubPagesでDocument作成  Maven Centralへのデプロイ 目玉機能もほしい
  20. 20. エンタープライズという荒野を 歩んできた我々にしか出せない 価値があるはず
  21. 21. プロダクトデザイン コンセプト SQLの能力を最大限活かしつつ 生産性と品質を高めたい  Javaを中心に考えてSQLを組み立てるという思想ではなく、 SQLに足りないところをJavaで補うという思想 名は体を表す  2Way-SQLのメタファとしてuroborosを採用  PostgreSQLっぽく「uroboroSQL(うろぼろすきゅーえる)」に 誰にとってうれしい?どんなシステムに合ってる?  SQL中心の設計思想が複雑なSQLが必要になるエンタープライズでの 利用に最適なものにしたい  多人数同時開発を想定し、なるべく共通ライブラリでよろしくやりたい  事前にコンパイルのできないSQLを高い生産性と品質で作りたい
  22. 22. そして三つのアイディア が
  23. 23. Idea No.1 - REPL 実装したら即試したい!!いちいちビルドだるい! SELECT /* _SQL_ID_ */ DEPT.DEPT_NO AS DEPT_NO , DEPT.DEPT_NAME AS DEPT_NAME FROM DEPARTMENT DEPT WHERE 1 = 1 /*IF SF.isNotEmpty(dept_no)*/ AND DEPT.DEPT_NO = /*dept_no*/1 /*END*/ /*IF SF.isNotEmpty(dept_name)*/ AND DEPT.DEPT_NAME = /*dept_name*/'sample' /*END*/ department/select_department.sql
  24. 24. REPLの特徴 Java9のJShellでも利用されているJLineを採用 タブキー補完  コマンド  SQLファイル名  バインドパラメータ名 実行履歴の表示・検索が可能
  25. 25. REPL Commands query : execute query from loaded sql file. ex1) query [sql file name]<Enter> ex2) query [sql file name] param1=val1 param2=val2 ...<Enter> update : execute update from loaded sql file. ex1) update [sql file name]<Enter> ex2) update [sql file name] param1=val1 param2=val2 ...<Enter> view : view sql file. ex) view [sql file name]<Enter> : Show sql file contents. list : list loaded sql files. ex1) list<Enter> : Show all loaded sql file(s). ex2) list keyword<Enter> : Show loaded sql file(s) filter by keyword. history: list command history. ex1) history<Enter> : Show all command history. ex2) history keyword<Enter> : Show command history filter by keyword. driver : list loaded drivers. reload : reload sql files. cls : clear screen. help : show this message. exit : exit SQL REPL. `CTRL+C` is an alias.
  26. 26. DEMO
  27. 27. Idea No.2 - カバレッジ 安心してください。 uroboroSQLなら出せます。 カバレッジレポート出せない?品質保証できるの? v0.1.0でJenkins Cobertura Pluginに対応
  28. 28. HTMLレポート(1) v0.2.0新機能
  29. 29. HTMLレポート(2) v0.2.0新機能 パラメータやコメント内IF構文も シンタックスハイライト
  30. 30. カバレッジの利用方法 -Duroborosql.sql.coverage=true -Duroborosql.sql.coverage.dir=<出力先のパス> システムプロパティで 指定するだけ!
  31. 31. そして、3つ目のアイディアは Doma、DBFluteを使ってる方も うれしい機能
  32. 32. SQLは開発者によってインデント、 改行がブレやすいため、汚くなりやすい SQL レビューしろとか 辛いんだけど
  33. 33. エンタープライズでは、 1つのSQLで数千行って場合も
  34. 34. だが あきらめる必要はない
  35. 35. SQL
  36. 36. SQL Beautiful
  37. 37. 各種プラグイン
  38. 38. uroboroSQL Formatter for Sublime Text 3 S2Dao系記法、 DOMA記法もOK
  39. 39. Installation https://github.com/future-architect/Sublime-uroboroSQL-formatter
  40. 40. https://github.com/future-architect/idea-uroborosql-formatter IntelliJ uroboroSQL Formatter
  41. 41. Eclipse uroboroSQL Formatter Github https://github.com/future-architect/eclipse-uroborosql-formatter Update Site https://future-architect.github.io/eclipse-uroborosql-formatter/
  42. 42. SQLコーディング規約 Future Enterprise Coding Standards for SQL(Oracle)  uroboroSQL Formatterに完全準拠のコーディング規約 https://future-architect.github.io/coding-standards/
  43. 43. Features
  44. 44. 区分値サポート あらかじめ定義された定数クラス、列挙体が利用可能 SELECT /* _SQL_ID_ */ EMP.EMP_NO AS EMP_NO , EMP.FIRST_NAME AS FIRST_NAME , EMP.LAST_NAME AS LAST_NAME , EMP.BIRTH_DATE AS BIRTH_DATE , EMP.GENDER AS GENDER FROM EMPLOYEE EMP WHERE /*IF SF.isNotEmpty(emp_no)*/ AND EMP.EMP_NO = /*emp_no*/1 /*END*/ /*IF female != null and female*/ AND EMP.GENDER = /*#CLS_GENDER_FEMALE*/'M' /*END*/
  45. 45. シンプル&モダンなAPI SqlConfig config = DefaultSqlConfig.getConfig("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1", "sa", ""); try (SqlAgent agent = config.createAgent()) { // SELECT List<Map<String, Object>> depts = agent.query("dept/select_dept").param("dept_no", 1001).collect(); agent.requiresNew(() -> { // INSERT int count = agent.update("dept/insert_dept") .param("dept_no", 1001) .param("dept_name", "sales") .count(); }); } Java8対応、トランザクションサポートもあり
  46. 46. DAOインタフェース // select Department dept = agent.find(Department.class, 1001).orElse(null); // insert Department hrDept = new Department(); hrDept.setDeptNo(1002); hrDept.setDeptName("HR"); agent.insert(hrDept); // update hrDept.setDeptName("Human Resources"); agent.update(hrDept); // delete agent.delete(hrDept); v0.2.0で追加
  47. 47. その他の特徴 エラーハンドリング  特定のエラーコードでリトライ SQL実行時のフィルタ  カラム暗号化  デバッグログ バッチ実行 ストアド・プロシージャ実行 クエリキャッシュ Spring Integration
  48. 48. Releases v0.1.0 at 2017/3/9  First Release v0.2.0 at 2017/5/21  REPLがJLine搭載により大幅に使いやすくなる  独自のHTMLカバレッジレポート出力が可能になる  JPAライクなDAOインタフェースを追加
  49. 49. Install <dependency> <groupId>jp.co.future</groupId> <artifactId>uroborosql</artifactId> <version>0.2.0</version> </dependency> Maven Gradle compile group: jp.co.future, name: uroborosql, version: 0.2.0
  50. 50. Documentation uroboroSQL  https://github.com/future-architect/uroborosql uroboroSQL Document  https://future-architect.github.io/uroborosql-doc/ uroboroSQL sample application  https://github.com/future-architect/uroborosql-sample
  51. 51. まとめ SQLの能力を最大限活かしつつ 生産性と品質の高い開発を!! 開発

×