공지사항 게시판을 만들어 보자..
“ noticeBoard “
Field ID | Field Name | Value Type | Nullable | Default Value |
---|---|---|---|---|
id PK | 아이디 | long | N | |
title | 제목 | string | N | |
content | 내용 | clob | N | |
file | 첨부파일 | string | ||
enable | 사용여부 | boolean | true | |
owner FK | 등록자 | string | ||
created | 등록일 | date | ||
modifier FK | 수정자 | string | ||
changed | 수정일 | date |
Schema 작성
NodeType
[ { "typeId": "nodeType", "parentId": "root", "tid": "noticeBoard", "typeName": "게시판", "repositoryType": "node", "tableName": "", "propertyTypes": [ ] } ]
PropertyType
Primary Key
“idable” : “true”
idType
id 자동 생성 유형
idType 이 없으면 id 직접 입력
autoIncrement, UUID, hash
[ { "typeId": "nodeType", "parentId": "root", "tid": "noticeBoard", "typeName": "게시판", "repositoryType": "node", "tableName": "", "propertyTypes": [ { "pid": "id", "name": "ID", "valueType": "LONG", "idable": true, "idType": "hash", "indexable": true, "orderNo": 10 }, { "pid": "title", "name": "제목", "valueType": "STRING", "required": true, "labelable": true, "indexable": true, "analyzer": "simple", "orderNo": 2 }, { "pid": "content", "name": "내용", "valueType": "TEXT", "required": true, "indexable": false, "orderNo": 3 }, { "pid": "file", "name": "File", "valueType": "FILE", "required": false, "indexable": false, "orderNo": 4 }, { "pid": "enable", "name": "사용여부", "valueType": "BOOLEAN", "required": false, "indexable": true, "defaultValue": "true", "orderNo": 5 }, { "pid": "owner", "name": "등록자", "valueType": "REFERENCE", "indexable": true, "analyzer": "code", "referenceType": "user", "orderNo": 6 }, { "pid": "created", "name": "등록일", "valueType": "DATE", "required": false, "indexable": true, "orderNo": 7 }, { "pid": "modifier", "name": "수정자", "valueType": "REFERENCE", "indexable": true, "analyzer": "code", "referenceType": "user", "orderNo": 8 }, { "pid": "changed", "name": "수정일", "valueType": "DATE", "required": false, "indexable": true, "analyzer": "simple", "orderNo": 9 } ] } ]
loadSchema
작성한 schema 를 caching 한다.
GET {{protocol}}://{{hostname}}:{{port}}/helper/loadSchema
filePath : Absolute Path
helper/loadSchema :
helper/reloadSchema :
{{protocol}}://{{hostname}}:{{port}}/helper/loadSchema?filePath=/Users/jjong/IdeaProjects/backendcore/src/main/resources/schema/common/site
Caching 된 Schema (NodeType, PropertyType)를 조회해볼 수 있다. ( NodeController.java 참조 )
GET {{protocol}}://{{hostname}}:{{port}}/node/nodeType/noticeBoard
GET {{protocol}}://{{hostname}}:{{port}}/node/nodeType/read.json?id=noticeBoard
GET {{protocol}}://{{hostname}}:{{port}}/node/nodeType/list.json?id_matching=noticeBoard
GET {{protocol}}://{{hostname}}:{{port}}/node/propertyType/list.json?tid_matching=noticeBoard
기본 CRUD API
작성한 schema nodeType에서 기본 제공하는 crud API
GET {{protocol}}://{{hostname}}:{{port}}/node/noticeBoard/list.json
GET {{protocol}}://{{hostname}}:{{port}}/node/noticeBoard/read.json?id=100
POST {{protocol}}://{{hostname}}:{{port}}/node/noticeBoard/create.json
POST {{protocol}}://{{hostname}}:{{port}}/node/noticeBoard/update.json
primary key 필수
POST {{protocol}}://{{hostname}}:{{port}}/node/noticeBoard/delete.json
primary key 필수
POST {{protocol}}://{{hostname}}:{{port}}/node/noticeBoard/save.json
primary key 가 없으면 CREATE , 없으면 UPDATE 처리
Custom API
api Cartegory
[ { "typeId": "apiCategory", "id": "notice", "categoryName": "Notice Board API", "dateFormat": "yyyy-MM-dd HH:mm:ss", "fileUrlFormat": { "default": "{{:getEnvValue('core.cluster.api-url-prefix')}}" }, "commonParameters": [ { "parameter": "apiKey", "required": false } ], "commonResponse": [ { "field": "time", "type": "field", "value": "{{:sysdate}}" } ] } ]
Api Context
FRONT /svc/
ADMIN /adm/
FRONT 공지사항 리스트
GET {{protocol}}://{{hostname}}:{{port}}/svc/notice/list
Api Schema
{ "typeId": "api", "category": "notice", "apiId": "list", "apiName": "공지사항 리스트", "apiType": "service", "method": "GET", "parameters": [ ], "config": [ { "configId": "root", "tid": "noticeBoard", "type": "query", "allowParams": false, "orderNo": 1, "cacheable": true, "cacheTime": 60, "query": [ { "method": "matching", "field": "enable", "value": "true" }, { "method": "matching", "field": "title", "value": "{{:title}}" }, { "method": "sorting", "value": "{{:sorting}},id desc" }, { "method": "page", "value": "{{:page}}" }, { "method": "pageSize", "value": "{{:pageSize}}" } ], "response": [ { "field": "id", "type": "field", "value": "" }, { "field": "title", "type": "field", "value": "" }, { "field": "owner", "type": "field", "value": "" }, { "field": "created", "type": "field", "value": "" } ] } ] }
ApiType
service : context path “svc”를 사용
Params
title
sorting
page
pageSize
Config
type : query → noticeBoard 에 query 검색
cacheable : true / cacheType : 60 → API 결과를 60초간 캐싱
Response
아래와 같이 api 응답결과의 필드를 지정할수도 있고, 모든 필드를 반환할 수도 있다.
"response": [ { "field": "id", "type": "field", "value": "" }, { "field": "title", "type": "field", "value": "" } ]
"response": [ { "field": "_all_", "type": "all" } ]
Api Result
{ "result": "200", "resultMessage": "SUCCESS", "totalCount": 2, "totalTypeCount": 2, "resultCount": 2, "pageSize": 10, "pageCount": 1, "currentPage": 1, "items": [ { "id": 1716647245, "title": "공지합니다. (수정)", "owner": { "value": "anonymous", "label": "Anonymous User", "refId": "user::anonymous" }, "created": "2020-07-30 15:38:09" }, { "id": 429034766, "title": "ID 있으면 update, 없으면 create", "owner": { "value": "anonymous", "label": "Anonymous User", "refId": "user::anonymous" }, "created": "2020-07-30 15:40:11" } ] }
Paging
Param 으로 page, pageSize 가 들어오면 페이징 처리
Response 응답 결과에 페이징 관련 필드 함께 내려옴
totalCount : 검색된 결과 페이징 제외된 순수 카운트
totalTypeCount : noticeBoard nodeType의 데이터 노드리스트 카운트
resultCount : Response 결과 카운트
pageSize : 페이징 기준 사이즈
pageCount : 페이징 된 페이지 건수
currentPage : 현재 페이지 번호
{ "result": "200", "resultMessage": "SUCCESS", "totalCount": 38, "totalTypeCount": 489, "resultCount": 10, "pageSize": 10, "pageCount": 4, "currentPage": 1, "items": [ { "id": 1716647245, "title": "공지합니다. (수정)", "owner": { "value": "anonymous", "label": "Anonymous User", "refId": "user::anonymous" }, "created": "2020-07-30 15:38:09" } ... ] }
FRONT 공지사항 조회
GET {{protocol}}://{{hostname}}:{{port}}/svc/notice/read
Api Schema
{ "typeId": "api", "category": "notice", "apiId": "read", "apiName": "공지사항 조회", "apiType": "service", "method": "GET", "parameters": [ { "parameter": "id", "name": "ID", "valueType": "STRING", "required": true } ], "config": [ { "configId": "root", "tid": "noticeBoard", "type": "query", "resultType": "OBJECT", "allowParams": false, "orderNo": 1, "cacheable": true, "cacheTime": 60, "query": [ { "method": "matching", "field": "enable", "value": "true" }, { "method": "matching", "field": "id", "value": "{{:id}}" } ], "response": [ { "field": "_all_", "type": "all" } ] } ] }
ApiType
service : context path “svc”를 사용
Parameters
id (required)
Config
resultType : OBJECT
query list 결과 ArrayList [ ] 를 Object { } 로 반환
Api Result
{ "result": "200", "resultMessage": "SUCCESS", "item": { "id": 1716647245, "label": "공지합니다. (수정)", "title": "공지합니다. (수정)", "content": "내용내용 ", "file": "http://local.i-on.net:8080/noticeBoard/file/202007/30/143f2cdb-da84-4794-8817-2d0b2f0de994.png", "enable": true, "owner": { "value": "anonymous", "label": "Anonymous User", "refId": "user::anonymous" }, "created": "2020-07-30 15:38:09", "modifier": { "value": "anonymous", "label": "Anonymous User", "refId": "user::anonymous" }, "changed": "2020-07-30 15:38:09" } }
ADMIN 공지사항 리스트
GET {{protocol}}://{{hostname}}:{{port}}/adm/notice/boardList
{ "typeId": "api", "category": "notice", "apiId": "boardList", "apiName": "공지사항 리스트", "apiType": "admin", "method": "GET", "parameters": [ ], "config": [ { "configId": "root", "tid": "noticeBoard", "type": "query", "allowParams": false, "orderNo": 1, "cacheable": false, "query": [ { "method": "matching", "field": "enable", "value": "{{:enable}}" }, { "method": "matching", "field": "title", "value": "{{:title}}" }, { "method": "sorting", "value": "{{:sorting}},id desc" }, { "method": "page", "value": "{{:page}}" }, { "method": "pageSize", "value": "{{:pageSize}}" } ], "response": [ { "field": "id", "type": "field", "value": "" }, { "field": "title", "type": "field", "value": "" }, { "field": "title", "type": "field", "value": "" }, { "field": "owner", "type": "field", "value": "" }, { "field": "created", "type": "field", "value": "" } ] } ] }
ApiType
admin : context path “adm”을 사용
/svc/ 로 call하면 아래와 같다.
{ "result": "500", "resultMessage": "지원하지 않는 API Type 입니다. : admin" }
Params
enable
title
sorting
page
pageSize
Config
type : query
cacheable : false → API 결과를 캐싱하지 않음. 캐시 딜레이 없이 관리자가 실시간으로 조회 처리 가능.
ADMIN 공지사항 상태변경
POST {{protocol}}://{{hostname}}:{{port}}/adm/notice/updateStatus
Api Schema
{ "typeId": "api", "category": "notice", "apiId": "updateStatus", "apiName": "공지사항 상태 변경", "apiType": "admin", "method": "POST", "parameters": [ { "parameter": "id", "name": "ID", "valueType": "STRING", "required": true }, { "parameter": "enable", "name": "사용 여부", "valueType": "STRING", "required": true } ], "config": [ { "configId": "root", "tid": "noticeBoard", "type": "event", "allowParams": false, "orderNo": 1, "event": "update", "data": [ { "field": "id", "value": "{{:id}}" }, { "field": "enable", "value": "{{:enable}}" } ] } ] }
Params
id
enable
Config
type : event → noticeBoard 의 event call
event : update
data에 params 를 셋해서 update 실행
Api Result
{ "result": "200", "resultMessage": "SUCCESS", "item": { "id": "1716647245", "lable": "공지합니다. (수정)", "title": "공지합니다. (수정)", "content": "내용내용 ", "file": "http://local.i-on.net:8080/noticeBoard/file/202007/30/143f2cdb-da84-4794-8817-2d0b2f0de994.png", "enable": false, "owner": { "value": "anonymous", "label": "Anonymous User", "refId": "user::anonymous" }, "created": "2020-07-30 15:38:09", "modifier": { "value": "anonymous", "label": "Anonymous User", "refId": "user::anonymous" }, "changed": "2020-07-30 17:19:55" } }
ADMIN 서비스 작성 이벤트 실행
POST {{protocol}}://{{hostname}}:{{port}}/adm/notice/updateStatus
Api Schema
{ "typeId": "api", "category": "notice", "apiId": "test", "apiName": "서비스 작성 이벤트 실행", "apiType": "admin", "method": "POST", "parameters": [ ], "config": [ { "configId": "root", "tid": "noticeBoard", "type": "event", "allowParams": false, "orderNo": 1, "event": "testEvent" } ] }
NodeType Schema 에 Event 추가
[ { "typeId": "nodeType", "parentId": "root", "tid": "noticeBoard", "typeName": "게시판", "repositoryType": "node", "tableName": "", "propertyTypes": [ ], "events": [ { "event": "testEvent", "name": "테스트 이벤트", "noneExecute": true, "eventActions": [ { "action": "testAction", "actionName": "테스트 이벤트 작성", "actionType": "service", "actionBody": "noticeBoardService.test", "order": 1 } ] } ] } ]