Today's

길을 나서지 않으면 그 길에서 만날 수 있는 사람을 만날 수 없다

갑을병정이야기

Remote Operations와 DxDataGrid를 활용한 웹 애플리케이션 예제

Billcorea 2024. 12. 17. 15:38
반응형

# Remote Operations와 DxDataGrid를 활용한 웹 애플리케이션 예제

마음에 평온이 ...


오늘은 DxDataGrid를 사용하여 원격 데이터 작업을 수행하는 방법에 대해 알아보겠습니다. Node.js와 Express.js를 이용해 서버를 구축하고, 클라이언트 측에서는 DxDataGrid를 설정하여 필터링, 정렬, 페이징 작업을 구현하는 예제를 살펴보겠습니다.

## 서버 설정

먼저, Node.js와 필요한 모듈을 설치합니다. SQLite를 사용하여 데이터베이스를 설정하겠습니다.

### 1. Node.js와 필요한 모듈 설치

프로젝트 디렉토리에서 다음 명령어를 실행합니다:

```bash
npm init -y
npm install express body-parser sqlite3
```

### 2. 데이터베이스와 테이블 생성

`database.js` 파일을 생성하고, SQLite 데이터베이스와 샘플 테이블을 설정합니다:

```javascript
const sqlite3 = require('sqlite3').verbose();

const db = new sqlite3.Database(':memory:'); // 메모리 내 데이터베이스 사용

db.serialize(() => {
    db.run("CREATE TABLE products (ProductID INT, ProductName TEXT, QuantityPerUnit TEXT, UnitPrice REAL, UnitsInStock INT)");

    const stmt = db.prepare("INSERT INTO products VALUES (?, ?, ?, ?, ?)");
    stmt.run(1, 'Chai', '10 boxes x 20 bags', 18, 39);
    stmt.run(2, 'Chang', '24 - 12 oz bottles', 19, 17);
    // 추가 데이터 삽입
    stmt.finalize();
});

module.exports = db;
```

### 3. 서버 코드 작성

`server.js` 파일을 생성하고 Express 서버를 설정합니다:

```javascript
const express = require('express');
const bodyParser = require('body-parser');
const db = require('./database');
const app = express();
const port = 3000;

app.use(bodyParser.json());

app.get('/api/products', (req, res) => {
    let sql = "SELECT * FROM products";
    let params = [];

    // 필터링
    if (req.query.filter) {
        const filter = JSON.parse(req.query.filter);
        if (filter.ProductName) {
            sql += " WHERE ProductName LIKE ?";
            params.push(`%${filter.ProductName}%`);
        }
    }

    // 정렬
    if (req.query.sort) {
        const [field, order] = JSON.parse(req.query.sort);
        sql += ` ORDER BY ${field} ${order === 'asc' ? 'ASC' : 'DESC'}`;
    }

    // 페이징
    const pageSize = parseInt(req.query.pageSize) || 10;
    const pageIndex = parseInt(req.query.pageIndex) || 0;
    sql += ` LIMIT ${pageSize} OFFSET ${pageIndex * pageSize}`;

    db.all(sql, params, (err, rows) => {
        if (err) {
            res.status(400).json({ "error": err.message });
            return;
        }
        res.json({
            data: rows,
            totalCount: rows.length
        });
    });
});

app.listen(port, () => {
    console.log(`Server running at http://localhost:${port}`);
});
```

### 4. 서버 실행

서버를 실행하려면 다음 명령어를 사용하세요:

```bash
node server.js
```

이제 서버가 클라이언트의 요청을 처리할 준비가 되었습니다.

## 클라이언트 설정

이제 클라이언트 측에서 DxDataGrid를 설정하는 HTML 파일을 작성합니다. 서버에서 데이터를 가져와 필터링, 정렬, 페이징 작업을 처리하도록 합니다.

### 5. 클라이언트 코드 작성

`index.html` 파일을 생성하고 다음과 같이 구성합니다:

```html
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>DxDataGrid Remote Operations Example</title>
    <link href="https://cdn3.devexpress.com/jslib/20.2.6/css/dx.light.css" rel="stylesheet">
    <script src="https://cdn3.devexpress.com/jslib/20.2.6/js/dx.all.js"></script>
</head>
<body>
    <div id="gridContainer"></div>
    <script>
        $(function() {
            $("#gridContainer").dxDataGrid({
                dataSource: {
                    load: function(loadOptions) {
                        let params = '?';

                        if (loadOptions.filter) {
                            params += `filter=${JSON.stringify(loadOptions.filter[1])}&`;
                        }
                        if (loadOptions.sort) {
                            params += `sort=${JSON.stringify([loadOptions.sort[0].selector, loadOptions.sort[0].desc ? 'desc' : 'asc'])}&`;
                        }
                        if (loadOptions.skip !== undefined) {
                            params += `pageIndex=${loadOptions.skip / loadOptions.take}&`;
                        }
                        if (loadOptions.take !== undefined) {
                            params += `pageSize=${loadOptions.take}&`;
                        }

                        return fetch('/api/products' + params)
                            .then(response => response.json())
                            .then(data => {
                                return {
                                    data: data.data,
                                    totalCount: data.totalCount
                                };
                            });
                    }
                },
                remoteOperations: {
                    sorting: true,
                    paging: true,
                    filtering: true,
                    grouping: true,
                    summary: true
                },
                columns: [
                    { dataField: "ProductID", width: 90 },
                    { dataField: "ProductName" },
                    { dataField: "QuantityPerUnit" },
                    { dataField: "UnitPrice" },
                    { dataField: "UnitsInStock" }
                ],
                filterRow: { visible: true },
                paging: {
                    pageSize: 10
                },
                pager: {
                    showPageSizeSelector: true,
                    allowedPageSizes: [10, 20, 50],
                    showInfo: true
                },
                groupPanel: { visible: true },
                summary: {
                    totalItems: [{
                        column: "UnitPrice",
                        summaryType: "sum"
                    }]
                }
            });
        });
    </script>
</body>
</html>
```

이제 이 예제를 실행하면 서버에서 데이터를 가져와 필터링, 정렬, 페이징을 처리하는 완전한 클라이언트-서버 통합 기능을 확인할 수 있습니다.

---

이 예제가 도움이 되기를 바랍니다! 질문이나 추가적인 도움이 필요하다면 언제든지 문의해주세요. 😊🚀

반응형