JDBI - Evolving An Open Source Project νλ μ ν μ΄μ μ μΌλΆ μλ£μ μ¬μ©ν μ μμ
μκ·λͺ¨ νλ‘μ νΈ μ΄μ μ μ°Έκ³ μ¬ν:
μ΄λ¦μ΄ λ³κ²½λ ν΄λμ€(κ°μ Έμ€κΈ°λ₯Ό μμ νκ³ IDEμμ μμ νλλ‘ νλ κ²λ§νΌ κ°λ¨νμ§ μμ):
DBI
-> Jdbi
IDBI
-> Jdbi
DBIException
-> JdbiException
Jdbi
μ μμ±μλ create()
ν©ν 리 λ©μλλ‘ λ체λμμ΅λλ€.
ResultSetMapper
λ RowMapper
map
λ©μλμλ λ μ΄μ ν μΈλ±μ€κ° μμ΅λλ€. ResultSetMapper
λΌλ ν΄λμ€κ° Jdbi 3μ μ‘΄μ¬νμ§λ§ λ€λ₯Έ μ©λλ‘ μ¬μ©λ©λλ€. @Mapper
λ @UseRowMapper
λ‘ λ°λλλ€. $#$ Jdbi
μ registerMapper()
λ registerRowMapper()
λ‘ λ°λλλ€.
@BindIn
λ @BindList
λ‘ λ체λμμΌλ©° λ μ΄μ StringTemplateμ΄ νμνμ§ μμ΅λλ€.
κΈ°λ³Έ Jdbi ν νλ¦Ώμ μ¬μ©νλ©΄ κΊΎμ κ΄νΈκ° μΈμ©λμ§ μμ΅λλ€. μ¦, λꡬ -> λ°μ΄ν°λ² μ΄μ€ -> μ¬μ©μ ν¨ν΄ μλμμ 맀κ°λ³μ ν¨ν΄μ ꡬμ±ν ν IntelliJκ° κ΅¬λ¬Έμ μ΄ν΄ν©λλ€.
Query
μλ λ μ΄μ Map
μ κΈ°λ³Έ μ νμ΄ μμΌλ―λ‘ list()
λ₯Ό μ§μ νΈμΆν μ μμ΅λλ€. $ list()
$ μ νΈμΆνκΈ° μ μ mapToMap()
μ μ ννμμμ€.
TransactionStatus
λ λ μ΄μ μ‘΄μ¬νμ§ μμ΅λλ€.
TransactionConsumer.useTransaction()
λ μ΄μ Handle
μ¬μ©νλ―λ‘ Jdbi
λλ Jdbiμμ useTransaction()
λ©μλλ₯Ό μ¬μ©ν λ TransactionStatus
μΈμλ₯Ό μ κ±°ν΄μΌ ν©λλ€ Handle
.
TransactionCallback.inTransaction()
λ μ΄μ Handle
TransactionStatus
νλ―λ‘ inTransaction()
Jdbi
λλ Handle
.
CallbackFailedException
λ λ μ΄μ μ‘΄μ¬νμ§ μμ΅λλ€. HandleConsumer
, HandleCallback
, TransactionalConsumer
λ° TransactionalCallback
μ κ°μ λ€μν κΈ°λ₯ μΈν°νμ΄μ€λ μ΄μ λͺ¨λ μμΈ μ νμ throwν μ μμ΅λλ€(κ·Έλ¬λ λΆνμν κ²μ¬λ₯Ό νΌνκΈ° μν΄ μ λ€λ¦ μ¬μ©μ΄ μ νλ¨ μμΈ μ²λ¦¬).
SQL κ°μ²΄ μ§μμ κΈ°λ³Έμ μΌλ‘ λ μ΄μ μ¬μ©ν μ μμ΅λλ€. μμ±λ Jdbi
μΈμ€ν΄μ€λ§λ€ λ±λ‘ν΄μΌ ν©λλ€.
IntelliJμ Migrate Refactorλ λ§μ΄κ·Έλ μ΄μ μ μμνλ λ° λμμ΄ λμμ΅λλ€.
ν¨κ» λ§λ€μ΄μ£Όμ @electrum μκ² κ°μ¬λ립λλ€! μ΄κ²μ ν° λμμ΄ λ κ²μ λλ€
λ΄ νλ μ ν μ΄μ κ²ν μμ λͺ κ°μ§ μΆκ° μ°Έκ³ μ¬ν:
java.lang.reflect.Type
λ₯Ό μ¬μ©νλ λ°λ©΄ v2 λ java.lang.Class
λ₯Ό μ¬μ©ν©λλ€. μ΄λ v3κ° v2κ° μ²λ¦¬ν μ μλ 볡μ‘ν μΌλ° μ ν μλͺ
μ μ²λ¦¬ν μ μμμ μλ―Έν©λλ€.-parameters
νλκ·Έκ° νμ±νλ μνμμ μ½λλ₯Ό μ»΄νμΌνμ¬ SQL Object λ©μλ 맀κ°λ³μμ @Bind
μ£Όμμ μ ν μ¬νμΌλ‘ λ§λ€ μ μμ΅λλ€.StatementLocator
μΈν°νμ΄μ€κ° μ½μ΄μμ μ κ±°λμμ΅λλ€. λͺ¨λ ν΅μ¬ λͺ
λ Ήλ¬Έμ μ΄μ μ€μ SQLμ μμ ν κ²μΌλ‘ μμν©λλ€. λΉμ·ν κ°λ
μΈ SqlLocator
κ° μΆκ°λμμ§λ§ SQL Objects μμμμλ§ μΆκ°λμμ΅λλ€.λ€λ₯Έ νλ: StatementRewriter
κ° TemplateEngine
λ° SqlParser
λ‘ λ¦¬ν©ν λ§λμμ΅λλ€.
λͺ©λ‘μ μΆκ°νλ λ° λ§€μ° μ€μν κ²μ μ ν λμμ λλ€. κ·Έκ²μ μ΄κ²μμ κ°λ€ :
List<Map<String, Object>> rs = h.select("select id, name from something");
μ΄μ:
List<Map<String, Object>> rs = h.select("select id, name from something").mapToMap().list();
v3μ μΆκ° κΈ°λ₯κ³Ό μ μ°μ±, μμ μ±μ΄ μ₯ν©ν λκ°λ₯Ό μΉλ₯΄μ§ μμμΌλ©΄ ν©λλ€.
@javajosh λ , μ°λ¦¬λ Map
κ°μ²΄μ λν 맀νμ μ΅μ νλ €κ³ νκΈ° λλ¬Έμ νΉμ νλͺ©μ΄ λ무 λμλ€κ³ μκ°νμ§ μμμ΅λλ€. λ€λ₯Έ κ²μ΄ μλλΌλ©΄ ν€μ λμλ¬Έμ κ΅¬λΆ κ·μΉμ΄ νΌλμ€λ½μ΅λλ€. μ μλ μ νμ μ§μ μμ±νλ λμ Map
λ₯Ό λ΄λ³΄λ΄μΌ νλ μ΄μ κ° μμ΅λκΉ? λλ κ°μΈμ μΌλ‘ νμ μμ κ²°κ³Ό ν΄λμ€(μμ±μ/νλ/μμ± λ§€νΌ λ° λ°μΈλ μ¬μ©)λ₯Ό μμ±νκ³ νμ Map
μ¬μ©μ νΌν©λλ€. λ§€μ° νΈλ¦¬ν μ¬μ© μ¬λ‘κ° μμ΅λκΉ?
μλ νμΈμ @stevenschlansker - μ λ "κ°λ°μ 첫 κ²½ν"μ κ΄μ μμ μ κ·Όνκ³ μμ΅λλ€. μμ μ½λλ λΉμ μμ μ v2 νν 리μΌμμ κ°μ Έμ¨ κ²μ λλ€. κ·Έλ¦¬κ³ μ€μ λ‘ μλ°μ€ν¬λ¦½νΈμ κ°μ λ§΅μ΄ λ΄μ₯λ Groovyμ κ°μ JVM νΈμ€ν μΈμ΄λ₯Ό μ¬μ©νλ©΄ μ νμ΄ μ§μ λμ§ μμ κ²°κ³Όλ₯Ό λ μμ£Ό λ³Ό μ μμ΅λλ€.
@javajosh https://github.com/jdbi/jdbi/pull/925 μ λν΄ μ΄λ»κ² μκ°νμΈμ?
@stevenschlansker #928μ μλ―Έν©λκΉ?
@stevenschlansker νμ€ν κ°μ λμμ΅λλ€! κ·Έλ¬λ v2λ³΄λ€ μ¬μ ν λ μ₯ν©ν©λλ€. :) μ΄κ²μ maven λ±μμμ λ ν° μ₯ν©ν¨μ μΆκ°λ©λλ€. JDBIκ° λͺ κ°μ§ λ©μ§ κΈ°λ₯μ κ°μ§κ³ μκΈ° λλ¬Έμ μ¬λλ€μ΄ v4λ₯Ό μ±ννλλ‘ κ³ κ΅°λΆν¬ν JUnitμ λ°©μμΌλ‘ κ°λ κ²μ λ³΄κ³ μΆμ§ μμ΅λλ€. v3μ v3λ "μΆ©λΆν μ’μμ΅λλ€". λλ "withHandle" ꡬ문μ λν΄ κ°μ λλμ κ°μ§κ³ μμ΅λλ€(λͺ¨λ 맀λ¬λ¦° νΈλ€μ μ κ±°νλ €λ λ³Έλ₯μ μ΄ν΄νμ§λ§).
@javajosh λ κ°λ ₯ν μ μ΄λ₯Ό μνλ©΄ μ¬μ ν Jdbi.open()
κ° μμ§λ§ μμ μ μν΄ try-with-resources λΈλ‘ λ΄μμ μ¬μ©νλ κ²μ΄ μ’μ΅λλ€.
v2μμ v3λ‘μ λ§μ΄κ·Έλ μ΄μ λ¬Έμ μμ μ μμν©λλ€.
@javajosh $# List<Map<String,Object>>
ResultBearing.list()
λ©μλλ‘ λμκ°λλ€. νΉν λ¦΄λ¦¬μ€ μ£ΌκΈ° νλ°μ μ΄κ²μ μΆκ°νλ κ²μ΄ μ’μ μκ°μΈμ§ μ λͺ¨λ₯΄κ² μ΅λλ€.
μμΈν λ΄μ©μ λν κ·νμ μ°λ €μ 곡κ°νμ§λ§, κ·Έ μμΈν λ΄μ©μ κ°λ°μ μλλ₯Ό λͺ νν νλ λ° λμμ΄ λ©λλ€.
handle.createQuery(sql)
.mapToMap()
.list()
λ€μλ³΄λ€ λ μμκ² λ λͺ νν©λλ€.
handle.createQuery(sql)
.list()
κ·Έκ²μ λ―Όκ°ν μΌμ΄λ©°, λλ λΉμ μ΄ μ νν΄μΌ νλ μμΉκ° λΆλ½μ§ μμ΅λλ€. JDBIλ νλ₯ν λΌμ΄λΈλ¬λ¦¬μ΄λ©°, μ₯ν©ν¨μ λν μ°λ € μ¬νμ λ±λ‘νκ² λμ΄ κΈ°μ©λλ€. μ΄ νΉλ³ν κ²½μ°μ νΈλ¦¬ν λ°©λ²μ μΆκ°νλ κ²μ΄ μλ―Έκ° μλμ§ μ¬λΆλ νμ€νμ§ μμΌλ©° νλ‘μ νΈμ μ§μ§νκ² κ΄μ¬νμ§ μκΈ° λλ¬Έμ λ΄ νλ¨μ μ λ’°νλ κ²½ν₯μ΄ μμ΅λλ€! λ£κΈ° μ£Όμ μ κ°μ¬ν©λλ€!
λ 짧μ μ΄λ¦μ μ¬μ©νλ κ²μ΄ λ λμ λ°©λ²μ λν ꡬ체μ μΈ μλ κ°μ ν μ μλ λ°©λ²μ λν μΌμΌμ΄μ€κ° μμΌλ©΄ μλ €μ£ΌμΈμ π
κ°μ₯ μ μ©ν λκΈ
μκ·λͺ¨ νλ‘μ νΈ μ΄μ μ μ°Έκ³ μ¬ν:
μ΄λ¦μ΄ λ³κ²½λ ν΄λμ€(κ°μ Έμ€κΈ°λ₯Ό μμ νκ³ IDEμμ μμ νλλ‘ νλ κ²λ§νΌ κ°λ¨νμ§ μμ):
DBI
->Jdbi
IDBI
->Jdbi
DBIException
->JdbiException
Jdbi
μ μμ±μλcreate()
ν©ν 리 λ©μλλ‘ λ체λμμ΅λλ€.ResultSetMapper
λRowMapper
map
λ©μλμλ λ μ΄μ ν μΈλ±μ€κ° μμ΅λλ€.ResultSetMapper
λΌλ ν΄λμ€κ° Jdbi 3μ μ‘΄μ¬νμ§λ§ λ€λ₯Έ μ©λλ‘ μ¬μ©λ©λλ€.@Mapper
λ@UseRowMapper
λ‘ λ°λλλ€. $#$Jdbi
μregisterMapper()
λregisterRowMapper()
λ‘ λ°λλλ€.@BindIn
λ@BindList
λ‘ λ체λμμΌλ©° λ μ΄μ StringTemplateμ΄ νμνμ§ μμ΅λλ€.κΈ°λ³Έ Jdbi ν νλ¦Ώμ μ¬μ©νλ©΄ κΊΎμ κ΄νΈκ° μΈμ©λμ§ μμ΅λλ€. μ¦, λꡬ -> λ°μ΄ν°λ² μ΄μ€ -> μ¬μ©μ ν¨ν΄ μλμμ 맀κ°λ³μ ν¨ν΄μ ꡬμ±ν ν IntelliJκ° κ΅¬λ¬Έμ μ΄ν΄ν©λλ€.
Query
μλ λ μ΄μMap
μ κΈ°λ³Έ μ νμ΄ μμΌλ―λ‘list()
λ₯Ό μ§μ νΈμΆν μ μμ΅λλ€. $list()
$ μ νΈμΆνκΈ° μ μmapToMap()
μ μ ννμμμ€.TransactionStatus
λ λ μ΄μ μ‘΄μ¬νμ§ μμ΅λλ€.TransactionConsumer.useTransaction()
λ μ΄μ Handle
μ¬μ©νλ―λ‘Jdbi
λλ JdbiμμuseTransaction()
λ©μλλ₯Ό μ¬μ©ν λTransactionStatus
μΈμλ₯Ό μ κ±°ν΄μΌ ν©λλ€Handle
.TransactionCallback.inTransaction()
λ μ΄μ Handle
TransactionStatus
νλ―λ‘inTransaction()
Jdbi
λλHandle
.CallbackFailedException
λ λ μ΄μ μ‘΄μ¬νμ§ μμ΅λλ€.HandleConsumer
,HandleCallback
,TransactionalConsumer
λ°TransactionalCallback
μ κ°μ λ€μν κΈ°λ₯ μΈν°νμ΄μ€λ μ΄μ λͺ¨λ μμΈ μ νμ throwν μ μμ΅λλ€(κ·Έλ¬λ λΆνμν κ²μ¬λ₯Ό νΌνκΈ° μν΄ μ λ€λ¦ μ¬μ©μ΄ μ νλ¨ μμΈ μ²λ¦¬).SQL κ°μ²΄ μ§μμ κΈ°λ³Έμ μΌλ‘ λ μ΄μ μ¬μ©ν μ μμ΅λλ€. μμ±λ
Jdbi
μΈμ€ν΄μ€λ§λ€ λ±λ‘ν΄μΌ ν©λλ€.IntelliJμ Migrate Refactorλ λ§μ΄κ·Έλ μ΄μ μ μμνλ λ° λμμ΄ λμμ΅λλ€.