JSON.Encoder 프로토콜

JSON.Encoder 프로토콜

JSON.Encoder는 데이터 구조를 JSON으로 인코딩할 때 어떻게 표현할지 정의하는 프로토콜이에요. 기본 타입들은 이미 구현돼 있지만, 여러분이 만든 구조체를 JSON으로 바꾸려면 이 프로토콜의 동작을 지정해 줘야 해요.

구조체를 정의할 때, 어떤 필드를 JSON으로 인코딩할지 골라서 이 프로토콜을 파생(derive)할 수 있어요.

@derive {JSON.Encoder, only: [...]}
defstruct ...

필드를 제외하고 싶다면 :except 옵션을, 모든 필드를 인코딩하려면 두 옵션을 모두 빼면 되지만, 이 두 방식은 조심해서 써야 해요.

@derive {JSON.Encoder, except: [...]}
defstruct ...

@derive JSON.Encoder
defstruct ...

⚠️ 개인 정보 누출 위험 새 필드가 추가될 때 개인 정보가 실수로 새는 걸 막으려면 :only를 쓰는 편이 좋아요. 다른 방식은 신중하게 사용하세요.

출처: JSON.Encoder

본문

JSON.Encoder는 구조체 등 사용자 정의 타입을 JSON 직렬화하는 방법을 알려주는 프로토콜입니다. JSON.encode/1이 값을 인코딩할 때 이 프로토콜을 사용해요.

여러분이 구조체를 직접 소유하지 않아도, Protocol.derive/3를 쓰면 프로토콜 구현을 만들어 낼 수 있어요.

Protocol.derive(JSON.Encoder, NameOfTheStruct, only: [...])
Protocol.derive(JSON.Encoder, NameOfTheStruct, except: [...])
Protocol.derive(JSON.Encoder, NameOfTheStruct)

t

@type t() :: term()

이 프로토콜을 구현하는 모든 타입이에요.

encode

주어진 term을 t:iodata/0로 인코딩하기 위해 호출되는 함수예요. JSON.encode/1이 내부적으로 이 함수를 호출해서 최종 JSON 문자열을 만들어 내요.

:only:except를 사용할 때는 인코딩되는 필드 목록이 의도와 다른지 꼭 확인하세요. 특히 구조체에 민감한 필드(비밀번호, 토큰 등)가 있다면 :only로 명시적으로 골라주는 게 안전해요.

더 알아보기

  • JSON.encode/1: 값을 JSON 문자열로 인코딩하는 함수
  • JSON.decode!/1: JSON 문자열을 다시 데이터 구조로 되돌리는 함수
  • Protocol.derive/3: 구조체를 소유하지 않았을 때 프로토콜 구현을 만드는 방법