Server-Side Integration
dhtmlxGantt를 백엔드와 연결하는 가장 좋은 방법은 서버에 RESTful API를 설정하고 클라이언트 측에서 dataprocessor 모듈을 사용하는 것입니다.
DataProcessor는 Gantt 데이터의 변경 사항을 추적하고 필요한 형식으로 REST API에 업데이트를 전송하는 내장 기능입니다. 이를 통해 서버 사이드 플랫폼과의 통합이 간편해집니다. 객체 데이터 소스를 사용할 때, DataProcessor를 설정하여 데이터 변경에 대한 콜백을 제공할 수 있으며, 이는 데이터 바인딩에 유용합니다.
Node.js를 예시로 Gantt 차트를 생성하고 데이터를 로드하는 방법을 보여주는 동영상 튜토리얼도 준비되어 있습니다.
Technique
일반적으로 REST API를 사용하여 서버에서 데이터를 로드하려면 다음과 같은 절차가 필요합니다:
클라이언트 사이드
-
[load](api/method/load.md) 메서드를 사용하여 Gantt 데이터를 로드하세요. 이때 JSON 형식의 데이터를 반환하는 URL을 제공해야 합니다.
-
DataProcessor 인스턴스를 생성하는 방법은 두 가지가 있습니다:
- DataProcessor를 초기화하고 dhtmlxGantt 객체에 연결하기:
gantt.init("gantt_here");
gantt.load("apiUrl");
// 아래 코드의 순서를 유지하세요
const dp = new gantt.dataProcessor("apiUrl");
dp.init(gantt);
dp.setTransactionMode("REST");
dp.deleteAfterConfirmation = true;
두 번째 방법을 사용하는 것이 권장됩니다.
- 설정 옵션 객체를 전달하여 [createDataProcessor](api/method/createdataprocessor.md) 메서드를 사용하는 방법:
const dp = gantt.createDataProcessor({
url: "apiUrl",
mode: "REST",
deleteAfterConfirmation: true
});
자세한 내용은 아래 섹션에서 확인할 수 있습니다.
DataProcessor 생성하기
API 메서드 [createDataProcessor](api/method/createdataprocessor.md)를 통해 DataProcessor를 생성할 때 여러 방식으로 파라미터를 전달할 수 있습니다.
- 미리 정의된 요청 모드 중 하나를 사용하는 방법:
const dp = gantt.createDataProcessor({
url: "/api",
mode: "REST",
deleteAfterConfirmation: true
});
설명:
- url - 서버 측 엔드포인트
- mode - 서버로 데이터를 전송하는 방식: "GET" | "POST" | "REST" | "JSON" | "REST-JSON"
- deleteAfterConfirmation - 서버에서 삭제가 확인된 후에만 gantt에서 작업이 제거될지 여부를 결정합니다. 부모 작업 삭제가 확정되면 종속 링크와 하위 작업도 함께 삭제됩니다.
- 커스텀 router 객체를 제공하는 방법:
const dp = gantt.createDataProcessor(router);
- router는 함수일 수 있습니다:
// entity - "task"|"link"|"resource"|"assignment"
// action - "create"|"update"|"delete"
// data - 작업 또는 링크 데이터 객체
// id – 처리 중인 객체(작업 또는 링크)의 id
const dp = gantt.createDataProcessor((entity, action, data, id) => {
switch(action) {
case "create":
return gantt.ajax.post(
server + "/" + entity,
data
);
break;
case "update":
return gantt.ajax.put(
server + "/" + entity + "/" + id,
data
);
break;
case "delete":
return gantt.ajax.del(
server + "/" + entity + "/" + id
);
break;
}
});
- 또는 다음과 같은 구조의 객체일 수 있습니다:
const dp = gantt.createDataProcessor({
task: {
create: (data) => {},
update: (data, id) => {},
delete: (id) => {}
},
link: {
create: (data) => {},
update: (data, id) => {},
delete: (id) => {}
}
});
router 객체 내의 모든 함수는 Promise 또는 데 이터 응답 객체를 반환해야 합니다. 이를 통해 dataProcessor가 데이터베이스 id를 적용하고 onAfterUpdate 이벤트를 트리거할 수 있습니다.
const router = (entity, action, data, id) => {
return new gantt.Promise((resolve, reject) => {
// … 일부 로직
return resolve({ tid: databaseId });
});
};
이와 같은 유연성을 통해 DataProcessor를 localStorage 또는 특정 URL에 연결되지 않은 저장소, 혹은 생성 및 삭제가 서로 다른 서버에서 처리되는 경우에도 사용할 수 있습니다.
Custom data api - using local storage
요청 및 응답 세부 정보
URL 패턴은 다음과 같습니다:
- api/link/id
- api/task/id
- api/resource/id
- api/assignment/id
여기서 "api"는 dataProcessor 설정에 지정된 URL입니다.
다음은 가능한 요청 및 응답 목록입니다:
| 동작 | HTTP 메서드 | URL | 응답 |
|---|---|---|---|
| 데이터 로드 | GET | /apiUrl | JSON format |
| 작업 (Tasks) | |||
| 새 작업 추가 | POST | /apiUrl/task | ("action":"inserted","tid":"id") |
| 작업 수정 | PUT | /apiUrl/task/id | ("action":"updated") |
| 작업 삭제 | DELETE | /apiUrl/task/id | ("action":"deleted") |
| 링크 (Links) | |||
| 새 링크 추가 | POST | /apiUrl/link | ("action":"inserted","tid":"id") |
| 링크 수정 | PUT | /apiUrl/link/id | ("action":"updated") |
| 링크 삭제 | DELETE | /apiUrl/link/id | ("action":"deleted") |
| 리소스 (Resources) | |||
| 새 리소스 추가 | POST | /apiUrl/resource | ("action":"inserted","tid":"id") |
| 리소스 수정 | PUT | /apiUrl/resource/id | ("action":"updated") |
| 리소스 삭제 | DELETE | /apiUrl/resource/id | ("action":"deleted") |
| 리소스 할당 (Resource Assignments) | |||
| 새 할당 추가 | POST | /apiUrl/assignment | ("action":"inserted","tid":"id") |
| 할당 수정 | PUT | /apiUrl/assignment/id | ("action":"updated") |
| 할당 삭제 | DELETE | /apiUrl/assignment/id | ("action":"deleted") |
기본적으로 리소스와 리소스 할당은 DataProcessor 요청에 포함되지 않습니다. 이를 포함하려면 명시적으로 활성화해야 합니다. 자세한 내용은 여기에서 확인하세요.
요청 파라미터
생성(Create), 수정(Update), 삭제(Delete) 요청에는 클라이언트 측 작업 또는 링크 객체의 모든 public 속성이 포함됩니다:
작업(Task):
- start_date: 2025-04-08 00:00:00
- duration: 4
- text: Task #2.2
- parent: 3
- end_date: 2025-04-12 00:00:00
링크(Link):
- source: 1
- target: 2
- type: 0
참고:
- start_date 및 end_date의 형식은 [date_format](api/config/date_format.md) 설정에 의해 결정됩니다.
- 클라이언트는 작업 또는 링크의 모든 public 속성을 전송하므로, 요청에 추가 파라미터가 포함될 수 있습니다.
- 데이터 모델에 새로운 컬럼이나 속성을 추가하면 gantt가 이를 자동으로 백엔드로 전송합니다.
public 속성은 이름이 언더스코어(_)나 달러 기호($)로 시작하지 않는 속성을 의미합니다. 따라서 task._owner나 link.$state와 같은 속성은 백엔드로 전송되지 않습니다.
REST-JSON 모드
"POST", "GET", "REST", "JSON" 모드 외에도 Gantt DataProcessor는 "REST-JSON" 모드를 지원합니다.
gantt.load("apiUrl");
const dp = gantt.createDataProcessor({
url: "/apiUrl",
mode: "REST-JSON"
});