모달을 쓰고 싶은데 예제가 너무 크거나 지원서 전체 코드만 보이면 오히려 구조가 안 잡힐 때가 있습니다.
그럴 때 필요한 건 완성형 운영 예제가 아니라, 입력칸 정의와 제출 처리만 남긴 가장 작은 레퍼런스입니다.
이 글은 지원서나 문의 흐름 전체가 아니라, 디스코드 모달의 기본 뼈대를 이해하는 참고 글로 보면 맞습니다.
1. 긴 입력을 받을 때 '명령어 인자' 대신 쓰는 기본 UI다
아래처럼 입력 길이가 길거나 형식을 맞춰 받고 싶을 때 잘 맞습니다.
- 문의 요약 받기
- 신고 사유 받기
- 지원 이유 받기
- 버그 제보 내용 받기
실전 예시를 먼저 보고 싶다면 모달 폼 접수 디스코드 봇 만들기를 같이 보면 됩니다.
2. 모달을 붙이기 전에 확인할 것
슬래시 명령어 기본 구조는 이미 있다는 전제로 갑니다.
아직 slash 명령어가 익숙하지 않다면 슬래시 명령어 디스코드 봇 만드는 법, 파이썬 discord.py app_commands 입문부터 먼저 맞춰야 합니다.
3. 명령어와 채널 값 먼저 넣기
DISCORD_TOKEN=여기에_봇_토큰
GUILD_ID=테스트_서버_ID
이 글에서는 가장 작은 예제로 `/문의폼` 명령어를 만들고 모달을 띄웁니다.
4. 모달 호출과 응답의 최소 구조
import os
import discord
from discord import app_commands
from dotenv import load_dotenv
load_dotenv()
TOKEN = os.getenv("DISCORD_TOKEN")
GUILD_ID = int(os.getenv("GUILD_ID"))
intents = discord.Intents.default()
client = discord.Client(intents=intents)
tree = app_commands.CommandTree(client)
guild = discord.Object(id=GUILD_ID)
class FeedbackModal(discord.ui.Modal, title="문의 폼"):
subject = discord.ui.TextInput(label="제목", max_length=50)
detail = discord.ui.TextInput(label="상세 내용", style=discord.TextStyle.paragraph, max_length=500)
async def on_submit(self, interaction: discord.Interaction):
embed = discord.Embed(title="모달 제출 결과", color=discord.Color.blurple())
embed.add_field(name="제목", value=str(self.subject), inline=False)
embed.add_field(name="상세 내용", value=str(self.detail), inline=False)
await interaction.response.send_message(embed=embed, ephemeral=True)
@client.event
async def on_ready():
await tree.sync(guild=guild)
print(f"로그인 성공: {client.user}")
@tree.command(name="문의폼", description="기본 모달 입력창을 엽니다.", guild=guild)
async def open_feedback_modal(interaction: discord.Interaction):
await interaction.response.send_modal(FeedbackModal())
if not TOKEN:
raise ValueError("DISCORD_TOKEN 값이 없습니다.")
client.run(TOKEN)
이 예제는 가장 기본적인 모달 흐름만 남겼습니다.
슬래시 명령어가 모달을 열고, 제출된 값을 바로 ephemeral 응답으로 보여 주는 구조입니다.
5. 코드에서 봐야 할 핵심
discord.ui.Modal을 상속한다TextInput으로 입력칸을 만든다on_submit()에서 제출 뒤 동작을 처리한다- 명령어나 버튼에서
send_modal()을 호출한다
모달은 결국 입력 UI를 따로 여는 컴포넌트라고 보면 됩니다.
6. 입력창이 실제로 뜨는지 먼저 확인
python main.py
실행 후 `/문의폼`을 입력합니다.
모달 창이 뜨고 값을 넣어 제출하면 본인에게만 결과가 보이면 정상입니다.
7. 응답 타이밍에서 자주 막히는 부분
- 명령어는 보이는데 모달이 안 뜨는 경우 응답을
send_message()로 보내고 있을 수 있습니다.
모달은send_modal()로 열어야 합니다. - 제출 직후
This interaction failed가 뜨는 경우on_submit()안에서 응답을 안 보냈거나 예외가 난 경우가 많습니다. - 입력칸 개수를 너무 많이 넣은 경우 초반에는 무엇이 필수인지 흐려져서 제출률이 떨어집니다.
8. 어디에 응용할 수 있을까
기본 모달 구조를 익혀 두면 아래로 바로 확장됩니다.
- 제휴 신청 폼
- 신고 접수 폼
- 이벤트 참가 신청 폼
- 버그 제보 폼
실제로는 입력칸과 제출 후 저장 위치만 바꾸면 되는 경우가 많습니다.
9. 모달은 다른 자동화 글과 같이 보면 더 잘 잡힌다
입력 결과를 검토 채널에 보내고 싶다면 모달 폼 접수 디스코드 봇 만들기가 바로 이어집니다.
버튼과 함께 붙이고 싶다면 티켓 디스코드 봇 만들기 구조와도 잘 맞습니다.
10. 기본기를 잡았다면 이제 운영 흐름 안에 끼워 넣는다
모달 기본기를 익혔다면 다음에는 이 입력 UI를 실제 운영 흐름 안에 끼워 넣는 단계로 가면 됩니다.
검토 채널까지 붙은 실전형 예제를 보고 싶다면 모달 폼 접수 디스코드 봇 만들기를, 슬래시 명령어 구조부터 다시 확인하고 싶다면 디스코드 봇 slash command 안 뜰 때 기본 점검을 같이 보면 됩니다.
'봇 개발 팁 > Discord.py' 카테고리의 다른 글
| 모달 폼 접수 디스코드 봇 만들기 (0) | 2026.04.30 |
|---|---|
| 지원서 접수 디스코드 봇 만들기 (0) | 2026.04.29 |
| 고객 지원 대기열 디스코드 봇 만들기 (0) | 2026.04.28 |
| 티켓 디스코드 봇 만들기 (0) | 2026.04.25 |
| 온보딩 체크리스트 디스코드 봇 만들기 (0) | 2026.04.24 |