모달 폼 접수 디스코드 봇 만들기

2026. 4. 30. 16:54·봇 개발 팁/Discord.py

문의나 지원서를 받을 때 DM으로 질문을 하나씩 주고받는 방식이 길고 지저분하게 느껴지는 순간이 있습니다.

그럴 때 모달 폼은 "첫 입력을 한 번에 정리해서 받는 장치"로 아주 강합니다.

이 글은 모달 자체 설명보다, 버튼을 눌렀을 때 여러 입력칸을 한 번에 받아 검토 채널로 보내는 수집 패턴에 집중합니다.

1. 첫 입력을 한 번에 정리해서 받아야 할 때 맞는다

아래 같은 상황에서 특히 잘 맞습니다.

  • 지원서 접수
  • 제휴 문의 접수
  • 신고 사유 입력
  • 긴 설명이 필요한 운영 문의

질문을 순차 DM으로 받는 방식과 비교하고 싶다면 지원서 접수 디스코드 봇 만들기를 같이 보면 차이가 잘 보입니다.

2. 버튼과 채널 ID 먼저 묶기

DISCORD_TOKEN=여기에_봇_토큰
GUILD_ID=테스트_서버_ID
REVIEW_CHANNEL_ID=검토채널_ID


버튼을 눌렀을 때 결과를 보낼 검토 채널 하나를 먼저 준비합니다.

3. 모달 제출값을 받는 코드

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"))
REVIEW_CHANNEL_ID = int(os.getenv("REVIEW_CHANNEL_ID"))

intents = discord.Intents.default()
client = discord.Client(intents=intents)
tree = app_commands.CommandTree(client)
guild = discord.Object(id=GUILD_ID)


class ApplyModal(discord.ui.Modal, title="지원 폼"):
    nickname = discord.ui.TextInput(label="닉네임", placeholder="디스코드 닉네임 또는 활동명을 입력해 주세요.", max_length=30)
    reason = discord.ui.TextInput(label="지원 이유", style=discord.TextStyle.paragraph, max_length=500)
    experience = discord.ui.TextInput(label="관련 경험", style=discord.TextStyle.paragraph, required=False, max_length=500)

    async def on_submit(self, interaction: discord.Interaction):
        review_channel = client.get_channel(REVIEW_CHANNEL_ID)
        if not isinstance(review_channel, discord.TextChannel):
            await interaction.response.send_message("검토 채널을 찾지 못했습니다.", ephemeral=True)
            return

        embed = discord.Embed(title="새 모달 지원서", color=discord.Color.blurple())
        embed.add_field(name="지원자", value=interaction.user.mention, inline=False)
        embed.add_field(name="닉네임", value=str(self.nickname), inline=False)
        embed.add_field(name="지원 이유", value=str(self.reason), inline=False)
        embed.add_field(name="관련 경험", value=str(self.experience) or "없음", inline=False)

        await review_channel.send(embed=embed)
        await interaction.response.send_message("지원서가 접수되었습니다. 검토 후 안내드리겠습니다.", ephemeral=True)


class ApplyView(discord.ui.View):
    def __init__(self):
        super().__init__(timeout=None)

    @discord.ui.button(label="지원서 작성", style=discord.ButtonStyle.primary, custom_id="apply:open")
    async def open_modal(self, interaction: discord.Interaction, button: discord.ui.Button):
        await interaction.response.send_modal(ApplyModal())


@client.event
async def on_ready():
    client.add_view(ApplyView())
    await tree.sync(guild=guild)
    print(f"로그인 성공: {client.user}")


@tree.command(name="지원패널", description="모달 지원 패널을 보냅니다.", guild=guild)
async def apply_panel(interaction: discord.Interaction):
    embed = discord.Embed(
        title="지원서 접수",
        description="아래 버튼을 눌러 지원 폼을 작성해 주세요.",
        color=discord.Color.green(),
    )
    await interaction.response.send_message(embed=embed, view=ApplyView())


if not TOKEN:
    raise ValueError("DISCORD_TOKEN 값이 없습니다.")

client.run(TOKEN)


핵심은 `discord.ui.Modal`을 상속해 입력칸을 정의하고, 버튼 클릭에서 `send_modal()`을 호출하는 구조입니다.
폼 기반 입력이 필요한 상황에서 가장 먼저 익혀 둘 패턴입니다.

4. 입력창 열기부터 제출까지 점검

python main.py


실행 후 `/지원패널`을 입력합니다.
채널에 버튼이 붙은 패널이 올라오고, 버튼을 누르면 모달이 열려야 정상입니다.
제출 뒤 검토 채널에 임베드가 올라오는지도 같이 확인합니다.

5. 모달 제출에서 자주 놓치는 점

  • 버튼은 보이는데 모달이 안 뜨는 경우 버튼 콜백에서 interaction.response.send_modal()을 호출하지 않았을 수 있습니다.
  • 재시작 뒤 버튼이 죽는 경우 persistent view 등록이 빠졌을 가능성이 큽니다.
  • 검토 채널에 결과가 안 쌓이는 경우 채널 ID 오류나 봇 권한 부족을 먼저 봅니다.

6. 모달은 질문 수를 너무 많이 넣으면 이탈이 늘어난다

입력칸이 많아질수록 제출률이 내려갑니다.

처음에는 핵심 질문 세 개 안팎으로 시작하면 됩니다.

긴 세부 질문은 이후 면접 채널이나 DM에서 이어가면 더 자연스럽습니다.

7. 모달은 티켓과도 잘 붙는다

버튼으로 티켓을 열고, 첫 입력을 모달로 받는 구조도 많이 씁니다.

예를 들어 문의 유형과 요약 내용을 먼저 모달로 받은 뒤 전용 채널을 열면 초기 정리가 훨씬 쉬워집니다.

이 흐름은 티켓 디스코드 봇 만들기과 같이 확장하기 좋습니다.

8. 기본 원리를 따로 이해해 두면 응용이 쉬워진다

모달은 지원서뿐 아니라 신고 접수, 오류 제보, 제휴 신청에도 그대로 쓸 수 있습니다.

입력칸 정의, 제출 처리, 검토 채널 전송이라는 틀만 이해하면 대부분 비슷하게 확장됩니다.

9. 상시 운영이라면 배포를 같이 준비한다

모달 패널도 결국 버튼 기반 기능이라 언제든 눌릴 수 있습니다.

실서버에서 쓰려면 봇이 계속 살아 있어야 합니다.

실제 운영용으로 붙일 생각이라면 24시간 디스코드 봇 무료 호스팅, 디스호스트처럼 상시 실행 환경을 같이 준비해야 합니다.

10. 수집 패턴을 이해했다면 이제 모달 자체를 더 작게 뜯어본다

이 글로 모달 수집 패턴을 익혔다면 다음에는 질문 수와 입력칸 설계를 더 단순하게 다듬어야 합니다.

순차 DM 수집과 비교하고 싶다면 지원서 접수 디스코드 봇 만들기를 같이 보고, 티켓 입구와 붙여서 생각하고 싶다면 티켓 디스코드 봇 만들기를 함께 보면 됩니다.

'봇 개발 팁 > Discord.py' 카테고리의 다른 글

지원서 접수 디스코드 봇 만들기  (0) 2026.04.29
고객 지원 대기열 디스코드 봇 만들기  (0) 2026.04.28
티켓 디스코드 봇 만들기  (0) 2026.04.25
온보딩 체크리스트 디스코드 봇 만들기  (0) 2026.04.24
인증 디스코드 봇 만들기  (0) 2026.04.23
'봇 개발 팁/Discord.py' 카테고리의 다른 글
  • 지원서 접수 디스코드 봇 만들기
  • 고객 지원 대기열 디스코드 봇 만들기
  • 티켓 디스코드 봇 만들기
  • 온보딩 체크리스트 디스코드 봇 만들기
디스호스트
디스호스트
쉽고 안정적인 디스코드 봇 호스팅 서비스, 디스호스트의 기술 블로그입니다. 디스호스트는 24시간 구동되는 서버를 통해 디스코드 봇을 대신 구동시켜 드리는 서비스를 제공하고 있습니다.
  • 디스호스트
    디스호스트 기술 블로그
    디스호스트
  • 블로그 메뉴

    • 홈
    • 디스호스트 사용 가이드
    • 디스코드 봇 호스팅, 24시간 서버 구동
    • 분류 전체보기 (92) N
      • 디스코드 (9)
      • 디스호스트 가이드 (12)
      • 봇 개발 팁 (31) N
        • Discord.js (11)
        • Discord.py (19) N
      • DiscordJS 개발 튜토리얼 (15)
      • 디스코드 서버 운영 (17)
      • 디스코드 봇 오류 해결 (7)
  • 링크

    • 디스호스트
  • hELLO· Designed By정상우.v4.10.3
디스호스트
모달 폼 접수 디스코드 봇 만들기
상단으로

티스토리툴바