티스토리 뷰

Daylogs/Javascript

Backbone.sync 과정

ohgyun 2013. 12. 15. 15:44


발생일: 2013.12.02

문제:
진행 중인 프로젝트에서 백본(Backbone) 라이브러리를 사용하고 있는데,
대상 API가 완벽히 RESTful 하진 않다.

RESTful 한 부분만 백본의 `sync` 프로세스를 적용할 것인지,
아니면 아예 사용하지 않을 것인지에 대해 토의가 필요했다.

유지보수를 생각해서 팀에서는 사용하지 않는 것으로 결정했다.
나중에 새 멤버가 들어오면 구현되어 있는 모습을 이해하기 어려울 수 있고,
어떤 건 `sync`로 구현하고 어떤 건 그냥 구현하는 룰이 명확하지 않을 거라는 것 때문이었다.

여튼, 토의 준비 과정에서 정리해뒀던 `sync` 과정을 메모해둔다.


해결책:


`Backbone.sync()`를 호출하는 각 메서드는 아래와 같이 동작한다.


fetch()
1. 서버에 'GET' 요청을 보낸다. `sync('read');`를 호출한다.
2. 서버 응답으로 `model.set()`을 호출하는데,
    2.1. 유효하지 않은 데이터이면(`validate()`에 실패하면) `false`를 리턴한다.
           이 때엔, `change`와 `sync` 이벤트 둘 다 발생하지 않는다.
    2.2. 유효한 데이터이면, 모델을 설정하고 `change` 이벤트를 발생한다.
           `silent` 옵션이 켜져있다면 발생하지 않는다.
3. 요청에 성공하고 모델 셋팅까지 성공했다면, `sync` 이벤트가 발생한다.


save()
1. 요청 전 `validate()`를 검사한다.
1. 새 모델이면(`isNew()`, `id` 여부로 판단) `POST`, 아니라면 `PATCH` 또는 `PUT` 요청을 보낸다.
2. `wait: true` 속성 옵션이 있다면 서버 응답 후, 아니라면 요청 직후 모델에 셋팅한다.
    2.1. `set()`에 따라 `change` 이벤트가 발생할 수 있다.
3. 유효한 데이터였다면, `sync` 이벤트를 호출한다.


destroy()
1. `id`가 발급되지 않은 새 모델이면 바로 `success()`를 호출하고 요청하진 않는다.
2. 'DELETE` 요청을 보낸다.
3. `wait: true` 옵션이거나 새 모델이면, `destroy()`를 호출한다.
    3.1 `destroy` 이벤트가 발생한다.
4. `sync` 이벤트가 발생한다.


자세한 건 백본 코드에서 `Backbone.sync`로 검색해 보면 된다.
주석이 잘 달려있어서 이해하기 어렵지 않다.


반응형
댓글
공지사항