Falcor Overview

Introduce

Falcor는 효율적인 데이터 가져 오기를위한 JavaScript 라이브러리.

GraphQL과 같이 One Fetch에 필요한 데이타만를 받고자 하는 것은 비슷하다.

또한 Facebook의 GraphQL Cache Framework 인 relay(+GraphQL)와 많이 비교된다.

Overfetch를 방지를 해주는 것도 비슷하다.


서론

falcor를 이야기 하자면 JSON Graph 를 이야기 하지 않을 수 없지만 우선 왜 이런 아키텍처가 나왔는지 생각해보자.

우선 NETFLIX 서비스를 생각해 보자.



앞선 이미지에서 3개 카테고리가 있을 때 one fetch에 중복을 제거하고 데이타를 받기 위해서는 어떻게 해야할까?

GraphQL을 사용한다면 아마도 One Fetch로 데이타를 받을 경우 중복 데이타(복제본)가 발생한다.

기본적으로 JSON은 근본적으로 Tree 구조이므로 원하는 데이타를 원하는 모양으로 받는데 문제는 없지만 중복은 어쩔수 없다.

그래서 Falcor가 JSON Graph를 통해 어떻게 이 문제를 풀어가는지 생각해보자.


Model

View와 DataSource(또는 HTTPDataSource)간에 중개자 역활을 수행한다.

  • 데이타 검색 기능(단일 값, JSON 데이타)

  • 이전 데이타에 대해서 캐싱

  • DataSource를 통해 검색된 JSON Graph 를 조회시 JSON으로 변환한다.

  • 여러개의 동시요청을 일괄 요청으로 변경하여 효율적인 네트워크 액세서 패턴을 제공한다.

  • 비동기 처리 및 개발 용이성(mock data)을 위해 데이타 조회시 Promise 반환 지원.

  • 캐싱 데이타와 아닌 데이타를 구분해서 아닌 데이타만 서버에 요청한다.(Realy와 같다.)

  • 기본적으로 GET방식 호출이므로 호출 API는 브라우저에서 캐싱된다.




Data Sources

DataSource : JSON Graph 통데이타를 구성해서 데이타로 사용할때.

HttpDataSource : 원격지(서버)의 데이타를 Model의 데이타로 사용할 때. 이때 모델 내에 캐싱데이타가 전부/일부라도 없으면 서버에 요청해서 받아와 캐싱한다.

  • get : DataSource를 통해 JSON 또는 단일값을 가져온다.

  • set : DataSource 데이타 변경

  • call : DataSource의 해당 path의 call에 해당되는 작업을 한다. Mutation 작업에 어울린다.


Router

Falcor 라우터는 DataSource 인터페이스 의 구현체로서 호출자의 PathSet 에 따라서 falcor 미들웨어에서 해당 데이타를 조회하고 구조에 맞게 리턴한다.

express의 app.get 또는 spring의 RequestMapping와 비슷한 개념이다.차이점에 한번의 fetch에 여러 pathSet이 있는 경우 여러개의 method와 match될 수 있다.

따라서 라우터 특정 Method에 매칭 기준을 PathSet값으로 되어 있다.

PathSet은 model"productList"seller" 와 같이 키 또는 인덱스의 조합이다.


JSON Graph

Falcor는 중복 데이타가 fetch되어 발생하는 낭비를 제거하기 위해 JSON Graph를 사용하고 있다.


기본적인 JSON Type

우선 JSON의 경우 데이타가 단순한 Tree 구조를 가지고 표현이 되며 중복데이타가 있으면 동일하게 표현된다.

그러나 실제 우리가 서비스를 할때는 이 단순한 JSON 객체로 서비스를 하게 된다.

Falcor를 사용하기 위해서는 JSON Graph와 JSON을 Type을 잘 이해하여 사용하여야 한다.


JSON 구조 및 접근 구조.

var model = {
   productList : [{
           id : 100,
        name : "생수",
      seller : {
          id : 10000,
            name : "물장수",
            like : false
      }
      },{
           id : 200,
        name : "맥스 커피",
      seller : {
          id : 10000,
            name : "물장수",
            like : false
}}]
}
/* 참조 방법 */
model["productList][0]["seller"]["name"] // 물장수
model["productList][0]["seller"]["like"] = true
//JSON은 단순 트리 구조로 위의 seller가 같더라도 하나의 값만 바뀐다..

JSON Graph

기본적으로 일반적으로 사용되는 JSON DataType에 레퍼런스을 추가하였다고 생각하면 된다.

Falcor Model에 의해 들어온 값들은 모두 Sentinels 이라는 JSON 객체로 변환된다.

Sentinels JSON 객체는 ref, atom, error 3가지 type으로 분류한다..


- Reference

가장 중요한 Type으로 이를 통해 중복 데이타 제거가 가능하다.

레퍼런스가 가능함에 따라서 Graph 구조의 데이타를 가질 수 있다.

linux의 Symbolic link와 같은 개념이다.


{
   $type: "ref", value: ["sellerById", 10000]
}
 /*
  ["sellerById", 10000]은 주소 값으로 데이타를 추출저장 할때는
  해당 위치에 데이타를 사용하게 된다.
*/

- Atom(원자)

Atom은 $type값이 atom인 Sentinels 객체이다.

데이타를 boxing하고, model에서 데이타를 추출할 때는 unboxing 된다. atom 으로 boxing되지 않는 array는 map으로 내부적으로 바뀌어 저장되게 되므로 데이타 종류에 따라서 사용하여야 한다.

내부적으로 아래와 같이 저장된다. 쪼개고 싶지 않은 데이타를 atom으로 사용하면 된다.


subtitles: ['en', 'fr']  // 실제 데이타
subtitles : { // JSON Graph 구조로 변환
 "0" : { $type: "atom", value : "en" },
 "1" : { $type: "atom", value : "fr"}
}
subtitlesAtom: $atom(['en', 'fr']) // $atom으로 실제 데이타
//JSON Graph
subtitlesAtom : { $type: "atom", value : ["en", "fr"] }

Atom 샘플

  var falcor = require('falcor');
 var model = new falcor.Model({cache: {
   titlesById: {
     "44": {
       name: "Die Hard",
       subtitles: ['en', 'fr']
       subtitlesAtom: { $type: "atom", value: ['en', 'fr'] },
      }
    }
}});

// 데이타를 항상 Promise 객체를 반환.(그래서 async,await 썼으니 참고)
 await model.getValue(['titlesById', 44, 'subtitlesAtom']);
 // ['en', 'fr']
 await model.getValue(['titlesById', 44, 'subtitles']);
 // undefined
 await model.getValue(['titlesById', 44, 'subtitles', 0]);
 //'en'

- Error

error 정보를 담고 있는 Sentinels 객체

라우터에서 데이타를 내려줄때 특정 Path에서 에러가 발생한 경우아래와 같이 error Type을 내려주게 된다. 다시한번 말하지만 Response의 전체가 Error가 되는 것이 아닌 특정 Path에 대해서만 Error가 내려간다.


{ $type: "error", value: "request time out" }

JSON Graph Data 샘플

  var $ref = falcor.Model.ref;
 var $atom = falcor.Model.atom;
 var model = new falcor.Model({
     cache: {
       productList: [{
           id: 100,
           name: "생수",
           lang: ["en", "ko"],
           seller: $ref("sellerById[10000]")
        },{
           id: 200,
           name: "맥스 커피",
           seller: $ref("sellerById[10000]"),
           lang :
      }],
       sellerById: {
         "10000": {
           id: 10000,
           name: "물장수",
           like: false
      }}}});

데이타 접근방식

데이타에 접근하기 위해서는 키배열방식과 pathSet방식 모두를 지원한다.

- 키 배열 방식의 데이타 접근.

await model.getValue('productList[0]["seller"]["like"]');
await model.getValue('sellerById["10000"]["like"]');
// 둘다 false

// 수정
await model.setValue('productList[0]["seller"]["like"]', true);

await model.getValue('productList[0]["seller"]["like"]');
// true

- PathSet 방식의 데이타 접근

/*
PathSet 배열 방식
["productList",{length:2},["name","id","seller"],["name","like"]]
["productList",{from:0,length:2},["name","id","seller"],["name","like"]]
["productList",{length:2},["name","id","seller"],["name","like"]]

PathSet 구문 문자열
'productList[0..1]["name", "id", "seller"]["name", "like"]
*/

//array index 가 0 부터 1까지.
await model.get(
 'productList[0..1]["name", "id", "seller"]["name", "like"]'
);

조회된 값은 모두 같다.

/*
{
  "json": {
      "productList": {
          "0": {
              "name": "생수",
              "id": 100,
              "seller": {
                  "name": "물장수",
                  "like": true
              }
          },
          "1": {
              "name": "맥스 커피",
              "id": 200,
              "seller": {
                  "name": "물장수",
                  "like": true
          }}}}}
*/

Falcor 어디다가 써야 할까?

모던 웹플리케이션인 SPA(Single Page Application)에 사용하면 캐시데이타를 품은 Model객체를 지속적으로 가져갈수 있으므로 효율이 좋습니다.

SPA가 아닌 웹서비스에서는 캐싱의 효과가 떨어지지만 브라우저 캐싱의 효과가 있다.

그 이유는 falcor Model을 통하여 HttpDataSource를 호출하는 경우 GET 데이타로 호출하게 되고 중복 호출의 경우에는 304 Not Modified로 브라우저 캐싱를 사용하게 된다.

GraphQL + relay와 비교를 많이 하는 만큼 비슷한 경우에 쓰면 되겠죠?


요약하면

  • Falcor는 정말 효율적 데이터 가져 오기를위한 JavaScript 라이브러리

  • JSON Graph를 통한 중복 데이타 제거 및 Overfetch 제거.

  • 데이타 캐싱, 이전 호출 데이타 브라우저 캐싱.

  • GraphQL의 장점에 Relay의 장점을 가지고 있다.


조사하면서 느낀점.

  • 샘플이 GraphQL에 비해 많지 않다.

  • 쓰는 사람이 많이 없다.

  • 아는 사람도 많이 없다.(Falcor를 처음 듣는 사람이 대부분이다.)

  • Falcor가 GraphQL + relay 조합보다 쉽다고 하는데 Falcor가 의외로 쉽지만은 않은 것 같다.

  • Router 작성이 의외로 어려운것 같다.

  • GraphQL처럼 Document(GraphiQL)를 볼 수 없는 것이 아쉽다.


URLS


'Javascript/node.js Coding' 카테고리의 다른 글

GraphQL Overview (graphql.js server code)  (0) 2018.01.05
ES6+(EcmaScript2015+) 정리(ing)  (0) 2017.12.27
Mobx with angular 정리.  (0) 2017.12.05
Posted by 다인,보리아빠
,

IHerb에서도 2017년 블랙프라이 데이 할인 행사를 길게 진행하네요.



대상 : 전품목

할인율 : 10%

기간 : 2017년 12월 1일 03:00까지




프로모션 코드


BFR2017


>> iHerb 바로가기 <<






추가로 iHerb에서 간편결제 PAYCO가 붙어서 할인 행사 중이네요.

참고로 언제끝날지 모른다고 하니 다시한번 확인해주세요.




11월 PAYCO 행사 생애 첫 결제 (페이코 신용카드 결제 시 유효)

1> 신한- KB - NH 카드 사용 시: 35,000원 이상 7,000원 할인
2> 3사를 제외한 모든 카드: 10,000 이상 결제 시, 5,000원 할인

11월 PAYCO 즉시할인 (페이코 신용카드 결제 시 유효)
신한- KB - NH: 10,000이상 결제 시, 1,000원 할인 (ID당 기간내 3회

PAYCO 결제 전 아래와 같은 쿠폰 옵션을 확인하실 수 있습니다



PAYCO 포인트 충전 
PAYCO 포인트를 충전하고 포인트로 iHerb 주문을 결제하세요. 페이코가 주는 3% 즉시 할인을 받으실 수 있습니다.



Posted by 다인,보리아빠
,

아주 큰 스케치북 리뷰를 지원받아 맡게 되었습니다.

 

4살 꼬맹이에게 시켜보고 면밀히 관찰하여 리뷰를 적습니다.

 

저희집 4살은 작년부터 이미

많은 집에서 하고 있는 삼성출판사 지능업 시리즈 만2~3세 시리즈를 거치면서

올해초부터 매달 핫딜찾다가 포기하고 중딜로 구매한 아이챌린지로

스티커 붙이기, 선긋기, 그림 그리기등을 이미 많이 겪어본 아이입니다.

 

그래서 이 책 리뷰를 신청해보았는데

제가 지켜보고 기존에 하던것(상성출판사 지능업시리즈)과 비교를 주로 할 예정입니다.

 

 

사용연령 : 3세이상

가격 : 9,800원

 

 

우선 그림을 보시기 전에 총평을 적어봅니다.

 

 

가격 

페이지양 스케일을 보았을때 조금 더 싸면 좋겠습니다.

 

내용 

내용은 무난한 내용이지만 한가지 색으로 그리는 면적이 많은 부분은 아이가 힘들어 하므로

이런부분은 개선이 되면 좋을 것 같습니다.

 

재질

정말 스케치북 재질 같이 두꺼운편.

 

구성

저희 아이를 지켜봤을때는 페이지를 조금 줄이고 

스티커를 한페이지정도 제공해서 아이가 붙일수 있으면 더 좋아할 것 같습니다.

 

적정나이

만2~4세 정도면 적당해 보입니다.

 

 

부모입장에서 이야기.

아이챌린지나 삼성출판사 같은 것도 있고 애플비도있고 아이템플도 있고

대체로 유아 책들이 저가형으로 많이들 해주고 있습니다.

영유아 책들은 대부분 권당 1,800~3,500원 정도가 많습니다.

아마도 가격적인면에서 많은 부모들이 부담이 적은 가격대인것 같다.

 

그에 비해 내용, 재질 자체는 나쁘지 않으나 가성비면에서 경쟁력이 많이 떨어지지 않을까 생각합니다.

또한 아이가 양이 많은 만큼 흥미를 잃지않게 조금더 재미요소가 추가되면 좋을 것 같습니다. 예 : 스티커 추가등.

 

그래도 아이가 신나서 노래부르면서 칠하는 모습 보니깐 좋네요.

오랜만에 써서 두서없지만 두서없이 읽어주시면 됩니다.



아래는 그림 보면서 리뷰.

 

우선 크기부터 보시지요.

이만합니다.

 

 

 

비교하기 편하시게 지능업 시리즈랑 비교했습니다.

호비책이 아래 지능업시리즈보다 넓이가 5cm정도 더 크고 높이가 2cm정도 더 큽니다.

사이즈가 얼마나 큰지 아시겠죠?

이걸 펼치면 아이들 접이식 테이블 정도의 넓이가 나옵니다.

크긴 큽니다.

 

 

어지간해선 자기가 하고싶으면 시키기 때문에 무리해서 시키지는 않습니다.

저희집이면 좋겠지만 결혼기념일날 맘잡고 간 호텔에서 잠시 그림 그리고 있는 모습입니다.

엉덩이 빼놓고 잘 그리고 있습니다.

 

 

처음에는 어떤색으로 칠해야 되는지 말해주면 이제는 곧잘 칠하는 능력을 구사합니다.

아직 디테일이 부족해서 삐져나가는건 어쩔수 없는듯 합니다.

소근육 발달이 부족해 보입니다.

 

 

 

이제는 머리가 좀 컸다고 시킨대로 안합니다.

무지개 색깔로 칠해주고 싶다면서 그렇게 칠하고 있습니다.

 

 

신났네요...

 

 

완성작....

 

 

다음장 화면 입니다.

해당 면은 아이가 조금 힘들어 합니다.

칠해야할 면이 너무 많아서 아이가 그리고나서 팔을 아파하네요. 흠....

이렇게 도색이 힘들다는 걸 아이가 느끼는것 같습니다.

 

사자도 은근 양이 많습니다.

이만큼 하고 나니 쉬겠답니다.

저보고 와서 칠하라고 하네요...

 

큰 힘에는 큰 책임이 필요하듯

큰 스케치북에는 큰 인내가 필요해 보입니다.

 

 

이정도는 적당한 양 같습니다.

이제는 자기 마음대로 잘 칠합니다.

 

 

또다시 기차를 칠하고 또 퍼져버렸습니다.

차량 도색도 힘들텐데 기차 도색은 얼마나 힘들지 얼마전에 저희 차량 도색해주셨던 공업소 분들이

얼마나 힘드실지 상상이 됩니다.

 

 

맨 뒷장에 어떤것들이 있는지 설명해 주었더니 스티커가 하고 싶다고 하네요.

과자 먹으면서 말이죠.



Posted by 다인,보리아빠
,