- NodeType
노드타입은 컨텐츠의 entity를 나타내고 있으며, 저장소 유형, 히스토리와 같은 주요 기능에 대한 설정 기능을 제공합니다.
저장소 유형(repositoryType)
노드를 저장하기 위해서 사용하는 저장소에 따라서 저장소 유형을 지정할 수 있습니다.
Node 저장소
Node 저장소는 내부적으로 오픈소스 DataGrid인 Infinispan(http://infinispan.org/)을 이용하여 저장합니다. 설정한 노드 타입별로 Infinispan 저장소를 가지게 되며 각 노드타입은 기본적으로 파일을 이용하여 데이터를 저장하고 있으며, eviction 설정에 따라서 메모리에 적재하여 성능을 보장합니다. 또한, Infinispan에서 지원하는 Lucene기반의 Hibernate Search를 이용하여 인덱싱 및 쿼리를 지원합니다.Node 저장소와 관련된 노드타입 속성은 다음과 같습니다.
pid name valueType config description eviction Eviction INT 메모리 적재 데이터 건수 지정(기본값 10,000), 해당 노드타입의 데이터가 eviction을 초과하면 eviction 사이즈 만큼만 메모리에 적재되고 나머지는 필요시마다 파일을 저장소에서 읽어서 메모리에 적재합니다. 이때, 신규 메모리 적재를 위해서 기존 메모리에 있던 데이터 중에서 LRU 정책에 따라서 사용빈도가 낮은 데이터를 메모리에서 삭제하게 됩니다. indexGroup Index Group REFERENCE referenceType=nodeType 만약 해당 노드타입이 특정 Group 노드타입에 소속인 경우에 group 노드타입의 아이디를 설정해야 합니다. Group 유형
Group 저장소 유형은 저장소 유형이 Node인 다수의 노드 타입의 검색이나 참조를 위해서 대표 노드 타입을 이용하여 인덱싱 및 쿼리를 제공합니다. 이때, Group에 속한 개별 노드타입은 indexGroup에 해당 Group 노드 타입을 지정하여야 합니다.
Data 저장소
Data 저장소는 노드타입 스키마-SQL 매핑을 통하여 DB에 저장하며 현재는 MySQL, Maria, MS-SQL, Oracle을 지원합니다.Data 저장소를 이용하기 위해서는 다음과 같이 datasource와 tableName을 정의해야 합니다. 그러면, ICE에서는 데이터 저장시에 DB 테이블 스키마를 조회하여 CRUD 쿼리를 자동 생성하고 실행하게 됩니다. Node 저장소를 사용하는 경우에 datasource와 tableName를 정의하면
pid name valueType config description datasource Datasource REFERENCE referenceType=datasource 데이터를 저장하기 위한 DB 커넥션 정보를 정의하는 datasource 노드타입을 지정합니다. tableName Table Name STRING datasource로 지정된 DB에 해당 노드타입과 연관된 테이블 명을 저장합니다 Logic 유형
repositoryType을 logic으로 설정하고, serviceName을 SpringBoot 기반으로 LogicRepository를 implement하도록 개발된 서비스 명칭으로 설정하면 기본적인 CRUD 및 list API 호출시에 해당 서비스를 호출하여 처리합니다.LogicRepository 인터페이스는 다음과 같습니다.
Code Block language java title LogicRepository collapse true package net.ion.ice.core.logic; import net.ion.ice.core.context.QueryContext; import net.ion.ice.core.node.Node; import java.util.List; import java.util.Map; public interface LogicRepository { List<Map<String, Object>> list(QueryContext context); Map<String, Object> read(String id); int create(Node node); int update(Node node); int delete(String id); }
ServiceGroup
해당 노드타입이 제공하는 microservice를 지정합니다.
History 제공 (historyable)
특정 노드타입의 히스토리 관리 기능을 제공하고 싶은 경우 historyable 속성을 true로 설정하여야 합니다.
히스토리 저장
히스토리 제공 노드타입(historyable=true)의 노드에 event가 발생하여 데이터가 변경되면 신규 히스토리 버전이 생성 및 저장됩니다. 각 히스토리는 다음과 같은 항목으로 이루어져 있습니다
- historyId : 히스토리 ID 값 - 해당 노드의 ID + _ + 버전 으로 구성
- id : 노드의 아이디
- event : 데이터 변경이 발생한 이벤트
- triggerEvent : 다른 이벤트 실행 과정에서 해당 이벤트를 발생시킨경우에 이전 이벤트를 표시
- version : 해당 히스토리 버전
- modifier : 해당 히스토리 발생 유저
- changed : 해당 히스토리 생성 일시
- changes : 변경 내역
- properties : 해당 버전의 데이터
히스토리 조회
생성된 히스토리를 조회하기 위해서는 다음과 같은 형식의 API를 호출해야 합니다. /adm/{{:typeId}}/history?id={{:id}}이렇게 호출된 API 결과는 다음과 같습니다.
Code Block language js title history sample collapse true "items": [ { "historyId": "test2_4", "id": "test2", "event": "update", "triggerEvent": "rollback", "version": 4, "modifier": "system", "changed": "20180724184414", "changes": { "categoryName": { "en": "Test2" }, "created": "2018-07-24T09:44:14.000+0000", "changed": "2018-07-24T09:44:14.000+0000", "testPt": "test" }, "properties": { "created": "2018-07-24T09:44:14.000+0000", "changed": "2018-07-24T09:44:14.000+0000", "categoryName": { "en": "Test2-1" }, "testPt": "test2", "parentCategory": "test1", "categoryId": "test2", "orderNo": null, "categoryType": "content", "itemViews": null, "owner": "system", "authority": "system" } }, { "historyId": "test2_3", "id": "test2", "event": "update", "triggerEvent": null, "version": 3, "modifier": "system", "changed": "20180724184433", "changes": { "categoryName": { "en": "Test2-1" }, "testPt": "test2" }, "properties": { "categoryName": { "en": "Test2-1" }, "testPt": "test2", "parentCategory": "test1", "categoryId": "test2", "orderNo": null, "categoryType": "content", "itemViews": null, "created": "2018-07-24T09:44:14.000+0000", "owner": "system", "changed": "2018-07-24T09:44:14.000+0000", "authority": "system" } }, { "historyId": "test2_2", "id": "test2", "event": "update", "triggerEvent": null, "version": 2, "modifier": "system", "changed": "20180724184426", "changes": { "testPt": "test" }, "properties": { "testPt": "test", "parentCategory": "test1", "categoryName": { "en": "Test2" }, "categoryId": "test2", "orderNo": null, "categoryType": "content", "itemViews": null, "created": "2018-07-24T09:44:14.000+0000", "owner": "system", "changed": "2018-07-24T09:44:14.000+0000", "authority": "system" } }, { "historyId": "test2_1", "id": "test2", "event": "create", "triggerEvent": null, "version": 1, "modifier": "system", "changed": "20180724184414", "changes": { "parentCategory": "test1", "categoryName": { "en": "Test2" }, "categoryId": "test2", "orderNo": null, "categoryType": "content", "itemViews": null, "created": "2018-07-24T09:44:14.000+0000", "owner": "system", "changed": "2018-07-24T09:44:14.000+0000", "authority": "system" }, "properties": { "parentCategory": "test1", "categoryName": { "en": "Test2" }, "categoryId": "test2", "orderNo": null, "categoryType": "content", "itemViews": null, "created": "2018-07-24T09:44:14.000+0000", "owner": "system", "changed": "2018-07-24T09:44:14.000+0000", "authority": "system" } } ]
히스토리 롤백
과거 히스토리 버전으로의 롤백은 다음과 같은 형식의 API를 호출하면 됩니다. /adm/{{:typeId}}/rollback?id={{:id}}&version={{:version}}
PropertyType
Event
API
Schedule
Page Comparison
General
Content
Integrations