Jdbi: Kotlin ๊ณต๋ณ€๋Ÿ‰ ๊ณผ๋ถ€ํ•˜์— ๋Œ€ํ•œ ๋ชจํ˜ธํ•œ ๋ฐฉ๋ฒ• ์˜ค๋ฅ˜(๋ธŒ๋ฆฌ์ง€ ๋ฐฉ๋ฒ• ๋ˆ„๋ฝ)

์— ๋งŒ๋“  2019๋…„ 08์›” 09์ผ  ยท  8์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: jdbi/jdbi

ํŽธ์ง‘: ๋” ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋กœ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์„œ ์ œ๋„ค๋ฆญ๊ณผ JDBI๊ฐ€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๊ณ  ์ด์ „ ๋ฒ„์ „์˜ JDBI์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ด ์ž‘์—…์„ ์ „์— ๋ณธ ์ ์ด ์žˆ์ง€๋งŒ ์–ด๋–ค ์ด์œ ๋กœ ์ธํ•ด ์ด์ œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

org.jdbi.v3.sqlobject.UnableToCreateSqlObjectException: ์ธํ„ฐํŽ˜์ด์Šค Bar์— ๋ชจํ˜ธํ•œ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. [public abstract java.lang.Object Foo.baz(java.util.UUID), public abstract java.util.UUID Bar.baz(java.util.UUID )], ๋ช…์‹œ์  ์žฌ์ •์˜๋กœ ํ•ด๊ฒฐํ•˜์‹ญ์‹œ์˜ค.

http://jdbi.org/#_annotations_and_inheritance

์ข‹์€ ์ธก์ •์„ ์œ„ํ•ด @Override ๋ฅผ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์•„๋ฌด ๊ฒƒ๋„ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

interface Foo<T> {
    <strong i="12">@SqlQuery</strong>
    fun baz(a: UUID): T
}

interface Bar : Foo<UUID> {
    @SqlQuery("SELECT ClientID " +
              "FROM ClientInstance " +
              "WHERE ClientInstanceID = ?")
    override fun baz(a: UUID): UUID
}

JDBI.inTransactionUnchecked { handle ->
    val tester = handle.attach(Bar::class.java)
    val hest = tester.baz(UUID.fromString("7a949c0e-28db-424a-a449-b118e5175a3b"))
    LOGGER.info { "hest $hest" }
}

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์•ˆ๋…•ํ•˜์„ธ์š” ํ† ๋ฅด,
์šฐ๋ฆฌ๋Š” ๋งค์šฐ ์œ ์‚ฌํ•œ ๊ตฌ์„ฑ์ด ๋ฐ”๋‹๋ผ Java์—์„œ ์ž‘๋™ํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. https://github.com/jdbi/jdbi/blob/master/sqlobject/src/test/java/org/jdbi/v3/sqlobject/TestSqlObject.java#L293 - L307
์•„๋งˆ๋„ ์šฐ๋ฆฌ๋Š” Kotlin ์‚ฌ๋ก€๋ฅผ ๋†“์ณค์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์‚ฌ์šฉ์— ํ•ด๋‹นํ•˜๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๋ฐœ๊ฒฌ๋œ ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  8 ๋Œ“๊ธ€

์•ˆ๋…•ํ•˜์„ธ์š” ํ† ๋ฅด,
์šฐ๋ฆฌ๋Š” ๋งค์šฐ ์œ ์‚ฌํ•œ ๊ตฌ์„ฑ์ด ๋ฐ”๋‹๋ผ Java์—์„œ ์ž‘๋™ํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. https://github.com/jdbi/jdbi/blob/master/sqlobject/src/test/java/org/jdbi/v3/sqlobject/TestSqlObject.java#L293 - L307
์•„๋งˆ๋„ ์šฐ๋ฆฌ๋Š” Kotlin ์‚ฌ๋ก€๋ฅผ ๋†“์ณค์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์‚ฌ์šฉ์— ํ•ด๋‹นํ•˜๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๋ฐœ๊ฒฌ๋œ ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•„, ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณด๋ฉด ๋ฐ˜ํ™˜ ์œ ํ˜• ์ด Object ๋Œ€ UUID ์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Kotlin ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์šฐ๋ฆฌ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•˜๋Š” ํ•ฉ์„ฑ ๋ธŒ๋ฆฌ์ง€ ๋ฉ”์„œ๋“œ๋ฅผ ๋‚ด๋ณด๋‚ด๊ณ  ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

Google์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์˜ ๊ฒฝ์šฐ ์ด ๋ฒ„๊ทธ๋Š” ์ƒ์œ„ ์ธํ„ฐํŽ˜์ด์Šค์— ์ฃผ์„์ด ๋‹ฌ๋ ค ์žˆ์ง€ ์•Š์„ ๋•Œ ๋‹ค๋ฅธ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค(์ฐพ๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค!)

Exception in thread "main" java.lang.IllegalStateException: Method StringRepo.get must be default or be annotated with a SQL method annotation.
    at org.jdbi.v3.sqlobject.SqlObjectFactory.lambda$buildMethodHandler$15(SqlObjectFactory.java:148)
...
interface Repo<T> {
    fun get(): T
}
interface StringRepo : Repo<String> {
    @SqlQuery("SELECT 'Hello world!'")
    override fun get(): String
}
//...snip
jdbi.onDemand(StringRepo::class.java).get()

@LittleMikeDev , ๊ทธ๊ฒƒ์€ ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. : ๋‚˜๋Š” ์ฃผ์„์„ ๋ˆ„๋ฝ ๋œ ํด๋ž˜์Šค์— ๋Œ€ํ•ด ์˜คํ•ด์˜ ์†Œ์ง€๊ฐ€๋˜์ง€ ๋ฉ”์‹œ์ง• ์˜ค๋ฅ˜ ๊ฐœ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค https://github.com/jdbi/jdbi/pull/1590/files#diff -75b1c04d402bd8924262c7fececfcdb1L166์„

@TorRanfelt , ๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•ด ์กฐ๊ธˆ ๋” ํŒŒ๊ณ  ๋“ค์—ˆ๊ณ  ๊ทธ๊ฒƒ์„ ๊ณ ์น˜๊ธฐ ์œ„ํ•ด ๋ฌด์—‡์„ํ•ด์•ผํ• ์ง€ ๋ถ„๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Kotlin ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ณต๋ณ€ ๋ฉ”์„œ๋“œ ์ „๋ฌธํ™”์— ๋Œ€ํ•œ ๋ธŒ๋ฆฌ์ง€ ๋ฉ”์„œ๋“œ๋ฅผ ๋‚ด๋ณด๋‚ด์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. Kotlin ๋ฒ„๊ทธ ์ถ”์ ๊ธฐ์— ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค: https://youtrack.jetbrains.com/issue/KT-33634

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ Jdbi๋Š” ํ•„์š”ํ•œ ๋ธŒ๋ฆฌ์ง€ ๋ฐฉ๋ฒ•์„ ์—๋ฎฌ๋ ˆ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ์ฝ”๋“œ๋Š” ์•„๋งˆ๋„ ์ž‘์ง€๋งŒ ์ž‘์„ฑํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ๊นŒ๋‹ค๋กญ์Šต๋‹ˆ๋‹ค. Kotlin์ด ์ตœ์†Œํ•œ ์ด ๋ฌธ์ œ๋ฅผ ๊ณง ํ‰๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@stevenschlansker ์กฐ์‚ฌํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
Kotlin์ด ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ๋ณด์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด์ „์— ์ด ๋ธŒ๋ฆฌ์ง€๊ฐ€ ์žˆ์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. - ์ด๊ฒƒ์€ ์ด์ „ ๋ฒ„์ „์˜ JDBI๋กœ ๋˜๋Œ๋ ค๋„ ๋‹ค์‹œ ์ž‘๋™ํ•˜์ง€ ๋ชปํ•˜๋Š” ์ด์œ ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ Java 6 ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ ˆ์ถฉ์•ˆ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. 6์€ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๋ธŒ๋ฆฌ์ง€ ๋ฉ”์„œ๋“œ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ Kotlin์€ ์ด๋ฅผ ๋‚ด๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜๋‚ ์—๋Š” ์–ด๋ฆฌ์„๊ฒŒ ๋“ค๋ฆด์ง€ ๋ชจ๋ฅด์ง€๋งŒ 10๋…„ ์ „์—๋Š” ์•„๋งˆ๋„ ๋ง์ด ๋˜์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ;) ๋ฐ”๋ผ๊ฑด๋Œ€ ๊ทธ๋“ค์ด ๊ณง 6 ์ง€์›์„ ์ค‘๋‹จํ•˜๊ฑฐ๋‚˜ ์ ์–ด๋„ ์กฐ๊ฑด๋ถ€๋กœ 6 ์ดํ›„ ์„ธ๊ณ„์™€์˜ ํ˜ธํ™˜์„ฑ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰