디스코드 봇 특화 설정

임베드 및 컴포넌트 V2 활용

디스코드 메시지 카드(Embed) 스타일과 버튼, 선택 메뉴 등 인터랙티브 UI 컴포넌트 구현법을 알아봅니다.

임베드(Embed)를 활용하면 메시지를 깔끔한 카드 레이아웃으로 전달할 수 있으며, 컴포넌트(Components)를 추가해 버튼이나 메뉴로 사용자와 직접 상호작용할 수 있습니다.


1. 리치 임베드(Rich Embed) 작성 예제

임베드는 제목, 설명, 썸네일 이미지, 주요 필드 목록, 푸터(Footer) 등으로 구성되는 풍부한 형식의 안내 카드입니다.

Node.js (discord.js v14) 임베드 예제

const { EmbedBuilder } = require('discord.js');

const welcomeEmbed = new EmbedBuilder()
  .setColor(0x0071E3) // 브랜드 색상 지정
  .setTitle('디스호스트 서버 안내')
  .setDescription('무료 디스코드 봇 호스팅에 오신 것을 환영합니다.')
  .addFields(
    { name: '기본 메모리', value: '128MB', inline: true },
    { name: '디스크 용량', value: '512MB', inline: true }
  )
  .setTimestamp()
  .setFooter({ text: 'DisHost Docs Team' });

// 채널에 전송할 때 embeds 배열에 담아 보냅니다.
message.channel.send({ embeds: [welcomeEmbed] });

2. 인터랙티브 컴포넌트 (버튼 및 인터랙션)

버튼이나 드롭다운 메뉴를 추가해 사용자가 클릭하여 동작을 트리거하도록 구성할 수 있습니다.

Python (discord.py v2) 버튼 컴포넌트 예제

import discord

class InteractiveView(discord.ui.View):
    def __init__(self):
        super().__init__(timeout=60) # 60초 후 상호작용 비활성화

    @discord.ui.button(label="서버 정보 조회", style=discord.ButtonStyle.primary)
    async def info_button(self, interaction: discord.Interaction, button: discord.ui.Button):
        # 버튼을 클릭한 본인에게만 보이는 비공개 메시지로 응답합니다.
        await interaction.response.send_message(
            content="본 봇은 디스호스트 컨테이너(128MB)에서 실행 중입니다.", 
            ephemeral=True
        )

# 명령어 처리 시 view 매개변수에 전달해 발송합니다.
@bot.command(name='메뉴')
async def menu(ctx):
    await ctx.send("원하는 작업을 선택해 주세요:", view=InteractiveView())

3. 컴포넌트 개발 시 주의사항

  • Custom ID 고유성: 버튼이나 드롭다운 메뉴에 지정하는 custom_id는 디스코드 이벤트 핸들러가 컴포넌트를 구분하는 고유 식별자입니다. 여러 컴포넌트에 같은 ID를 쓰면 이벤트가 중복 트리거되거나 오작동할 수 있습니다.
  • 응답 제한 시간 (3초): 사용자가 버튼을 클릭한 순간부터 봇이 디스코드에 응답(interaction.response.send_message() 또는 interaction.deferReply())을 보내기까지 최대 3초의 제한 시간이 있습니다. 무거운 작업이 필요한 경우 먼저 interaction.deferReply()로 대기 신호를 보내야 타임아웃 에러를 방지할 수 있습니다.