TL DR;
- 방통대 학습 커뮤니티의 ‘1주5강 챌린지’를 Slack 워크플로우로 자동화하여 주간 목표 등록·일간 인증 과정을 간소화함.
- 서버나 코드 없이 슬랙 내에서 완결되도록 설계해 운영 부담을 크게 줄였음.
- 다만 연산·분기처리·데이터 가공 불가능등의 구조적 한계로 자동화 도구보다는 운영 보조도구에 적합
무엇을 자동화하고자 하였나
방통대 컴퓨터과학과 과정 중 참여한 커뮤니티에서 ‘1주5강 챌린지’라는 활동을 진행했다. 매주 수강 목표를 세우고, 매일 강의를 듣고 인증하는 방식으로 학습 습관을 유지하는 프로그램이다.
학기 대부분 과정이 온라인으로 진행되는 방통대 특성상, 다른일에 밀려 강의를 안듣거나/몰아듣게 되는데 매일 평소에 꾸준히 강의를 들어두는것이 학습에도/시험대비에도 유용하였었다.
- 주간 목표 등록
- 일간 목표 인증


25년도 2학기부터 운영을 인계받아, week5ver라는 이름으로 해당 활동을 이어가고 있다. week5ver 모집글
기존에는 수강 계획 등록 / 실제 인증 / 인증 확인 모두 수작업으로 이루어졌기에 사용자 입장에서도 다소 번거로운것이 있었고, 운영 측면에서도 부담이 클 것 같아 이를 개선하기 위해 Slack 워크플로우 기반 자동화 시스템을 구축했다.
다음 정도의 기능을 가진 간소한 자동화 파이프를 구축이 목표
- 주간 목표 등록
- 매주 토요일 트리거 및 2일 간 유효
- 5개의 수강 목표를 입력받아서 어딘가에 저장
- 등록 내역을 채널에 공유
- 일간 목표 인증
- 매일 트리거
- 각 수강목표에 대해 인증자료 및 코멘트를 받아 상태 업데이트
- 인증 내역을 채널에 공유
왜 슬랙 앱 대신 워크플로우를 사용하였나
Slack App을 직접 구현하면 자유도는 높지만, 서버 실행 환경·토큰 관리·Event API 연결 등 인프라 부담이 따른다.
반면 Slack Workflow는 슬랙 내부에서 작동하는 내장형 자동화 기능으로, 별도 서버나 외부 API 없이 실행된다.
- 유지보수가 간단하고
- 워크스페이스 내에서 완결적으로 작동하며
- 유료 플랜을 사용 중이라 추가비용이 없음
이러한 슬랙 자동화 구성에 있어 일반적인 사례는 Slack Bolt Framework나 SDK를 사용하여 Slack App 을 구성하고 Slack API를 통해 요청을 전달받아 데이터를 조회하고 가공하고 저장하여 쓰는것이다.
Slack App의 장점은 SDK를 사용해 높은 자유도와 원하는 기능을 구성할 수 있지만, 단점은 결국 해당 코드가 프로세스로 동작해야, 다시말해 서버로 가동되어야 작동된다는 점이다. 그 과정에서 앱의 기능(목적)외에 고려해야할게 많아진다.(=복잡해진다)

우리가 자동화 할 대상인 Slack workspace(or server, 우측)에 대해 사용자가 개발한 Slack App(좌측)이 동작하는 방식을 간단히 나타내면 위와 같다. 슬랙 서버에서 /등록 과 같은 슬래시 커맨드나, 기타 다른 방법으로 이벤트를 생성하면 슬랙 앱이 해당 이벤트를 수신하고 결과를 돌려줘야한다. 서버에 대해 슬랙앱은 Event API를 통해 상호작용한다. 앱에 퍼블릭 엔드포인트를 뚫고 서버와 HTTP 방식으로 통신하거나, 앱에 xapp 인증토큰을 설정하고 해당 토큰 기반으로 서버와 socket 기반 방식으로 통신할 수 있다. 어느 방식이든 우리 앱이 슬랙 서버와 어떻게 통신할지 고민 및 설정이 필요하다.

서버 동작 환경 측면에서도.. 결국 앱이 살아서 응답받을 환경이 필요하다. 집 PC를 끄지않고 계속 켜놓거나 아님 AWS등 클라우드 서비스에서 EC2같은 컴퓨팅 환경에 앱을 구동하던지, 또는 Serverless로 요청시마다 서버를 띄우고 응답하고 내려가게 구현 할 수 있다. 일반적인 사례로는 Serverless 구조로 요청시 동작하는걸 권하긴 하는데.. coldstart등 초기 응답 지연 이슈도 걱정되고 (어려운 기능이 아닌데 바로바로 응답해야지) 결국 이 자동화에 대해 돈을 쓸껀가? 질문에 대해서 돈까지 쓰고싶진 않다는 생각이다.
이에 반해 Slack Workflow는 Slack Server에 내장되어있는 자체 자동화 도구이다. 코딩 작업 없이 간단히 UI 버튼으로 자동화를 생성 및 수정할 수 있으며 요청을 받아 처리할 앱 서버가 살아있는지 죽어있는지, 어떤 토큰을 사용 중이고 적절하게 접근할 수 있는지 등을 고려하지 않아도 되어 사용이 간편하다.
또한 워크플로는 무료플랜에서는 안되고 유료플랜에서만 가능하기에.. 구독비 냈으니까 비용 최대한 써먹고 싶은 생각도 있고, 간단한 서비스이기 때문에 굳이 구글 스프레드시트나 외부 도구도 엮지 않고 단순히 슬랙내에서 컨텍스트 전환 없이 완전히 시작되고 종결되는 구조를 원했다.
구성요소 소개
슬랙 워크플로우

워크플로 빌더는 Slack에서 일상 작업과 프로세스를 자동화하는 데 도움이 됩니다. 워크플로는 원하는 만큼 간단하거나 복잡해질 수 있으며, 작업을 수행하는 데 사용하는 다른 앱에 연결할 수도 있습니다.
Slack Workflow Builder Guide
- 슬랙 워크플로우: 사용자가 입력·응답·업로드 등을 자동화된 단계(폼, 버튼, 메시지 등)로 수행하게 만드는 슬랙 내 자동 실행 시나리오.
슬랙 리스트

리스트는 Slack에서 이루어지는 업무를 정리하고 협업하는 데 도움이 되며, 리스트를 사용하여 작업 관리, 프로젝트 작업 추적 등을 할 수 있습니다. 처음부터 리스트를 새로 만들거나 사용자 지정 가능한 템플릿을 선택하여 시작한 다음에 작업을 추가하고 리스트 항목에서 직접 다른 사람들과 협업하세요.
Slack에서 리스트 사용
- 슬랙 리스트: 워크플로우나 수동 입력을 통해 생성된 항목(예: 목표, 할 일, 인증 내역 등)을 슬랙 내에서 테이블처럼 관리·업데이트할 수 있는 목록 기능.
구축 과정
일반적인 워크플로 등록 및 기능에 대한 설명은 생략, 구체적으로 어떻게 설정되어있는지 보고자 한다.
주간 목표 등록

- 특정 시점에 채널에 메세지를 보내고, 버튼을 통해 양식 작성을 요청 한 뒤, 입력데이터를 리스트에 개별 레코드로 등록한 뒤, 원본 메세지의 댓글로 결과를 반환한다
- 1. 메세지보내기 단계에서 버튼의 만료기간을 설정 가능
- 2. 양식에서 정보 수집 단계에서 입력 양식외에 사용자명 등 수집
- 3~7. 입력값외에 리스트의 다른 필드값을 사전 지정 가능
- 8. 변수삽입을 통해 워크플로우 내 일부값 재사용 가능
week5ver-weekly-goals-collector.json
- workflow는 json으로 내보내기도 가능
{
"workflow": {
"id": "Wf09JEN6EPRR",
"title": "week5ver-weekly-goals-collector",
"description": "week5ver 주간 목표 수집기",
"icon": "https://avatars.slack-edge.com/2025-10-04/9638442501604_827151bda5f454d4eae1_192.png",
"input_parameters": {
"Ft09JQLRHW6Q__event_timestamp": {
"type": "slack#/types/timestamp",
"name": "Ft09JQLRHW6Q__event_timestamp",
"description": "Time when workflow started",
"title": "워크플로가 시작된 시간"
}
},
"steps": [
{
"id": "020dc9de-fa7e-44d1-a9df-c0313b80905f",
"function_id": "Fn0102",
"inputs": {
"message": {
"hidden": false,
"locked": false,
"value": [
{
"type": "rich_text",
"elements": [
{
"type": "rich_text_section",
"elements": [
{
"name": "calendar",
"type": "emoji",
"unicode": "1f4c6"
},
{
"text": " ",
"type": "text"
},
{
"id": "{time.format(seconds={{inputs.Ft09JQLRHW6Q__event_timestamp}}, timezone=Asia/Seoul, format='Y-m-d')}",
"type": "workflowtoken",
"property": "",
"data_type": "string"
},
{
"text": " 에 시작되는 demo2 주간 목표 등록\n---\n",
"type": "text"
},
{
"name": "pushpin",
"type": "emoji",
"style": {
"bold": true
},
"unicode": "1f4cc"
},
{
"text": " 타임라인",
"type": "text",
"style": {
"bold": true
}
},
{
"text": "\n",
"type": "text"
}
]
},
{
"type": "rich_text_list",
"style": "bullet",
"border": 0,
"indent": 0,
"elements": [
{
"type": "rich_text_section",
"elements": [
{
"name": "hammer",
"type": "emoji",
"unicode": "1f528"
},
{
"text": " 251004 - demo",
"type": "text"
}
]
},
{
"type": "rich_text_section",
"elements": [
{
"name": "hammer",
"type": "emoji",
"unicode": "1f528"
},
{
"text": " 251011~12 - demo2 > 1013~1019 목표등록",
"type": "text"
}
]
},
{
"type": "rich_text_section",
"elements": [
{
"name": "seedling",
"type": "emoji",
"unicode": "1f331"
},
{
"text": " 251018~19 - 1주차 > 1020~1026 목표등록",
"type": "text"
}
]
},
{
"type": "rich_text_section",
"elements": [
{
"name": "herb",
"type": "emoji",
"unicode": "1f33f"
},
{
"text": " 251025~26 - 2주차 > 1027~1102 목표등록",
"type": "text"
}
]
},
{
"type": "rich_text_section",
"elements": [
{
"name": "potted_plant",
"type": "emoji",
"unicode": "1fab4"
},
{
"text": " 251101~02 - 3주차 > 1103~1109 목표등록",
"type": "text"
}
]
},
{
"type": "rich_text_section",
"elements": [
{
"name": "evergreen_tree",
"type": "emoji",
"unicode": "1f332"
},
{
"text": " 251108~09 - 4주차 > 1110~1116 목표등록",
"type": "text"
}
]
},
{
"type": "rich_text_section",
"elements": [
{
"name": "fire",
"type": "emoji",
"unicode": "1f525"
},
{
"text": " 251115~16 - 5주차 > 1117~1123 목표등록",
"type": "text"
}
]
},
{
"type": "rich_text_section",
"elements": [
{
"name": "trophy",
"type": "emoji",
"unicode": "1f3c6"
},
{
"text": " 251122~23 - 6주차 > 1124~1130 목표등록",
"type": "text"
}
]
}
]
},
{
"type": "rich_text_section",
"elements": [
{
"text": "---",
"type": "text"
}
]
}
]
}
]
},
"channel_id": {
"hidden": false,
"locked": false,
"value": "C08NK8YCYDN"
},
"interactive_blocks": {
"hidden": false,
"locked": false,
"value": [
{
"type": "actions",
"elements": [
{
"text": {
"text": "주간 목표 등록",
"type": "plain_text",
"emoji": true
},
"type": "button",
"style": "primary",
"value": "button",
"action_id": "91e1d5ac-7f6b-4c7d-b593-74350ef7e403"
}
]
}
]
},
"interactivity_configuration": {
"hidden": false,
"locked": false,
"value": {
"actions": {
"91e1d5ac-7f6b-4c7d-b593-74350ef7e403": {
"is_button_multi_click": true,
"is_mutually_exclusive": false
}
}
}
}
}
},
{
"id": "40d2a231-f0a4-459c-addb-6ae8bcd49d4a",
"function_id": "Fn010N",
"inputs": {
"title": {
"hidden": false,
"locked": false,
"value": "다음주 수강 목표를 입력해주세요"
},
"fields": {
"hidden": false,
"locked": false,
"value": {
"elements": [
{
"name": "e6588714-18e0-4fa8-974b-4d817d4a052a",
"type": "string",
"title": "수강 예정 강의 입력 (1/5)",
"description": "자유롭게 입력해주시면 됩니다"
},
{
"name": "cd247591-ac4e-41fc-a3e9-449beb8b922b",
"type": "slack#/types/date",
"title": "수강예정일-목표1",
"description": "수강예정일"
},
{
"name": "66d2b2b8-b64c-40d5-a306-1b0e8cce49dd",
"type": "string",
"title": "수강 예정 강의 입력 (2/5)",
"description": "자유롭게 입력해주시면 됩니다"
},
{
"name": "d0d4161d-21e8-4688-89e3-255ef7bb0ee6",
"type": "slack#/types/date",
"title": "수강예정일-목표2",
"description": "수강예정일"
},
{
"name": "d88eeb27-d183-46b3-9455-f20addb96aaa",
"type": "string",
"title": "수강 예정 강의 입력 (3/5)",
"description": "자유롭게 입력해주시면 됩니다"
},
{
"name": "7379859d-5833-4c92-b99b-53b949613b7c",
"type": "slack#/types/date",
"title": "수강예정일-목표3",
"description": ""
},
{
"name": "9c1d4135-c98d-4d32-afe9-f4ebdef35f75",
"type": "string",
"title": "수강 예정 강의 입력 (4/5)",
"description": "자유롭게 입력해주시면 됩니다"
},
{
"name": "ee980644-5f4c-4305-bca5-f6656179948a",
"type": "slack#/types/date",
"title": "수강예정일-목표4",
"description": "수강예정일-목표"
},
{
"name": "41831359-1216-4b51-8047-69043d990060",
"type": "string",
"title": "수강 예정 강의 입력 (5/5)",
"description": "자유롭게 입력해주시면 됩니다"
},
{
"name": "1b631168-f84c-4fa2-893b-d4275e5172e7",
"type": "slack#/types/date",
"title": "수강예정일-목표5",
"description": ""
}
],
"required": []
}
},
"interactivity": {
"hidden": false,
"locked": false,
"value": "{{steps.020dc9de-fa7e-44d1-a9df-c0313b80905f.interactivity}}"
}
}
},
{
"id": "de912e2e-dfe9-408f-b2dc-e6129cca063c",
"function_id": "Fn0133",
"inputs": {
"columns": {
"hidden": false,
"locked": false,
"value": {
"name": "{{steps.40d2a231-f0a4-459c-addb-6ae8bcd49d4a.fields.e6588714-18e0-4fa8-974b-4d817d4a052a}}",
"Col09KD64QHLK": [
"OptCLC1YAKY"
],
"todo_assignee": "{{steps.40d2a231-f0a4-459c-addb-6ae8bcd49d4a.submit_user}}",
"todo_due_date": "{{steps.40d2a231-f0a4-459c-addb-6ae8bcd49d4a.fields.cd247591-ac4e-41fc-a3e9-449beb8b922b}}",
"todo_completed": false,
"assignee_access_key": "edit"
}
},
"list_id": {
"hidden": false,
"locked": false,
"value": "F09JHMP3JLD"
}
}
},
{
"id": "37b6d1ff-3007-4524-b432-3dd1a33ed9a7",
"function_id": "Fn0133",
"inputs": {
"columns": {
"hidden": false,
"locked": false,
"value": {
"name": "{{steps.40d2a231-f0a4-459c-addb-6ae8bcd49d4a.fields.66d2b2b8-b64c-40d5-a306-1b0e8cce49dd}}",
"Col09KD64QHLK": [
"OptCLC1YAKY"
],
"todo_assignee": "{{steps.40d2a231-f0a4-459c-addb-6ae8bcd49d4a.submit_user}}",
"todo_due_date": "{{steps.40d2a231-f0a4-459c-addb-6ae8bcd49d4a.fields.d0d4161d-21e8-4688-89e3-255ef7bb0ee6}}",
"todo_completed": false,
"assignee_access_key": "edit"
}
},
"list_id": {
"hidden": false,
"locked": false,
"value": "F09JHMP3JLD"
}
}
},
{
"id": "efaf4b5c-7d03-4dd9-a468-41a378aebed0",
"function_id": "Fn0133",
"inputs": {
"columns": {
"hidden": false,
"locked": false,
"value": {
"name": "{{steps.40d2a231-f0a4-459c-addb-6ae8bcd49d4a.fields.d88eeb27-d183-46b3-9455-f20addb96aaa}}",
"Col09KD64QHLK": [
"OptCLC1YAKY"
],
"todo_assignee": "{{steps.40d2a231-f0a4-459c-addb-6ae8bcd49d4a.submit_user}}",
"todo_due_date": "{{steps.40d2a231-f0a4-459c-addb-6ae8bcd49d4a.fields.7379859d-5833-4c92-b99b-53b949613b7c}}",
"todo_completed": false,
"assignee_access_key": "edit"
}
},
"list_id": {
"hidden": false,
"locked": false,
"value": "F09JHMP3JLD"
}
}
},
{
"id": "a574bd3d-1d95-4f4d-a59d-356bd0bfe298",
"function_id": "Fn0133",
"inputs": {
"columns": {
"hidden": false,
"locked": false,
"value": {
"name": "{{steps.40d2a231-f0a4-459c-addb-6ae8bcd49d4a.fields.9c1d4135-c98d-4d32-afe9-f4ebdef35f75}}",
"Col09KD64QHLK": [
"OptCLC1YAKY"
],
"todo_assignee": "{{steps.40d2a231-f0a4-459c-addb-6ae8bcd49d4a.submit_user}}",
"todo_due_date": "{{steps.40d2a231-f0a4-459c-addb-6ae8bcd49d4a.fields.ee980644-5f4c-4305-bca5-f6656179948a}}",
"todo_completed": false,
"assignee_access_key": "edit"
}
},
"list_id": {
"hidden": false,
"locked": false,
"value": "F09JHMP3JLD"
}
}
},
{
"id": "ebcbdf74-a34c-41ed-be89-340b937ef256",
"function_id": "Fn0133",
"inputs": {
"columns": {
"hidden": false,
"locked": false,
"value": {
"name": "{{steps.40d2a231-f0a4-459c-addb-6ae8bcd49d4a.fields.41831359-1216-4b51-8047-69043d990060}}",
"Col09KD64QHLK": [
"OptCLC1YAKY"
],
"todo_assignee": "{{steps.40d2a231-f0a4-459c-addb-6ae8bcd49d4a.submit_user}}",
"todo_due_date": "{{steps.40d2a231-f0a4-459c-addb-6ae8bcd49d4a.fields.1b631168-f84c-4fa2-893b-d4275e5172e7}}",
"todo_completed": false,
"assignee_access_key": "edit"
}
},
"list_id": {
"hidden": false,
"locked": false,
"value": "F09JHMP3JLD"
}
}
},
{
"id": "e2c8ac7a-e21d-4bdb-9bcc-6c0f29be2e8e",
"function_id": "Fn010P",
"inputs": {
"message": {
"hidden": false,
"locked": false,
"value": [
{
"type": "rich_text",
"elements": [
{
"type": "rich_text_section",
"elements": [
{
"name": "rocket",
"type": "emoji",
"unicode": "1f680"
},
{
"text": " ",
"type": "text"
},
{
"id": "{{steps.40d2a231-f0a4-459c-addb-6ae8bcd49d4a.submit_user}}",
"type": "workflowtoken",
"property": "",
"data_type": "slack#/types/user_id"
},
{
"text": " 님이 다음의 주간 목표를 입력했습니다\n---\n",
"type": "text"
},
{
"name": "dart",
"type": "emoji",
"unicode": "1f3af"
},
{
"text": " ",
"type": "text"
},
{
"text": "주간 수강 목표",
"type": "text",
"style": {
"bold": true
}
},
{
"text": "\n\n",
"type": "text"
},
{
"name": "one",
"type": "emoji",
"style": {
"bold": true
},
"unicode": "0031-fe0f-20e3"
},
{
"text": "첫번째 수강 목표",
"type": "text",
"style": {
"bold": true
}
},
{
"text": "\n",
"type": "text"
},
{
"id": "{{steps.40d2a231-f0a4-459c-addb-6ae8bcd49d4a.fields.e6588714-18e0-4fa8-974b-4d817d4a052a}}",
"type": "workflowtoken",
"property": "",
"data_type": "string"
},
{
"text": " / ",
"type": "text"
},
{
"id": "{{steps.40d2a231-f0a4-459c-addb-6ae8bcd49d4a.fields.cd247591-ac4e-41fc-a3e9-449beb8b922b}}",
"type": "workflowtoken",
"property": "",
"data_type": "slack#/types/date"
},
{
"text": "\n\n",
"type": "text"
},
{
"name": "two",
"type": "emoji",
"style": {
"bold": true
},
"unicode": "0032-fe0f-20e3"
},
{
"text": "두번째 수강 목표",
"type": "text",
"style": {
"bold": true
}
},
{
"text": "\n",
"type": "text"
},
{
"id": "{{steps.40d2a231-f0a4-459c-addb-6ae8bcd49d4a.fields.66d2b2b8-b64c-40d5-a306-1b0e8cce49dd}}",
"type": "workflowtoken",
"property": "",
"data_type": "string"
},
{
"text": " / ",
"type": "text"
},
{
"id": "{{steps.40d2a231-f0a4-459c-addb-6ae8bcd49d4a.fields.d0d4161d-21e8-4688-89e3-255ef7bb0ee6}}",
"type": "workflowtoken",
"property": "",
"data_type": "slack#/types/date"
},
{
"text": "\n\n",
"type": "text"
},
{
"name": "three",
"type": "emoji",
"style": {
"bold": true
},
"unicode": "0033-fe0f-20e3"
},
{
"text": "세번째 수강 목표",
"type": "text",
"style": {
"bold": true
}
},
{
"text": "\n",
"type": "text"
},
{
"id": "{{steps.40d2a231-f0a4-459c-addb-6ae8bcd49d4a.fields.d88eeb27-d183-46b3-9455-f20addb96aaa}}",
"type": "workflowtoken",
"property": "",
"data_type": "string"
},
{
"text": " / ",
"type": "text"
},
{
"id": "{{steps.40d2a231-f0a4-459c-addb-6ae8bcd49d4a.fields.7379859d-5833-4c92-b99b-53b949613b7c}}",
"type": "workflowtoken",
"property": "",
"data_type": "slack#/types/date"
},
{
"text": "\n\n",
"type": "text"
},
{
"name": "four",
"type": "emoji",
"style": {
"bold": true
},
"unicode": "0034-fe0f-20e3"
},
{
"text": "네번째 수강 목표",
"type": "text",
"style": {
"bold": true
}
},
{
"text": "\n",
"type": "text"
},
{
"id": "{{steps.40d2a231-f0a4-459c-addb-6ae8bcd49d4a.fields.9c1d4135-c98d-4d32-afe9-f4ebdef35f75}}",
"type": "workflowtoken",
"property": "",
"data_type": "string"
},
{
"text": " / ",
"type": "text"
},
{
"id": "{{steps.40d2a231-f0a4-459c-addb-6ae8bcd49d4a.fields.ee980644-5f4c-4305-bca5-f6656179948a}}",
"type": "workflowtoken",
"property": "",
"data_type": "slack#/types/date"
},
{
"text": "\n\n",
"type": "text"
},
{
"name": "five",
"type": "emoji",
"style": {
"bold": true
},
"unicode": "0035-fe0f-20e3"
},
{
"text": "다섯번째 수강 목표",
"type": "text",
"style": {
"bold": true
}
},
{
"text": "\n",
"type": "text"
},
{
"id": "{{steps.40d2a231-f0a4-459c-addb-6ae8bcd49d4a.fields.41831359-1216-4b51-8047-69043d990060}}",
"type": "workflowtoken",
"property": "",
"data_type": "string"
},
{
"text": " / ",
"type": "text"
},
{
"id": "{{steps.40d2a231-f0a4-459c-addb-6ae8bcd49d4a.fields.1b631168-f84c-4fa2-893b-d4275e5172e7}}",
"type": "workflowtoken",
"property": "",
"data_type": "slack#/types/date"
},
{
"text": "\n\n",
"type": "text"
},
{
"name": "jigsaw",
"type": "emoji",
"unicode": "1f9e9"
},
{
"text": " 매일 한 조각씩, 이번 주 그림을 완성합시다.",
"type": "text"
}
]
}
]
}
]
},
"message_context": {
"hidden": false,
"locked": false,
"value": "{{steps.020dc9de-fa7e-44d1-a9df-c0313b80905f.message_context}}"
},
"reply_broadcast": {
"hidden": false,
"locked": false,
"value": "false"
}
}
},
{
"id": "1879a93e-918b-46fb-8d97-8eeddc1eafcc",
"function_id": "Fn013B",
"inputs": {
"list_id": {
"hidden": false,
"locked": false,
"value": "F09JHMP3JLD"
},
"filter_by": {
"hidden": false,
"locked": false,
"value": "filter_by_list_columns"
},
"filter_condition": {
"hidden": false,
"locked": false,
"value": {
"name": "주간등록체크",
"Col09KD64QHLK": [
"OptCLC1YAKY"
],
"todo_assignee": "{utils.echo(input={{steps.40d2a231-f0a4-459c-addb-6ae8bcd49d4a.submit_user}})}",
"todo_completed": false
}
}
}
},
{
"id": "6cefaee1-91b3-47ad-8cf7-ec000c535f55",
"function_id": "Fn013E",
"inputs": {
"list_id": {
"hidden": false,
"locked": false,
"value": "F09JHMP3JLD"
},
"record_id": {
"hidden": false,
"locked": false,
"value": "{{steps.1879a93e-918b-46fb-8d97-8eeddc1eafcc.record_id}}"
},
"updated_columns": {
"hidden": false,
"locked": false,
"value": {
"todo_completed": true
}
}
}
}
]
},
"triggers": [
{
"name": "week5ver-weekly-goals-collector",
"type": "scheduled",
"inputs": {
"Ft09JQLRHW6Q__event_timestamp": {
"value": "{{event_timestamp}}",
"locked": false,
"hidden": false
}
},
"schedule": {
"start_time": "2025-10-11T15:00:00+0000",
"timezone": "Asia/Seoul",
"frequency": {
"type": "weekly",
"on_days": [
"Saturday"
]
}
}
}
]
}
일간 목표 인증

- 매일 채널에 공유된 메세지를 통해 개인메세지로 한번 더 발송, 개인메세지 버튼을 통해 정보 수집 후 해당하는 리스트 항목을 찾고, 사용자 입력값을 받아 업데이트 후 결과 채널 공유
- 3. 사용자에게 메세지 부분은 없어도 될것같은데 워크플로우상 누락불가
- 4. 리스트항목 업데이트.. 요부분이 어려운데 결국 하나의 항목ID(item ID)를 찾아와야함
- 2. 리스트 선택에서 적절한 값으로 필터링, 대상 여러개면 하나만 선택됨
- 4. 리스트에서 항목을 가져올때 1개만 가져올 수 있음, 이때 2에서 선택한 항목 ID 필요. 이는 항목 URL의 끝에서도 확인할 수 있음
week5ver-daily-goals-updator.json
{
"workflow": {
"id": "Wf09K1A8CSNM",
"title": "week5ver-daily-goal-updater",
"description": "week5ver 일간목표 업데이트기",
"icon": "https://avatars.slack-edge.com/2025-10-04/9663144426672_759193706ee0dbcfe206_192.png",
"input_parameters": {
"Ft09KGLVDZ6C__event_timestamp": {
"type": "slack#/types/timestamp",
"name": "Ft09KGLVDZ6C__event_timestamp",
"description": "Time when workflow started",
"title": "워크플로가 시작된 시간"
}
},
"steps": [
{
"id": "3a636b5b-50e6-414c-90be-462961a53a15",
"function_id": "Fn0102",
"inputs": {
"message": {
"hidden": false,
"locked": false,
"value": [
{
"type": "rich_text",
"elements": [
{
"type": "rich_text_section",
"elements": [
{
"name": "runner",
"type": "emoji",
"style": {
"bold": true
},
"unicode": "1f3c3"
},
{
"id": "{time.format(seconds={{inputs.Ft09KGLVDZ6C__event_timestamp}}, timezone=Asia/Seoul, format='Y-m-d')}",
"type": "workflowtoken",
"style": {
"bold": true
},
"property": "",
"data_type": "string"
},
{
"text": " ",
"type": "text",
"style": {
"bold": true
}
},
{
"text": "의 demo1 등록내역의 인증을 시작합니다\n\n",
"type": "text"
},
{
"name": "white_check_mark",
"type": "emoji",
"unicode": "2705"
},
{
"text": " 아래 ",
"type": "text"
},
{
"text": "초록색 버튼",
"type": "text",
"style": {
"bold": true
}
},
{
"text": "을 눌러주세요\n ",
"type": "text"
},
{
"name": "calling",
"type": "emoji",
"unicode": "1f4f2"
},
{
"text": " 이어서 앱에서 보내는 ",
"type": "text"
},
{
"text": "개인 메시지 안내",
"type": "text",
"style": {
"bold": true
}
},
{
"text": "를 따라가시면 됩니다",
"type": "text"
}
]
}
]
}
]
},
"channel_id": {
"hidden": false,
"locked": false,
"value": "C08NK8YCYDN"
},
"interactive_blocks": {
"hidden": false,
"locked": false,
"value": [
{
"type": "actions",
"elements": [
{
"text": {
"text": "메세지 수신 대기",
"type": "plain_text",
"emoji": true
},
"type": "button",
"style": "primary",
"value": "button",
"action_id": "f50f7080-d69d-4411-a64c-42a43af70976"
}
]
}
]
},
"interactivity_configuration": {
"hidden": false,
"locked": false,
"value": {
"actions": {
"f50f7080-d69d-4411-a64c-42a43af70976": {
"expiry": {
"type": "RELATIVE",
"timestamp": "{{inputs.Ft09KGLVDZ6C__event_timestamp}}",
"after_days": 1
},
"is_button_multi_click": true,
"is_mutually_exclusive": false
}
}
}
}
}
},
{
"id": "817f5896-e2a5-490a-afb6-b3c1e0a7f06e",
"function_id": "Fn013B",
"inputs": {
"list_id": {
"hidden": false,
"locked": false,
"value": "F09JHMP3JLD"
},
"filter_by": {
"hidden": false,
"locked": false,
"value": "filter_by_list_columns"
},
"filter_condition": {
"hidden": false,
"locked": false,
"value": {
"Col09KD64QHLK": [
"Opt8WOXZE6K"
],
"todo_assignee": "{{steps.3a636b5b-50e6-414c-90be-462961a53a15.interactivity.interactor.id}}",
"todo_completed": false
}
}
}
},
{
"id": "e720c615-3f45-4886-bae1-9080d55f8e5a",
"function_id": "Fn010M",
"inputs": {
"message": {
"hidden": false,
"locked": false,
"value": [
{
"type": "rich_text",
"elements": [
{
"type": "rich_text_section",
"elements": [
{
"name": "mortar_board",
"type": "emoji",
"unicode": "1f393"
},
{
"text": " ",
"type": "text"
},
{
"text": "강의 인증 절차를 시작합니다!",
"type": "text",
"style": {
"bold": true
}
},
{
"text": "\n",
"type": "text"
},
{
"name": "memo",
"type": "emoji",
"unicode": "1f4dd"
},
{
"text": " 아래 내용을 작성해주세요:\n",
"type": "text"
}
]
},
{
"type": "rich_text_list",
"style": "bullet",
"border": 0,
"indent": 0,
"elements": [
{
"type": "rich_text_section",
"elements": [
{
"name": "open_file_folder",
"type": "emoji",
"unicode": "1f4c2"
},
{
"text": " ",
"type": "text"
},
{
"text": "인증 자료 업로드",
"type": "text",
"style": {
"bold": true
}
}
]
},
{
"type": "rich_text_section",
"elements": [
{
"name": "writing_hand",
"type": "emoji",
"unicode": "270d-fe0f"
},
{
"text": " ",
"type": "text"
},
{
"text": "한 줄 회고 남기기",
"type": "text",
"style": {
"bold": true
}
}
]
}
]
},
{
"type": "rich_text_section",
"elements": [
{
"name": "warning",
"type": "emoji",
"unicode": "26a0-fe0f"
},
{
"text": " 혹시 등록하려는 강의가 아니라면 → ",
"type": "text"
},
{
"text": "강의명 필드를 변경",
"type": "text",
"style": {
"bold": true
}
},
{
"text": " 후 진행해주세요\n---\n인증할 과목을 드랍다운으로 불러와 선택하지 못하는건.. 슬랙 워크플로의 한계ㅠ\n\n",
"type": "text"
},
{
"name": "pushpin",
"type": "emoji",
"unicode": "1f4cc"
},
{
"text": " ",
"type": "text"
},
{
"text": "대상 목표 미리보기",
"type": "text",
"style": {
"bold": true
}
},
{
"text": "\n",
"type": "text"
},
{
"id": "{{steps.817f5896-e2a5-490a-afb6-b3c1e0a7f06e.record_url}}",
"type": "workflowtoken",
"property": "",
"data_type": "string"
}
]
}
]
}
]
},
"user_id": {
"hidden": false,
"locked": false,
"value": "{{steps.3a636b5b-50e6-414c-90be-462961a53a15.interactivity.interactor.id}}"
},
"interactive_blocks": {
"hidden": false,
"locked": false,
"value": [
{
"type": "actions",
"elements": [
{
"text": {
"text": "인증 시작!",
"type": "plain_text",
"emoji": true
},
"type": "button",
"style": "primary",
"value": "button",
"action_id": "38267b78-8162-4a66-8e7f-a6910403da3d"
}
]
}
]
},
"interactivity_configuration": {
"hidden": false,
"locked": false,
"value": {
"actions": {
"38267b78-8162-4a66-8e7f-a6910403da3d": {
"expiry": {
"type": "RELATIVE",
"timestamp": "{{inputs.Ft09KGLVDZ6C__event_timestamp}}",
"after_days": 1
},
"is_button_multi_click": true
}
}
}
}
}
},
{
"id": "5b463461-4e9f-4409-a452-474bc24fc7df",
"function_id": "Fn010N",
"inputs": {
"title": {
"hidden": false,
"locked": false,
"value": "미완료 일정 중 하나 업데이트"
},
"fields": {
"hidden": false,
"locked": false,
"value": {
"elements": [
{
"name": "name",
"type": "slack#/types/rich_text",
"title": "수강 예정 강의 이름",
"default": [
{
"type": "rich_text",
"elements": [
{
"id": "{{$this.variables.current_record.field_values.name}}",
"type": "workflowtoken",
"property": "",
"data_type": "slack#/types/rich_text"
}
]
}
],
"description": ""
},
{
"name": "Col09JR37RWE8",
"type": "array",
"items": {
"type": "slack#/types/file_id",
"allowed_filetypes_group": "ALL"
},
"title": "인증자료",
"maxItems": 10,
"description": ""
},
{
"name": "Col09J69HD70X",
"type": "slack#/types/rich_text",
"title": "한줄회고",
"default": [
{
"type": "rich_text",
"elements": [
{
"id": "{{$this.variables.current_record.field_values.Col09J69HD70X}}",
"type": "workflowtoken",
"property": "",
"data_type": "slack#/types/rich_text"
}
]
}
],
"description": ""
}
],
"required": [
"Col09JR37RWE8"
]
}
},
"interactivity": {
"hidden": false,
"locked": false,
"value": "{{steps.e720c615-3f45-4886-bae1-9080d55f8e5a.interactivity}}"
},
"on_submit_function_config": {
"hidden": false,
"locked": false,
"value": {
"inputs": {
"list_id": {
"hidden": false,
"locked": false,
"value": "F09JHMP3JLD"
},
"record_id": {
"hidden": false,
"locked": false,
"value": "{{steps.817f5896-e2a5-490a-afb6-b3c1e0a7f06e.record_id}}"
},
"updated_columns": {
"hidden": false,
"locked": false,
"value": {
"name": "{{$this.form.fields.name}}",
"Col09J69HD70X": "{{$this.form.fields.Col09J69HD70X}}",
"Col09JR37RWE8": "{{$this.form.fields.Col09JR37RWE8}}",
"todo_assignee": null,
"todo_due_date": null,
"todo_completed": true,
"assignee_access_key": null
}
}
},
"id": "5b463461-4e9f-4409-a452-474bc24fc7df",
"function_id": "Fn013E"
}
}
}
},
{
"id": "07672a77-0c79-48d7-8826-add37ebfbd39",
"function_id": "Fn0102",
"inputs": {
"files": {
"hidden": false,
"locked": false,
"value": "{{steps.5b463461-4e9f-4409-a452-474bc24fc7df.fields.Col09JR37RWE8}}"
},
"message": {
"hidden": false,
"locked": false,
"value": [
{
"type": "rich_text",
"elements": [
{
"type": "rich_text_section",
"elements": [
{
"name": "tada",
"type": "emoji",
"unicode": "1f389"
},
{
"text": " ",
"type": "text"
},
{
"id": "{{steps.3a636b5b-50e6-414c-90be-462961a53a15.interactivity.interactor.id}}",
"type": "workflowtoken",
"property": "",
"data_type": "slack#/types/user_id"
},
{
"text": " ",
"type": "text"
},
{
"text": "님이 ",
"type": "text",
"style": {
"bold": true
}
},
{
"text": "\n",
"type": "text"
}
]
},
{
"id": "{{steps.5b463461-4e9f-4409-a452-474bc24fc7df.fields.name}}",
"type": "workflowtoken",
"property": "",
"data_type": "slack#/types/rich_text"
},
{
"type": "rich_text_section",
"elements": [
{
"text": "\n",
"type": "text"
},
{
"text": "강의 인증을 완료했습니다! ",
"type": "text",
"style": {
"bold": true
}
},
{
"name": "mortar_board",
"type": "emoji",
"style": {
"bold": true
},
"unicode": "1f393"
},
{
"name": "sparkles",
"type": "emoji",
"style": {
"bold": true
},
"unicode": "2728"
},
{
"text": "\n",
"type": "text"
},
{
"text": " ",
"type": "text",
"style": {
"bold": true
}
},
{
"text": "\n",
"type": "text"
},
{
"name": "memo",
"type": "emoji",
"unicode": "1f4dd"
},
{
"text": " ",
"type": "text"
},
{
"text": "한 줄 회고",
"type": "text",
"style": {
"bold": true
}
},
{
"text": "\n",
"type": "text"
}
]
},
{
"id": "{{steps.5b463461-4e9f-4409-a452-474bc24fc7df.fields.Col09J69HD70X}}",
"type": "workflowtoken",
"property": "",
"data_type": "slack#/types/rich_text"
},
{
"type": "rich_text_section",
"elements": [
{
"text": "\n\n",
"type": "text"
},
{
"name": "clap",
"type": "emoji",
"unicode": "1f44f"
},
{
"text": " 수고 많으셨습니다! 오늘도 꾸준한 학습이 쌓여가고 있네요 ",
"type": "text"
},
{
"name": "rocket",
"type": "emoji",
"unicode": "1f680"
}
]
}
]
}
]
},
"channel_id": {
"hidden": false,
"locked": false,
"value": "C08NK8YCYDN"
}
}
}
]
},
"triggers": [
{
"name": "week5ver-daily-goal-updater",
"type": "scheduled",
"inputs": {
"Ft09KGLVDZ6C__event_timestamp": {
"value": "{{event_timestamp}}",
"locked": false,
"hidden": false
}
},
"schedule": {
"start_time": "2025-10-04T15:00:00.000Z",
"timezone": "Asia/Seoul",
"frequency": {
"type": "daily"
}
}
}
]
}
일간 상태 알림

- 마감기한이 현재 날짜와 동일한 미완료 리스트 항목에 대해 매일 오후9시에 담당자에게 노티
- 간단하므로 export 생략
결과
- 주간 목표 등록


- 일간 목표 인증



- 슬랙 리스트 인증 상황


한계 및 문제점
워크플로우의 구조적 한계
버튼 딸깍으로 간단히 구성할 수 있는것은 워크플로우의 장점이나, 쓸수록 지원되지 않는 기능을 보면서 아.. 이거 아쉬운데.. 그냥 앱으로 짤까.. 라는 생각이 많이 들었다.
연산 불가
워크플로우 빌더에 있는 각 블록단위에서 제공하는 기능만 처리가 가능하며, 그외 다른 라이브러리나 연산등 커스텀한 기능을 추가할 수 없다. 예를 들어 블록에서 이 워크플로우/블록이 시작된 시간은 가져올 수 있지만 그 날짜가 해당 달의 몇번째 주에 해당하는지는 제공하지 않으니 쓸 수 없다.
만약 Bolt for Python 등의 framework로 짰으면 Bolt로 날짜를 가져온뒤 calendar등의 모듈을 쓰거나.. 정안되면 날짜/7 사칙연산이라도 할 수 있을텐데 빌더 블록에서는 할 수 없다.
결과값 저장 및 가공 불가
리스트 항목을 불러올때, 빌더는 한개의 대상 레코드의 값(항목ID,item ID)를 제공한다. 필터링으로 대상을 조절할 수 있지만 대상이 여러개면 그중의 하나의 값만 돌려준다.
만약 앱이였다면 필터링된값을 리스트로 저장해서 원하는 인증항목을 선택할 수 있게 제공할 수 있겠지만 현재는 그냥 선택된 하나의 레코드를 항목명까지 변경하여 작동하도록 수정
또한 사용자 이름등을 가져올때 @멘션 형태로 가져온다. 너무 많은 알람이 발생하는건 원치않는데.. 불러온 값을 가공할 수 없으니 어쩔 수 없다.
메시지 템플릿 불가
block kit builder 사용해서 메세지 템플릿을 가공하고 만들고 싶은데 일반 댓글 형식의 메세지만 사용 가능
업데이트 갱신/반영
지금처럼 메세지 기반으로 동작하는 워크플로의 경우, 한번 배포(채널에 메시지 발송)되면 워크플로를 수정하여 재게시하여도 반영되지않는다. 한번 채널메세지로 게시한 워크플로를 수정하여 게시하여도 기존에 게시된 메세지는 구버전으로 작동하며, 갱신된 워크플로를 사용하려면 다시 메세지를 채널에 보내야 한다.
branch 기능 불가(business+)
현재 pro 단계에서의 workflow는 branch 같은 분기처리는 못하고 선형적인 처리만 가능하다. 뭐랄까.. 1부터 7까지의 블록이 있으면 순차적으로 실행되어야하고 중간을 뛰어넘거나 if문 같은 스킵처리를 할 수 없다. 이는 Branch 기능이며 더 높은 구독단계에서만 사용가능하다.
해당 기능으로 개선하고자 하는것은 목표 인증 단계에서, if 미완료 상태인 인증목표가 있으면 완료하고 else 없다면 새로 리스트에 목표를 추가하고 완료하는 기능(추가목표달성). 현재로서는 등록부터 전체기능을 반복하여야한다.
입력값 검증 불가
양식으로 응답받는 데이터에 대해서 별도 validation 적용이 불가능하다.
251011(토)에 등록하는 주간목표는 차주인 251013(월)~251019(일)에 해당하는 날짜값만을 받아야한다. 하지만 모든값을 입력받을 수 있어 추가정리 필요
디버깅의 어려움
구성이 완료되고 동작할때는 문제가 없다. 그러나 구축 과정에서 에러가 발생하면 회색느낌표 아이콘만 보여주고 어디가 어떻게 에러가 났는지/에러 메세지는 뭔지 알 수 없다.
문서화 부족
조건, 필요값, 응답 예시등이 상세하게 작성된 API 문서와 다르게 워크플로 빌더의 블록은 이 블록이 어떤 역할을 하는지, 어떤값을 필요로하고 어떤 값을 응답하는지 알 수 없다. 워크플로는 특성상 GUI 화면과 함께 어디에있는 어떤 버튼을 눌러야하는지 그림 설명도 있어야할텐데.. 도구 연결 및 작업 자동화 정도만 연관 문서고 기능을 설명하지만 텍스트로만 되어있어 찾기 힘들다.
위의 리스트 항목 업데이트시 항목ID변수로 어떤값이 필요하며 어떻게 찾아오는지도 관련 레딧글 과 같은 커뮤니티글을 통해 찾아야만했다.
결론
워크플로는 슬랙에 내장되어있어 개발자/비개발자 가리지 않고 간단히 구축하여 호딱 사용하기엔 유용하다. 그러나 쓸수록 아쉬운점이 느껴지고 아쉬운대로 쓰던가 or 수동오퍼레이션이 들어가야한다.
지금처럼 간단한 등록/인증 업무 정도에 자동화 할 수 있지만, 기능적 제약이 많아 ‘자동화 도구’라기 보다는 ‘운영 보조도구’에 가깝지 않나? 싶다. 사용시나리오에 맞춘 완전한 자동화는 힘들고 수동 작업을 추가하던가 (매주 메시지/목표 갱신 후 재배포) 또는 조금 불편하더라도 없는것보다는 나으니 감수하면서 사용해야하는 정도? 사용해보면서 부족한 기능등을 정리하고, 추가로 필요한 기능(잔여 보증금 정산)등을 포함해 다음 차수에는 App 형태로 확장해도 좋을듯 하다.
그외에도.. 자동화로 편해진건 좋은데 사람느낌이 나지 않고 삭막해진 느낌이 들어서 그런 부분은 고민 중..

