본문 바로가기

자바스크립트

레퍼런스 문제 해결

이전 포스팅의 ORM의 레퍼런스와 관련한 버그가 있다.

find()의 결과를 리턴할때나 저장할때 인스턴스를 복제하지 않았다. 따라서 프로퍼티를 고치면 원래 asset을 바꾸게 된다. 그러나 update() 함수를 호출했을 때만 변경 사항을 asset에 갱신해야 하므로 이 문제를 해결해야 한다.

var asset = new Asset({name: 'foo'});
asset.save();

// 프로퍼티를 변경했지만 update()는 호출하지 않았다.
asset.name = 'wem';

 

find()에서 새 오브젝트를 만들도록 수정해서 이 문제를 교쳐보자. 레코드를 만들거나 갱신할 때에도 오브젝트를 복제해야 한다.

Asset.extend({
    find: function(id) {
        var record = this.records[id];
        if(!record) throw('Unknown record');
        return record.dup();
    }
});

Asset.include({
    create: function() {
        this.newRecord = false;
        this.parent.records[this.id] = this.dup();
    },
    update: function() {
        this.parent.records[this.id] = this.dup();
    },
    dup: function() {
        return jQuery.extend(true, {}, this);
    }
});

 

Model.records는 모든 모델에서 공유하는 오브젝트이므로 또 다른 문제가 발생한다.

 

불행히도 아래코드는 모든 레코드를 섞어놓는 부작용을 포함한다.

var asset = Asset.init();
asset.save();

assert( asset in Person.records );

 

이 문제는 새 모델을 만들 때마다 새로운 레코드 오브젝트를 설정하는 방법으로 해결할 수 있다.

모델에 필요한 오브젝트는 Model.created() 함수에서 처리할 수 있도록 새 오브젝트 생성의 콜백을 Model.created()로 설정한다.

Model.extend({
    created: function() {
        this.records = {};
    }
});

'자바스크립트' 카테고리의 다른 글

ORM 활용  (0) 2022.04.10
데이터 인라인 포함하기  (0) 2022.04.10
ID 지원 기능 추가  (0) 2022.04.10
ORM 만들기  (0) 2022.04.09
MVC와 명칭공간  (0) 2022.04.09