Ajax를 이용한 데이터 바인딩 시 어떤 방법을 사용하고 계신가요? 데이터를 받고 나서, HTML 태그를 찾아 데이터를 바인딩 시키는 방법을 사용하고 계신가요?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <table> <thead> <tr> <th>아이디</th> <th>이름</th> <tr> </thead> <tbody> <tr id="user-list"> </tr> </tbody> </table> <script> $.ajax({ url: "/api/v1/users", type: "GET", cache: false, success: ((data) => { $("#user-list").empty(); $("#user-list").append("<td>" + data.id + "</td><td>" + data.name + "</td>"); }), error: ((data) => { console.log("fail"); }) }); </script> | cs |
코드가 엄청 지저분 해 질뿐만 아니라, HTML 태그의 ID를 잘 못 넣는다던가 또는 HTML 태그가 테이블에서 div로 변경되면 바인딩 해주는 자바스크립트를 모두 변경해 주어야 하는 불편함이 상상을 초월합니다.
이러한 불편을 한방에 날려줄 수 있는 자바스크립트 라이브러리가 있으니 Knockout.js 입니다. MVVM과 옵저버 패턴이 적용되어 Ajax에서 받은 데이터가 변경되거나 Refresh되면 알아서 자동으로 데이터가 바인딩 됩니다. 또한 2-way 바인딩도 적용되므로 React나 AngularJs를 사용하기 전이라면 아주 괜찮은 자바스크립트 입니다.
개발자 문서와 Tutorial도 잘 만들어져 있기 때문에 쉽게 이해하고 따라할 수 있습니다. custom 바인딩 쪽을 들어가면 따로 공부를 해야 하지만 그렇지 않으면 러닝 커브가 매우 낮습니다. 위의 Ajax 데이터 바인딩은 아래와 같이 바꿀 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | <table> <thead> <tr> <th>아이디</th> <th>이름</th> <tr> </thead> <tbody> <tr> <td data-bind="text: id"></td> <td data-bind="text: name"></td> </tr> </tbody> </table> <script> function User(id, name) { var self = this; self.name = name; self.id = id; } function UsersViewModel() { var self = this; // Editable data self.users = ko.observableArray(); } var viewModel = new UsersViewModel(); ko.applyBindings(viewModel); $.ajax({ url: "/api/v1/users", type: "GET", cache: false, success: ((data) => { viewModel.users($.map(data, item => UserCoupon(item.id, item.name)); }), error: ((data) => { console.log("fail"); }) }); </script> | cs |
바인딩될 클래스를 지정해 놓고 Ajax 데이터 결과를 array에 넣기만 하면 data-bind attribute가 모든 데이터 출력을 알아서 뿌려주게 됩니다.
저는 Knockout.js를 사용하기 시작한 이 후 신세계를 경험하고 있습니다. 데이터 바인딩과 함께 Routing 라이브러리를 같이 사용하면 Single Page Application도 쉽게 만들 수 있습니다.
'개발 이야기' 카테고리의 다른 글
[TypeScript 기초] 2. 오브젝트 데이터 바인딩 (0) | 2018.07.12 |
---|---|
[TypeScript 기초] 1. 환경 설정 (0) | 2018.07.11 |
코드 리뷰 및 리팩토링 (0) | 2018.06.23 |
Domain Driven Design을 위한 프로젝트 구조 (0) | 2018.06.20 |
프론트 엔드 개발자의 미래 (0) | 2018.06.19 |
최근댓글