디스코드 봇 만들기#8임베드(Embed) 이미지·필드로 꾸미기 (파이썬 예제)
목차9개 항목
안녕하세요! Mojangcam입니다 😎
지난 #7편에서는 모달(Modal)로 사용자에게 입력을 받아봤어요. 이번 #8편에서는 봇이 보내는 메시지를 훨씬 예쁘게 만들어주는 임베드(Embed)를 다뤄볼게요!
임베드는 디스코드에서 제목·설명·필드·이미지·색상을 깔끔하게 담아 보여주는 카드형 메시지예요. 서버 정보, 프로필 카드, 공지, 유저 랭킹 같은 걸 만들 때 밋밋한 텍스트보다 훨씬 보기 좋답니다. 오늘은 필드(Field) 정렬과 썸네일·큰 이미지 넣기까지 복붙 그대로 따라 하면 되는 예제로 정리했어요!

📌 준비물
- Python 3.8+
- discord.py 2.x (슬래시 명령어·임베드 최신 기능 사용)
- 디스코드 봇 토큰 & 서버 초대 완료 (이전 편에서 세팅했다면 그대로 OK)
pip install -U discord.py💡 이 시리즈는 계속 discord.py 2.x 기준이에요. 버전이 낮으면 슬래시 명령어가 동작하지 않으니
-U로 최신화해주세요.
📌 1단계 - 기본 임베드 만들기
임베드는 discord.Embed()로 뼈대를 만들고, 여기에 필드와 이미지를 붙여나가요.
embed = discord.Embed(
title="📊 서버 정보",
description="이 서버의 기본 정보를 임베드로 정리했어요!",
color=discord.Color.blurple(),
)하나씩 뜯어볼게요 💡
- title : 임베드 맨 위 굵은 제목이에요.
- description : 제목 아래 본문 설명이에요.
- color : 임베드 왼쪽 세로줄 색상.
discord.Color.blurple()(디스코드 보라)처럼 프리셋을 쓰거나discord.Color.from_rgb(88, 101, 242)로 직접 지정할 수 있어요.
📌 2단계 - 필드(Field) 추가하고 정렬하기
add_field()로 "이름 : 값" 형태의 항목을 추가해요. inline 값으로 가로 배치가 결정됩니다.
embed.add_field(name="멤버 수", value="120명", inline=True)
embed.add_field(name="채널 수", value="18개", inline=True)
embed.add_field(name="서버 생성일", value="2024-03-01", inline=False)- inline=True : 다른 inline 필드와 가로로 나란히 붙어요. (한 줄에 최대 3개)
- inline=False : 한 줄을 통째로 차지해요. 구분선처럼 쓰기 좋아요.
- name / value 는 빈 문자열이면 에러가 나니 비지 않게 채워주세요.
📌 3단계 - 썸네일·큰 이미지 넣기
이미지는 두 종류예요. 위치가 다르니 용도에 맞게 골라요.
embed.set_thumbnail(url="https://picsum.photos/200") # 오른쪽 위 작은 이미지
embed.set_image(url="https://picsum.photos/600/200") # 아래쪽 큰 이미지(배너)
embed.set_footer(text="Mojangcam 디스코드 봇") # 맨 아래 작은 글씨- set_thumbnail : 오른쪽 위 작은 썸네일 (프로필·서버 아이콘용).
- set_image : 임베드 하단의 큰 배너 이미지.
- set_footer : 맨 아래 작은 회색 글씨(출처·봇 이름 표시용).
- ⚠️ 이미지 URL은
.png·.jpg같은 확장자로 끝나야 안정적으로 떠요. 확장자 없는 주소는 안 보일 수 있어요.
📌 전체 코드 (복붙 OK)
# discord.py 2.x / Python 3.8+
import discord
from discord import app_commands
intents = discord.Intents.default()
client = discord.Client(intents=intents)
tree = app_commands.CommandTree(client)
@client.event
async def on_ready():
await tree.sync() # 슬래시 명령어 등록
print(f"{client.user} 준비 완료!")
@tree.command(name="서버정보", description="서버 정보를 임베드로 보여줘요")
async def server_info(interaction: discord.Interaction):
guild = interaction.guild
embed = discord.Embed(
title=f"📊 {guild.name} 서버 정보",
description="이 서버의 기본 정보를 임베드로 정리했어요!",
color=discord.Color.blurple(),
)
embed.add_field(name="멤버 수", value=f"{guild.member_count}명", inline=True)
embed.add_field(name="채널 수", value=f"{len(guild.channels)}개", inline=True)
embed.add_field(
name="서버 생성일",
value=guild.created_at.strftime("%Y-%m-%d"),
inline=False,
)
if guild.icon: # 서버 아이콘이 있으면 썸네일로
embed.set_thumbnail(url=guild.icon.url)
embed.set_image(url="https://picsum.photos/600/200")
embed.set_footer(
text="Mojangcam 디스코드 봇",
icon_url=client.user.display_avatar.url,
)
await interaction.response.send_message(embed=embed)
client.run("여기에_봇_토큰_붙여넣기")- guild : 명령어를 실행한 서버 객체예요. 여기서 이름·멤버 수·생성일을 바로 꺼내 써요.
- member_count : 서버 멤버 수를 자동으로 가져와요.
- display_avatar.url : 봇의 프로필 이미지 주소예요. footer 아이콘으로 넣었어요.
📌 실행 결과
봇을 켜고 서버에서 /서버정보를 입력하면, 제목 + 멤버·채널 수가 가로로 나란히 + 생성일 한 줄 + 썸네일·배너 이미지가 담긴 예쁜 카드가 나와요!

📌 자주 나는 에러
- 이미지가 안 보여요 — 원인: URL에 확장자가 없거나 비공개(로그인 필요) 주소. 해결:
.png·.jpg로 끝나는 공개 이미지 URL을 쓰세요. - HTTPException: In embeds.0.fields.0.value: This field is required — 원인:
value가 빈 문자열. 해결: 필드 값에 최소 한 글자라도 넣어주세요. /서버정보가 안 떠요 — 원인:tree.sync()누락 또는 반영 지연. 해결:on_ready에서 sync 했는지 확인하고, 전역 동기화는 최대 1시간 걸릴 수 있으니 테스트는 길드 동기화를 쓰면 빨라요.- 멤버 수가
None명 · 채널 수0개로 나와요 (제가 실제로 막혔던 부분!) — 증상: 서버 이름도 안 뜨고 멤버 수None, 채널 수0, 생성일만 정상. 원인: 봇이 그 서버에 실제로 들어가 있지 않아서예요. 앱을 「유저 설치(User Install)」로만 추가하면 슬래시 명령어는 떠도 봇은 서버 멤버가 아니라 서버 정보에 접근할 수 없어요(fetch_guild시404 Unknown Guild, 에러코드10004). 해결: 개발자 포털 → OAuth2 → URL Generator에서 스코프bot+applications.commands를 체크해 초대 링크를 만들고, 그 링크로 봇을 서버에 초대하세요. 서버 멤버 목록에 봇이 보이면 성공! 다시/서버정보를 실행하면 멤버·채널 수가 제대로 나옵니다.
💬 마무리
오늘은 임베드(Embed)로 제목·설명·색상·필드 정렬·썸네일·배너 이미지까지 넣어 봇 메시지를 카드처럼 꾸며봤어요. 이제 밋밋한 텍스트 대신 보기 좋은 정보 카드를 보낼 수 있어요! 🙌
다음 #9편에서는 버튼 + 임베드를 합쳐서 페이지를 넘기는 "임베드 페이지네이션"을 만들어볼게요. 기대해주세요!
📚 디스코드 봇 만들기 시리즈
- #5 버튼(Button) 상호작용
- #6 드롭다운(Select Menu) 메뉴
- #7 모달(Modal)로 입력 받기
- #8 임베드(Embed) 이미지·필드 꾸미기 ← 지금 이 글!
- #9 임베드 페이지네이션 (예정)
연재 · 32편 중 8번째
디스코드 봇 만들기
- #1디스코드 봇 만들기 - Slash Command 완전 정복!
- #2Slash Command에 옵션(Arguments) 추가하기!
- #3Slash Command에 서브 커맨드(Subcommand) 넣기!
- #4Slash Command로 임베드 전송하기!
- #5버튼(Button) 상호작용 구현하기!
- #6드롭다운(Select Menu) 메뉴 구현하기!
- #7모달(Modal)로 입력 받기 구현하기 (파이썬 예제)
- #8임베드(Embed) 이미지·필드로 꾸미기 (파이썬 예제)지금 읽는 글
- #9AI(Claude·ChatGPT API) 연동하기! (파이썬 예제)
- #10다국어(i18n) 지원하기! (파이썬 예제)
- #11플라스크(Flask)로 웹 대시보드 만들기! (파이썬 예제)
- #12명령어 쿨다운(Cooldown)·권한(Permission) 관리하기! (파이썬 예제)
- #13역할·채널 자동화로 서버 관리하기! (파이썬 예제)
- #14데이터 저장하기! JSON vs SQLite (파이썬 예제)
- #15슬래시 명령어 그룹(Group)으로 명령어 정리하기! (파이썬 예제)
- #16리마인더·알림 기능 만들기! 봇이 먼저 말 걸게 하기 (파이썬 예제)
- #17RAG로 문서 기반 답변봇 만들기! 우리 서버 전용 FAQ 봇 (파이썬 예제)
- #18투표(Poll) 기능 만들기! 다수결로 정하는 서버 규칙 (파이썬 예제)
- #19Cog로 코드 쪼개기! 1000줄 봇도 안 더러워지는 구조 (파이썬 예제)
- #20자동 환영 메시지·온보딩 만들기! 규칙 동의 버튼으로 자동 역할 부여 (파이썬 예제)
- #21키워드 자동응답·금지어 필터 만들기! 경고 누적으로 자동 제재까지 (파이썬 예제)
- #22슬래시 명령어 자동완성(Autocomplete) 만들기! 금지어를 골라서 추가·삭제 (파이썬 예제)
- #23aiosqlite로 비동기 DB 제대로 설계하기! JSON 탈출 (파이썬 예제)
- #24채널 난독화(Channel Obfuscation) 대응하기! 11/16부터 안 보이는 채널이 생겨요 (파이썬 예제)
- #25봇이 죽지 않게! 에러 핸들링·로깅 체계 잡기 (파이썬 예제)
- #26티켓(Ticket) 문의 시스템 만들기! 버튼 하나로 1:1 상담 채널 자동 생성 (파이썬 예제)
- #27티켓 담당자 배정·우선순위 만들기! 스태프가 여러 명이어도 안 꼬이게 (파이썬 예제)
- #28레벨·경험치(XP) 시스템 만들기! 채팅할수록 레벨업, 랭킹판까지 (파이썬 예제)
- #29화폐·상점(Economy) 시스템 만들기! 코인 벌어서 아이템 사기 (파이썬 예제)
- #30투표·설문(Poll) 봇 만들기! 네이티브 투표 + 버튼으로 실시간 집계까지 (파이썬 예제) 🗳️
- #32서버 로그·감사(Audit Log) 채널 만들기! 메시지 삭제·수정·입퇴장·추방까지 자동 기록 (파이썬 예제) 🕵️
- #33임시 음성방 확장, 파티방 만들기! 방장 위임·강퇴·초대 전용(비공개) 방 + 전용 채팅방 자동 생성 (파이썬 예제) 🎉
