어디선가 본 가장 와닿는 정의는 다음과 같다. : a way of cleaning up JSON data consisting of many deeply nested objects
깊게 중첩된 오브젝트로 구성된 JSON 데이터를 정리하는 방법
normalizr란 Motivation과 Solution을 살펴보면 알 수 있듯이, 복잡한 JSON Object를 정규화 하기 위한 Library 정도 되겠다.
Motivation
Many APIs, public or not, return JSON data that has deeply nested objects. Using data in this kind of structure is often very difficult for JavaScript applications, especially those using Flux or Redux.
많은 API들은 중첩된 객체 형태의 JSON을 return 한다. 이런 구조의 데이터를 사용하는 것은 javascript applications, 특히 Flux 또는 Redux를 사용 하기 어렵다.
Solution
Normalizr is a small, but powerful utility for taking JSON with a schema definition and returning nested entities with their IDs, gathered in dictionaries.
Normalizr은 JSON을 스키마 정의로 사용하고, Dictionary에 저장된 ID로 중첩 된 항목을 반환하는 작지만 강력한 유틸리티.
Execution of normalizr
이론을 글로 읽는 것 보다는 실행 전/후를 살펴보는게 훨씬 빠르게 이해 할 수 있을 것이다. ㄱㄱㅆ
ECMAScript Module(ESM)을 사용하고 있어, node.js 는 기본적으로 CommonJS Module loading을 사용하기 때문에 babel을 사용해서 실행한다. node.js v8.9.1의 –experimental-modules flag 사용을 해 보려고 했으나, 결국 실패해서 포스팅 재작성
normalize(data: any, schema: Schema): { entities: any, result: any }
Normalizes input data per the schema definition provided.
data: required Input JSON (or plain JS object) data that needs normalization.
schema: required A schema definition
GitHub에서 normalize function을 위와같이 설명하고 있다. 그렇다고 한다-ㅅ-
normalize function을 사용하기 위해서는 normalize 할 원본 데이터(JSON or plain JS object)와, 해당 원본 데이터의 schema를 정의한 Scmhema를 parameter로 전달해야 한다.
export type Schema =를 이루는 항목들을 보면 알 수 있듯 Schema는 모두 namespace schema를 이용해서 만들어야 한다. 그리고 보통 schema.Entity, schema.Array 그리고 {[key: string]: Schema}를 사용 할 것으로 보인다.
무슨 말인고 하니, input data가 어떻게 이루어져 있는지를 정의하고, 필요에 따라서는 몇가지 옵션을 통해서 Entity를 만져주면 된다.
우리의 관심사는 book 이라는 Entity에 들어있는 값 들이다. 하지만 input data에 book은 books 라는 property에 Array 형태로 존재한다. 따라서 이를 정리하면 다음과 같다.
input data 는 object 형태로 books라는 property에 Array를 가지고 있다.
input = { books: [] }
이 Array의 item은 object이며, 이를 book 으로 사용 하도록 한다.
book = { id: 1, title: 'rework' }
위의 순서에 따라서 정의(line 3, 4) 한 후, normalize function에 전달하면 된다.
결과는 아래와 같다.
1
2
3
4
5
{ entities:
{ book:
{ '1': { id: 1, title: 'rework' },
'2': { id: 2, title: '대한민국이 묻는다' } } },
result: { books: [ 1, 2 ] } }
아주 심플한 예제는 이정도에서 마치자.
Dive into the normalizr
앞서 최초 실행 해 봤던 예제에 대한 분석.
To be continue..
processStrategy(value, parent, key): Strategy to use when pre-processing the entity. Use this method to add extra data, defaults, and/or completely change the entity before normalization is complete. Defaults to returning a shallow copy of the input entity. Note: It is recommended to always return a copy of your input and not modify the original. The function accepts the following arguments, in order: value: The input value of the entity. parent: The parent object of the input array. key: The key at which the input array appears on the parent object.