Circe: ์ธ์ฝ”๋”/๋””์ฝ”๋”๊ฐ€ ์—†๋Š” ๋™์•ˆ ์“ธ๋ชจ์—†๋Š” ์ปดํŒŒ์ผ ์˜ค๋ฅ˜

์— ๋งŒ๋“  2015๋…„ 08์›” 15์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: circe/circe

๋‚ ์งœ์— ๋Œ€ํ•œ ์ธ์ฝ”๋”ฉ์ด ์—†์œผ๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ถˆํ‰ํ•ฉ๋‹ˆ๋‹ค.

 [error] /home/jilen/workspace/jfc-test/src/main/scala/Foo.scala:26: diverging implicit expansion for type io.circe.Encoder.Secondary[this.Out]
[error] starting with method encodeCaseClass in trait GenericInstances

์˜ค๋ฅ˜ ๋ณด๊ณ ๋ฅผ ๊ฐœ์„ ํ•  ๊ธฐํšŒ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

import io.circe._
import io.circe.generic.auto._
import io.circe.syntax._

import java.util.Date
case class Foo(
  date: Date,
  number: Int,
  str: String)

object App {

  def encodesDate(fmt: String): Encoder[Date] = new Encoder[Date] {
    def apply(a: Date) = {
      val sdf = new java.text.SimpleDateFormat(fmt)
      Json.string(sdf.format(a))
    }
  }



  def main(args: Array[String])  {
    //implicit val DateEncodes = encodesDate("yyyy-MM-dd HH:mm:ss")
    val f = Foo(new Date, 1, "fff")
    println(f.asJson.noSpaces)
  }
}

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

implicitNotFound๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด +1!
๋‚ ์งœ๋ฅผ ๋””์ฝ”๋”ฉํ•˜๊ณ  ์ธ์ฝ”๋”ฉํ•˜๋ ค๋ฉด ์•”์‹œ์ 

  implicit val dateTimeEncoder: Encoder[DateTime] = Encoder.instance(a => a.getMillis.asJson)
  implicit val dateTimeDecoder: Decoder[DateTime] = Decoder.instance(a => a.as[Long].map(new DateTime(_)))

๋‚ ์งœ ํ˜•์‹์ด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์„œ์—์„œ ์ •์˜ํ•˜๊ณ  jfc์— ๊ธฐ๋ณธ ํ˜•์‹์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

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

์˜ˆ, ๊ทธ๊ฒƒ์€ ๋งค์šฐ ๋”์ฐํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์ž…๋‹ˆ๋‹ค. ์ง€์ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜ ํŒŒ์ƒ ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ๊ตฌํ˜„์€ ๋‚ด์ผ ์™„๋ฃŒ๋˜๊ธฐ๋ฅผ ํฌ๋งํ•˜๋Š” #30๊ณผ ํ•จ๊ป˜ ๋ณ€๊ฒฝ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋จผ์ง€๊ฐ€ ํ•ด๊ฒฐ๋œ ํ›„ ์ƒํ™ฉ์ด ์•ฝ๊ฐ„ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๊ฒƒ์„ ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•˜๊ณ  #34๋ฅผ ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ๋งŽ์ด ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋ช‡ ๊ณณ์—์„œ @implicitNotFound ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: Finch์˜ ์ด ๋ฉ”์‹œ์ง€ ์ฐธ์กฐ).

implicitNotFound๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด +1!
๋‚ ์งœ๋ฅผ ๋””์ฝ”๋”ฉํ•˜๊ณ  ์ธ์ฝ”๋”ฉํ•˜๋ ค๋ฉด ์•”์‹œ์ 

  implicit val dateTimeEncoder: Encoder[DateTime] = Encoder.instance(a => a.getMillis.asJson)
  implicit val dateTimeDecoder: Decoder[DateTime] = Decoder.instance(a => a.as[Long].map(new DateTime(_)))

๋‚ ์งœ ํ˜•์‹์ด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์„œ์—์„œ ์ •์˜ํ•˜๊ณ  jfc์— ๊ธฐ๋ณธ ํ˜•์‹์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์ด ํฌ๊ฒŒ ๊ฐœ์„ ๋˜์—ˆ์œผ๋ฏ€๋กœ ๊ณ„์† ์ง„ํ–‰ํ•˜๊ณ  ๋‹ซ๊ฒ ์Šต๋‹ˆ๋‹ค.

<console>:59: error: could not find implicit value for parameter e: io.circe.Encoder[Foo]
           println(f.asJson.noSpaces)
                     ^

๋ฌธ์„œ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ์ œ์™ธํ•˜๊ณ  ์ด ๊ฒฝ์šฐ @implicitNotFound ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์šฉํ•œ ์ถ”๊ฐ€ ์ •๋ณด๊ฐ€ ๋งŽ์ด ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

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