Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

공지사항 게시판을 만들어 보자..

...

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

...

  • primary key 가 없으면

    Status
    colourRed
    titlecreate
    , 없으면 있으면
    Status
    colourYellow
    titleupdate
    처리

...

Custom API

api Cartegory

  • id, categoryName 작성

Code Block
languagejson
[
  {
    "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}}"
      }
    ]
  }
]

...

...

status
Status
colour
Yellow
titleFront
공지사항 리스트

Info

GET {{protocol}}://{{hostname}}:{{port}}/svc/notice/list

ParamsApi Schema

...

Code Block

...

page

...

pageSize

Config

  • type : query

  • cacheable : true / cacheType : 60 → API 결과를 60초간 캐싱

Response

  • 아래와 같이 api 응답결과의 필드를 지정할수도 있고, 모든 필드를 반환할 수도 있다.

"response": [
Code Block
languagejson
{
    "fieldtypeId": "idapi",
    "typecategory": "fieldnotice",
    "valueapiId": "list",
  },   {"apiName": "공지사항 리스트",
    "fieldapiType": "titleservice",
    "typemethod": "fieldGET",
    "valueparameters": ""[
   } ]
Code Block
"response,
    "config": [
      {
        "fieldconfigId": "_all_root",
        "typetid": "allnoticeBoard",
  } ]

...

languagejson

...

     "

...

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": ""
          }
        ]
      }
    ]
  }

Status
titleFront
공지사항 조회

...

languagejson

Status
titleFront
공지사항 리스트

...

languagejson

Status
titleFront
공지사항 조회

...

ApiType

  • service : context path “svc”를 사용

Params

  • title

  • sorting

  • page

  • pageSize

Config

  • type : query → noticeBoard 에 query 검색

  • cacheable : true / cacheType : 60 → API 결과를 60초간 캐싱

Response

  • 아래와 같이 api 응답결과의 필드를 지정할수도 있고, 모든 필드를 반환할 수도 있다.

Code Block
"response": [
  {
    "field": "id",
    "type": "field",
    "value": ""
  },
  {
    "field": "title",
    "type": "field",
    "value": ""
  }
]
Code Block
"response": [
  {
    "field": "_all_",
    "type": "all"
  }
]

Api Result

Code Block
{
    "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 : 현재 페이지 번호

Code Block
{
    "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"
        }
        ...
    ]
}

...

Status
colourYellow
titleFront
공지사항 조회

Info

GET {{protocol}}://{{hostname}}:{{port}}/svc/notice/read

Api Schema

Code Block
languagejson
{
    "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

Code Block
{
    "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"
    }
}

...

Status
colourGreen
titleadmin
공지사항 리스트

Info

GET {{protocol}}://{{hostname}}:{{port}}/adm/notice/boardList

Code Block
languagejson
{
    "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하면 아래와 같다.

Code Block
{
    "result": "500",
    "resultMessage": "지원하지 않는 API Type 입니다. : admin"
}

Params

  • enable

  • title

  • sorting

  • page

  • pageSize

Config

  • type : query

  • cacheable : false → API 결과를 캐싱하지 않음. 캐시 딜레이 없이 관리자가 실시간으로 조회 처리 가능.

...

Status
colourGreen
titleadmin
공지사항 상태변경

Info

POST {{protocol}}://{{hostname}}:{{port}}/adm/notice/updateStatus

Api Schema

Code Block
languagejson
{
    "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

Code Block
{
    "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"
    }
}

...

Status
colourGreen
titleadmin
서비스 작성 이벤트 실행

Info

POST {{protocol}}://{{hostname}}:{{port}}/adm/notice/test

Api Schema

Code Block
{
  "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"
    }
  ]
}

Config

  • type : event

  • event : testEvent → 별도 이벤트 작성

NodeType Schema 에 Event 추가

Code Block
[
  {
    "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
          }
        ]
      }
    ]
  }
]

Events

  • event : 기본 event 명 (create,update,delete 등)을 제외한 유니크한 아이디로 작성

EventActions

  • actionType : service

  • actionBody : noticeboardService.test → @Service annotation name.method

Service Java 작성

Code Block
package net.ion.ice.services.commerce;

import net.ion.ice.core.api.ApiException;
import net.ion.ice.core.context.ExecuteContext;
import net.ion.ice.core.query.QueryResult;
import org.springframework.stereotype.Service;

import java.util.LinkedHashMap;
import java.util.Map;

@Service("noticeBoardService")
public class NoticeBoardService {

    public void test(ExecuteContext context) {
        Map<String, Object> params = context.getData();


        // 코딩


        //Error 처리
        if (false) {
            throw new ApiException("404", "Not Found Data");
        }

        //Response Result 세팅
        QueryResult result = new QueryResult();
        result.setResult("201");
        result.setResultMessage("서비스 성공");

        Map<String, Object> map = new LinkedHashMap<>();
        map.put("a", "1");
        map.put("b", "2");
        map.put("c", "3");

        result.setItem(map);
        result.put("apple", "사과");

        context.setResult(result);

    }
}

  • Event 에서 사용할 Service

    • @Service annotation 필수

    • event에서 직접 호출할 method 는 반드시 ExecuteContext 를 인자로 갖는다.

    • public void test(ExecuteContext context)

Api Result

Code Block
{
    "result": "201",
    "resultMessage": "서비스 성공",
    "item": {
        "a": "1",
        "b": "2",
        "c": "3"
    },
    "apple": "사과"
}
Code Block
{
    "result": "404",
    "resultMessage": "Not Found Data"
}