Ontological Studio 튜토리얼
애플리케이션20

앱에 액션 버튼 달기

온톨로지에 행위(액션)가 있으면, 대시보드 위젯과 코드 앱에 그 행위를 실행하는 버튼이 생깁니다. 버튼도 채팅과 똑같이 계획 → 승인 → 실행 → 취소를 거칩니다. 골든 퀘스천이 앱이 무엇을 보여 줄지를, 골든 커맨드가 앱이 무엇을 할 수 있을지를 정합니다.

0.1.1의 새 기능

이 장의 기능(위젯의 액션 버튼, SDK의 actions()·act())은 Ontological Studio 0.1.1부터 들어 있습니다. 0.1.0을 쓰고 있다면 릴리스 페이지에서 새로 받으세요. 화면은 시연 영상에서 가져왔습니다(밤 테마).

왜 앱에 버튼이 필요한가#

대시보드에서 늦은 선적을 발견했다면, 다음 할 일은 “그 선적을 긴급 처리”하는 것입니다. 질의·액션 탭으로 옮겨 가서 다시 말로 지시하는 대신, 보고 있는 화면에서 바로 할 수 있어야 합니다. 그렇다고 앱이 업무 시스템을 마음대로 부르면 안 됩니다. 그래서 버튼은 채팅의 계획 카드와 같은 길(액션 실행기)을 씁니다.

지켜지는 것 어떻게
앱은 업무 시스템을 직접 부르지 않는다 버튼은 액션 실행기의 계획·승인·실행만 부릅니다
정책 대상마다 판정, 거부 사유 표시
사람의 승인 승인·실행·취소는 사람이 창에서 누를 때만 일어납니다
되돌리기 같은 창에서 취소(역순 보상)

대시보드의 액션 버튼#

위젯이 보여 주는 클래스에 발행된 액션이 있으면, 위젯 머리에 「액션 N」 버튼이 붙습니다. 이 화면을 쓰는 사람의 권한으로 쓸 수 있는 액션만 보입니다.

위젯 머리에 액션 버튼이 붙은 대시보드
위젯 머리에 액션 버튼이 붙은 대시보드
  1. 발주 위젯을 협력사별 금액 막대로 두고, 협력사 S-KR-01의 막대를 누릅니다. 이 값이 대시보드의 선택이 됩니다.
  2. 「액션」 버튼을 누르면 오른쪽에 서랍이 열립니다. 발주 보류 액션과 그것을 만든 골든 커맨드가 함께 보이고, 대상 조건은 방금 고른 협력사로 채워져 있습니다. 보류 사유만 적습니다.
  3. 「계획」 — 대상마다 정책이 판정합니다. 미결인 PO-008은 허용, 이미 닫힌 PO-003은 “미결 발주만” 정책으로 거부됩니다.
  4. 「승인」 → 「실행」 — ERP가 발주를 보류하고, 서랍 옆의 막대가 곧바로 다시 그려집니다(OPEN → ON_HOLD).
  5. 「취소」 — 보상(ERP 보류 해제)이 실행되고 막대가 다시 OPEN으로 돌아옵니다.
액션 서랍 — 발주 보류 액션, 이 액션을 만든 골든 커맨드, 대상 조건(고른 막대), 입력
액션 서랍 — 발주 보류 액션, 이 액션을 만든 골든 커맨드, 대상 조건(고른 막대), 입력
계획 — PO-008 허용, PO-003 거부(미결 발주만). 사람의 승인을 기다립니다
계획 — PO-008 허용, PO-003 거부(미결 발주만). 사람의 승인을 기다립니다
승인·실행 후 — 막대가 ON_HOLD로 다시 그려졌습니다
승인·실행 후 — 막대가 ON_HOLD로 다시 그려졌습니다

코드 앱의 액션 버튼#

코드 앱을 만들 때, 에이전트의 프롬프트에는 그 온톨로지의 액션과 골든 커맨드 목록이 함께 들어갑니다. 그래서 에이전트는 어느 행에 어떤 버튼을 달지 압니다.

3일 넘게 늦어진 @Shipment 을 지연일이 큰 순으로 보여 주고, 행마다 긴급 처리 버튼을 달아 줘
행마다 「긴급 처리」 버튼이 달린 코드 앱
행마다 「긴급 처리」 버튼이 달린 코드 앱

버튼을 누르면 SDK가 띄우는 확인 창이 뜹니다. 앱 코드가 그린 창이 아니라 SDK의 창이라 어떤 앱에서도 같은 모습이고, 앱이 흉내 낼 수 없습니다. 골든 커맨드, 대상, 사유를 확인하고 계획 → 승인 → 실행합니다.

SDK 확인 창 — 액션, 대상, 정책 판정, 승인 대기
SDK 확인 창 — 액션, 대상, 정책 판정, 승인 대기
실행 결과 — WMS 우선순위 변경과 ERP 납기 독촉 두 단계가 차례로 성공. 같은 창에서 취소할 수 있습니다
실행 결과 — WMS 우선순위 변경과 ERP 납기 독촉 두 단계가 차례로 성공. 같은 창에서 취소할 수 있습니다

창을 닫으면 앱이 데이터를 다시 읽어, 그 선적의 우선순위가 “긴급”으로 바뀐 것이 보입니다.

코드로 보면#

버튼은 SDK의 act() 한 줄로 이어집니다.

import { query, actions, act } from '/apps/_runtime/og.js'

// 이 클래스에 쓸 수 있는 액션이 있을 때만 버튼을 그린다 (실행기가 꺼져 있으면 빈 배열)
const canExpedite = (await actions('Shipment')).some(a => a.action === 'expediteShipment')

async function expedite(row) {
  const out = await act({
    class: 'Shipment',
    action: 'expediteShipment',
    ids: [row.shipment_no],                 // 액션의 대상 키 값 (여러 개를 한 번에 넘겨도 됨)
    params: { reason: '생산 차질 우려' },     // 모르는 필수 입력은 빼 두면 창이 입력란을 보여 준다
  })
  if (out.executed) await load()             // 실행·취소했으면 데이터를 다시 읽는다
}
에이전트가 쓴 코드 — 버튼이 act() 한 줄로 이어져 있습니다
에이전트가 쓴 코드 — 버튼이 act() 한 줄로 이어져 있습니다
act() 인자 뜻
class, action 실행할 액션
ids 대상 키 값의 배열 (예: 선적 번호)
where ids 대신 조건으로 대상 고르기: [{prop: 'delay_days', op: '>', value: 3}]
params 입력값. 필수 입력을 빼면 창이 입력란을 보여 줍니다
돌려주는 값 창이 닫히면 { executed, cancelled, plan, run }

에이전트는 실행 경로를 시험하지 않습니다

코딩 에이전트는 질의는 직접 시험하지만, 계획·승인·실행은 시험하지 않습니다 — 실제 업무 시스템이 바뀌기 때문입니다. 액션 목록만 확인하고 버튼을 답니다. 승인 요청은 브라우저 화면에서 온 것만 받고, 에이전트의 터미널 호출은 거절됩니다.

정리 — 질문과 지시가 앱이 되기까지#

구축할 때 적은 것 만들어진 것 앱에서
골든 퀘스천 클래스·관계·속성 대시보드 위젯, 코드 앱의 질의
골든 커맨드 액션(단계·보상·정책) 위젯의 액션 버튼, 코드 앱의 act() 버튼

실습 과제

  1. 「공급망 현황판」 대시보드의 발주 위젯에서 액션 버튼으로 한 협력사의 미결 발주를 보류하고, 취소해 보세요.
  2. 코드 앱으로 “PCB 납땜 불량 클레임을 낸 고객 목록과, 행마다 조치 안내 보내기 버튼”을 만들어 보세요. 어떤 액션이 쓰이나요?
정답 보기
  1. Customer.notifyCustomer(골든 커맨드 “PCB 납땜 불량 클레임을 낸 고객에게 조치 안내를 보내 줘”). 필수 입력이 제목과 본문 두 개라, 앱이 모르면 확인 창이 입력란을 보여 줍니다. 보상은 CRM의 안내 철회입니다.
© uEngine Solutions · 문의하기 · 이 튜토리얼의 화면과 결과는 Ontological Studio 0.1에서 실제로 실행해 얻었습니다(앱의 액션 버튼은 0.1.1).