디스코드 봇 만들기 #29화폐·상점(Economy) 시스템 만들기! 코인 벌어서 아이템 사기 (파이썬 예제)
이번 #29편에서는 디스코드 봇에 화폐·상점(Economy) 시스템을 만들어 볼게요. 출석 체크로 코인을 벌고, /상점에서 드롭다운으로 아이템을 고르고, /지갑으로 내 인벤토리를 확인하는 것까지 한 번에 완성해요.
최신순
이번 #29편에서는 디스코드 봇에 화폐·상점(Economy) 시스템을 만들어 볼게요. 출석 체크로 코인을 벌고, /상점에서 드롭다운으로 아이템을 고르고, /지갑으로 내 인벤토리를 확인하는 것까지 한 번에 완성해요.
#31의 들어오면 생기고 나가면 사라지는 음성방을 파티방으로 키워요. 전용 채팅방 자동 생성, 방장 위임·강퇴, 초대 전용(비공개) 방, 재시작해도 살아있는 버튼 패널까지 discord.py로 만듭니다.
2026년 9월 디스코드 개발자 체인지로그를 봇 개발자 눈으로 정리했어요. 파일 한도 20 MiB, 슬래시 커맨드 여러 줄 입력, 연령 확인, 초대 대상 유저 엔드포인트, 대형 봇 shard 필수까지 discord.py 2.7.1 코드로 대응합니다.
디스코드 봇으로 서버 로그 채널을 만들어 봐요. 지워진 메시지 내용과 누가 지웠는지, 입퇴장·역할 변경·추방·차단까지 임베드로 자동 기록하는 로그봇을 discord.py 2.x 예제로 처음부터 만듭니다.

지난 편에서는 화폐·상점(Economy) 시스템을 만들어서 코인을 벌고 아이템을 사는 봇을 완성했어요. 서버에 "놀거리"가 하나 생긴 셈이죠! 이번 편에서는 서버 운영에 진짜 자주 쓰이는 기능, 투표·설문(Poll) 봇을 만들어볼게요. 두 가지 방식을 다 다룹니다.
예전에 디스코드 봇 오류 해결 총정리(입문편)에서 인텐트·토큰 같은 첫날 에러 5가지를 정리했었죠. 그런데 봇을 조금 키우다 보면 그때는 만날 일도 없던 에러들이 우르르 쏟아져요. Cog로 코드를 쪼개고, DB를 붙이고, 버튼·모달까지 넣기 시작하면 딱 그렇습니다 😅
지난 #26편에서는 버튼 하나로 1:1 상담 채널이 자동으로 생기는 티켓 시스템을 만들었어요. 그런데 이걸 실제 서버에 붙여보면 하루 만에 문제가 하나 튀어나옵니다.
지난 #25편에서는 봇이 죽지 않게 에러 핸들링과 로깅 체계를 잡아봤어요. 이제 봇이 웬만해선 안 죽으니까, 이번엔 사람 손이 필요한 일을 봇이 대신 받아주게 만들어 볼게요.
지난 #24편에서는 채널 난독화(Channel Obfuscation)에 대응하는 법을 봤어요. 봇이 볼 수 없는 채널이 생겨도 안 터지게 만드는 작업이었죠.
지금까지 우리가 만든 파이썬 프로그램은 전부 까만 콘솔 창에서 돌아갔어요. 그런데 문득 이런 생각 안 드셨나요? "내가 만든 프로그램도 버튼 달린 진짜 프로그램처럼 생겼으면 좋겠다!" 오늘은 그 소원을 이뤄볼 거예요. 파이썬에 기본으로 들어있는 tkinter(티케이인터)로…
첫 편을 올린 게 2025년 4월이었는데, 디스코드 봇 만들기 시리즈가 어느새 24편이 됐어요. 그러다 보니 이런 메시지를 종종 받습니다. 그래서 오늘은 새 기능을 만드는 대신 지도 한 장을 그려드릴게요. 이 글 하나만 즐겨찾기 해두면 필요한 편으로 바로 점프할 수 있어요…
지난 #23편에서는 JSON을 버리고 aiosqlite로 봇의 데이터 계층을 제대로 다시 깔았죠. 오늘은 조금 결이 다른 글이에요. 새 기능을 만드는 게 아니라, 곧 우리 봇이 고장 날 수도 있는 변경을 미리 막는 글입니다 🛡️
봇 만드는 글을 스물세 편이나 쓰는 동안, 댓글이랑 검색 유입으로 제일 많이 들어온 질문이 이거예요. "내 컴퓨터 끄면 봇도 죽는데, 이거 어떻게 24시간 켜두나요?"
지난 #22편에서는 /금지어추가, /금지어삭제 를 자동완성으로 만들었죠. 편해지긴 했는데, 그 데이터가 지금 어디에 있죠? data/bannedwords.json 이에요. #21의 경고 기록도 data/warns.json 이고요.
지난 #21편에서는 채팅을 지켜보는 cogs/automod.py를 만들었죠. 그런데 문제가 하나 있었어요. 금지어가 코드 안에 박혀 있었다는 것 😩
지난 #20편에서는 새 멤버가 들어오면 환영 카드를 띄우고, 규칙 동의 버튼으로 자동 역할 부여까지 되게 만들었죠. 사람 손 없이 신규 유저를 받는 문이 생긴 거예요 🚪
지난 #19편에서는 길어진 bot.py를 확장(Extension)과 Cog 구조로 쪼개고, !reload로 재시작 없이 코드를 다시 불러오는 것까지 만들었죠. 오늘부터가 진짜 재미있는 부분이에요. 그 구조 위에 기능 파일을 하나씩 얹어갑니다 🏗️
지난 #18편에서는 discord.Poll 로 네이티브 투표 기능을 만들었죠. 그런데 여기까지 오면서 눈치채신 분 계실 거예요. bot.py 파일이 슬슬... 아니 꽤 많이 길어졌잖아요? 😅 명령어 하나 고치려고 스크롤을 300줄씩 내리고 계신다면, 오늘 글이 딱입니다.
지난 #17편에서는 RAG로 우리 서버 전용 FAQ 답변봇을 만들었죠. 문서를 읽고 답해주는 똑똑한 봇이었는데요, 오늘은 분위기를 바꿔서 서버원들의 의견을 모으는 기능을 만들어볼게요. 바로 투표(Poll) 입니다!
지난 #16편에서는 봇이 정해진 시간에 먼저 말을 거는 리마인더·알림 기능을 만들어봤어요. 오늘은 한 단계 더 나아가서, 우리 서버 문서를 읽고 대답하는 봇을 만들어볼게요. 이런 걸 RAG(검색 증강 생성, Retrieval-Augmented Generation) 라고 불러요!
지난 #14편에서는 JSON과 SQLite로 봇에게 기억력을 만들어줬어요. 그런데 시리즈를 따라오면서 기능을 하나씩 붙이다 보니, 어느새 명령어가 열댓 개를 훌쩍 넘지 않았나요? 디스코드에서 /만 입력하면 명령어가 우르르 쏟아져서 정작 필요한 걸 찾기 힘들어지는 시점이 옵니다.
지난 #13편에서는 역할·채널 자동화로 서버 관리를 봇에게 통째로 맡겨봤어요. 그런데 한 가지 아쉬운 점이 있었죠. #13의 tempchannels처럼 변수에만 담아둔 데이터는 봇을 재시작하는 순간 전부 사라진다는 거예요.
지난 #12편에서는 명령어 쿨다운과 권한으로 봇을 안전하게 지키는 법을 배웠어요. 이번 #13편에서는 한 걸음 더 나아가, 서버 관리자의 반복 노동을 봇에게 통째로 넘겨볼게요. 오늘 만들 자동화는 딱 세 가지예요.
지난 #11편에서는 플라스크(Flask)로 봇 상태를 보는 웹 대시보드를 만들어봤어요. 이제 봇 기능은 꽤 갖춰졌는데, 실제로 서버에 넣어보면 꼭 이런 일이 생깁니다.
지난 #10편에서는 봇을 글로벌 봇으로 만드는 다국어(i18n) 지원을 다뤘죠? 원래 쿨다운·권한 관리를 예고했는데, 그 전에 많은 분들이 궁금해하시는 주제를 먼저 가져왔어요. 바로 웹 대시보드(Web Dashboard) 만들기입니다! (쿨다운 편도 곧 올라오니 기대해주세요)
지난번에 바이브 코딩(Vibe Coding) 입문 글에서 Claude Code로 AI 코딩 시작하는 법을 소개해드렸는데요, 그 사이에 꽤 큰 소식이 하나 있었어요. 바로 Anthropic이 새 모델 Claude Sonnet 5를 출시했고, 우리가 터미널에서 쓰는 Claude…
지난 #9편에서는 봇에 AI(Claude·ChatGPT API)를 연동해서 대화하는 봇을 만들어봤죠? 이번 편에서는 우리 봇을 글로벌 봇으로 업그레이드해볼 거예요. 바로 다국어(i18n) 지원입니다!
디스코드 봇 만들기 시리즈를 9편까지 진행하면서 가장 많이 받는 질문이 뭔지 아세요? 바로 "봇이 안 켜져요", "에러가 떠요"예요! 사실 봇 개발에서 코드를 짜는 시간보다 에러랑 싸우는 시간이 더 길 때도 많죠 😅
지난 #8에서는 임베드(Embed)로 봇의 메시지를 예쁘게 꾸미는 방법을 배웠죠. 이번 편에서는 드디어 많은 분들이 기다리셨을 기능, 봇에 AI를 연동해볼게요! /ai 질문 이렇게 입력하면 Claude나 ChatGPT가 대답해주는 봇을 만듭니다.
지난 편(#8)까지 해서 버튼, 드롭다운, 모달, 임베드까지 갖춘 제법 그럴듯한 봇이 완성됐어요. 그런데 여기서 다들 똑같은 고민을 하게 됩니다. "내 컴퓨터를 끄면 봇도 꺼지는데... 24시간 켜두려면 어떻게 하죠?"
요즘 개발 커뮤니티에서 "바이브 코딩(Vibe Coding)"이라는 말, 정말 자주 들리죠? 오늘은 이 바이브 코딩이 대체 뭔지, 대표 도구인 Claude Code와 Cursor는 어떻게 다른지, 그리고 초보자가 어떻게 시작하면 되는지를 쉽게 정리해 드릴게요!
지난 편에서는 드롭다운(Select Menu)으로 여러 선택지를 깔끔하게 담는 방법을 배웠죠? 그런데 버튼도 드롭다운도 결국 미리 정해둔 선택지 안에서 고르는 방식이에요. 유저가 직접 자유롭게 텍스트를 써서 보내야 할 때는 어떻게 할까요?
지난 #5편에서는 버튼(Button)으로 봇과 상호작용하는 방법을 알아봤죠? 이번에는 한 단계 더 나아가서 드롭다운 메뉴(Select Menu) 를 만들어보겠습니다!
지난 #4편에서는 Slash Command로 임베드를 전송해봤죠? 이번에는 한 단계 더 나아가서, 메시지에 클릭할 수 있는 버튼(Button) 을 달아보겠습니다! 버튼을 누르면 봇이 반응하는, 진짜 "상호작용하는 봇"을 만들어봅시다.
예를 들어… 이런 식으로 하나의 명령어 그룹 안에 여러 개의 기능을 넣는 거죠! class UserCommandGroup(appcommands.Group): def init(self): super().init(name="user", description="유저 관련 명령어…
이번에는 사용자 입력값을 받아서 동작하는 Slash Command 를 만들어볼게요. 예를 들면 /say message:안녕 처럼 말이죠! 이번에도 Python과 discord.py 를 기반으로 합니다. 먼저 아래 코드를 참고해주세요👇
오늘은 디스코드 봇 만들기 시리즈 중에서도, 요즘 대세인 슬래시 커맨드(Slash Command) 를 만들어보려고 합니다. /명령어 형태로 입력하는 그거 아시죠? 일반 텍스트 명령어보다 훨씬 깔끔하고, 자동완성도 돼서 요즘은 거의 필수 기능이에요!
특정 채널에 메시지를 보내는 기능은 디스코드 봇의 다양한 용도에 매우 유용합니다. 이에 따른 장단점은 다음과 같습니다: 다음은 특정 채널에 메시지를 보내는 코드의 사용 예시입니다.
디스코드 봇 임베드는 디스코드 서버에서 메시지에 풍부한 형식과 정보를 추가하는 기능입니다. Python을 사용하여 디스코드 봇을 개발하고, 해당 봇에 임베드 기능을 추가할 수 있습니다. 임베드는 텍스트, 이미지, 링크 등 다양한 요소를 포함할 수 있어서 메시지를 더욱 멋지게…
디스코드 사용자라면 파이썬과 Discord.py를 이용해 간단하게 봇을 만들어 볼 만한 가치가 있습니다. 오늘은 그 중에서도 봇으로 공지 명령어를 만드는 방법을 소개하겠습니다.