0Pricing
Scala for Backend Engineering & Functional Programming · 강의

사용자 지정 코덱

다루기 까다로운 구조를 처리해 보세요.

사용자 지정 코덱은(는) CoddyKit의 무료 Scala for Backend Engineering & Functional Programming 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Scala for Backend Engineering & Functional Programming 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Scala for Backend Engineering & Functional Programming 강의에는 총 4개의 강의가 포함되어 있습니다.

사용자 지정 코덱이 필요한 경우

파생 기능은 일반적인 경우를 처리하지만, JSON이 케이스 클래스와 일치하지 않는 경우도 있습니다. 예를 들어 기존 필드 이름, 인코딩된 열거형, 타임스탬프와 같은 형식이 이에 해당합니다.

이 경우 Decoder, Encoder 또는 둘 다를 직접 작성해야 합니다.

커서에서 디코더 만들기

디코더를 만드는 가장 명시적인 방법은 HCursor를 받는 Decoder.instance를 사용하는 것입니다.

downField와 as로 필드를 탐색하고 Either를 반환합니다.

import io.circe.Decoder

case class User(name: String, age: Int)
implicit val dec: Decoder[User] = Decoder.instance { c =>
  for {
    n <- c.downField("full_name").as[String]
    a <- c.downField("years").as[Int]
  } yield User(n, a)
}

forProductN 도우미

간단한 매핑에는 Decoder.forProduct2가 더 간결합니다. JSON 키를 나열하고 생성자를 전달하면 됩니다.

forProduct1부터 여러 인수를 처리하는 도우미까지 제공됩니다.

import io.circe.Decoder

implicit val dec: Decoder[User] =
  Decoder.forProduct2("full_name", "years")(User.apply)

직접 인코더 작성하기

Encoder.instance를 사용해 디코더에 대응하는 인코더를 만들고, 필드에서 Json 객체를 구성합니다.

또는 Encoder.forProduct2를 사용해 한 번의 호출로 선택한 JSON 키에 매핑할 수 있습니다.

import io.circe.Encoder

implicit val enc: Encoder[User] =
  Encoder.forProduct2("full_name", "years")(u =>
    (u.name, u.age))

기존 코덱 변환하기

처음부터 시작하는 경우는 드뭅니다. map은 디코더의 출력을 조정하고, contramap은 인코더의 입력을 조정합니다.

emap은 map과 비슷하지만 실패할 수 있으며, 검증을 위해 Either[String, A]를 반환합니다.

import io.circe.Decoder

case class Age(value: Int)
implicit val dec: Decoder[Age] =
  Decoder[Int].emap { i =>
    if (i >= 0) Right(Age(i)) else Left("negative age")
  }

열거형용 코덱

케이스 객체를 포함한 봉인된 트레이트로 열거형을 모델링할 수 있습니다. 각 항목을 태그 문자열로 인코딩하고, 디코딩할 때는 해당 문자열과 일치하는 항목을 찾습니다.

emap은 알 수 없는 태그를 명확한 디코딩 실패로 변환합니다.

sealed trait Role
case object Admin extends Role
case object Guest extends Role

implicit val dec: Decoder[Role] = Decoder[String].emap {
  case "admin" => Right(Admin)
  case "guest" => Right(Guest)
  case other   => Left(s"unknown role: $other")
}

열거형 다시 인코딩하기

열거형 디코더와 각 케이스를 해당 태그로 표현하는 contramap 인코더를 짝지으세요.

이제 봉인된 트레이트가 JSON에서 일반 문자열로 양방향 변환됩니다.

import io.circe.Encoder

implicit val enc: Encoder[Role] = Encoder[String].contramap {
  case Admin => "admin"
  case Guest => "guest"
}

날짜용 사용자 지정 코덱

Circe의 핵심 모듈에는 기본 제공 java.time 코덱이 없으므로 날짜는 대표적인 사용자 지정 코덱 사례입니다.

ISO 문자열 형식을 통해 디코딩하고 인코딩하세요.

import java.time.LocalDate
import io.circe.{Decoder, Encoder}

implicit val dec: Decoder[LocalDate] =
  Decoder[String].map(LocalDate.parse)
implicit val enc: Encoder[LocalDate] =
  Encoder[String].contramap(_.toString)

Codec으로 묶기

양방향 변환이 모두 있다면 Codec.from(decoder, encoder)으로 하나의 Codec[A]에 결합하세요.

이렇게 하면 서로 분리된 두 개의 암시적 값을 사용하는 대신 하나만 범위에 두면 됩니다.

import io.circe.Codec

implicit val roleCodec: Codec[Role] =
  Codec.from(dec, enc)

ADT용 판별자

데이터를 포함한 봉인된 계층 구조에서는 circe-generic-extras가 래퍼 객체 대신 판별자 필드를 추가합니다.

한 번 구성하면 전체 ADT에 대한 코덱을 파생할 수 있습니다.

import io.circe.generic.extras._

implicit val cfg: Configuration =
  Configuration.default.withDiscriminator("type")

@ConfiguredJsonCodec sealed trait Shape
@ConfiguredJsonCodec case class Circle(r: Double) extends Shape

암시적 범위와 우선순위

직접 작성한 암시적 코덱이 범위에 있는 한 파생된 코덱보다 우선합니다. 항상 검색되도록 동반 객체에 넣으세요.

같은 형식에 대해 auto._와 수동 인스턴스를 모두 가져오면 모호성이 생길 수 있으므로 피하세요.

빠른 확인

사용자 지정 코덱에 대한 이해도를 확인해 보세요.

요약

사용자 지정 코덱은 형식과 일치하지 않는 JSON을 처리합니다. Decoder.instance와 forProductN으로 만들거나, map, contramap, emap으로 기존 코덱을 변환할 수 있습니다.

열거형과 날짜가 일반적인 사례이며, Codec.from으로 양방향 변환을 묶고 ADT에는 판별자를 사용합니다.

자주 묻는 질문

“사용자 지정 코덱” 강의는 무료인가요?

네 — “사용자 지정 코덱” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Scala for Backend Engineering & Functional Programming 강의 전체를 잠금 해제할 수 있습니다. Scala for Backend Engineering & Functional Programming 강의에는 총 4개의 강의가 포함되어 있습니다.

“사용자 지정 코덱”에서 뭘 배우나요?

다루기 까다로운 구조를 처리해 보세요. 브라우저에서 직접 실행하는 실습 코드로 Scala for Backend Engineering & Functional Programming을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Scala for Backend Engineering & Functional Programming을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Scala for Backend Engineering & Functional Programming은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“사용자 지정 코덱” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Scala for Backend Engineering & Functional Programming 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Scala for Backend Engineering & Functional Programming 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. JSON 구문 분석
  2. 케이스 클래스으로 디코딩하기
  3. JSON으로 인코딩하기
  4. 사용자 지정 코덱
← Scala for Backend Engineering & Functional Programming(으)로 돌아가기