디스코드 봇 특화 설정
임베드 및 컴포넌트 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()로 대기 신호를 보내야 타임아웃 에러를 방지할 수 있습니다.