이미지를 채팅으로 보내는 방법을 정리한다. 이미지 URL로 링크만 보내는 방식, 메시지로 파일을 업로드하는 방식, 임베드(embed)에 이미지를 표시하는 방식 각각의 구현 예제와 호스팅 관련 주의사항을 다룬다.
증상
봇이 이미지를 보내려 할 때 텍스트만 전송되거나 링크가 미리보기로 뜨지 않거나, 로컬 파일 경로에서 이미지를 읽지 못해 에러가 발생할 수 있다. 임베드에 이미지가 보이지 않거나, 업로드 파일이 용량 제한 때문에 실패하는 경우도 있다.
원인
- 이미지 주소(URL)가 HTTPS가 아니거나 직접 이미지 파일을 반환하지 않아 Discord가 가져오지 못함.
- 이미지 URL이 인증이 필요한 리다이렉트 또는 접근 제한이 걸려 있음.
- 로컬 파일 경로가 호스팅 환경(예: 리눅스 컨테이너)에서 존재하지 않거나 경로/대소문자 문제로 접근 실패.
- 업로드 파일이 Discord의 파일 크기 제한을 초과함(기본 8MB, 서버 업그레이드에 따라 다름).
- 코드에서 올바른 라이브러리 API를 사용하지 않음(버전에 따른 API 변경).
해결 방법
1단계: 가장 간단한 방법 — 이미지 URL을 사용해 임베드로 표시
이미지가 외부에 공개된 HTTPS URL로 존재하면 임베드의 image 필드에 넣으면 빠르게 미리보기를 띄울 수 있다. URL은 직접 이미지 파일을 반환해야 하고, 가능하면 확장자(.png/.jpg/.gif)나 올바른 Content-Type을 가지는지 확인한다.
예: discord.js (v14) 예제
// Node.js + discord.js v14
const { Client, GatewayIntentBits, EmbedBuilder } = require('discord.js');
const client = new Client({ intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages, GatewayIntentBits.MessageContent] });
client.on('messageCreate', message => {
if (message.content === '!image') {
const embed = new EmbedBuilder()
.setTitle('샘플 이미지')
.setImage('https://example.com/image.png');
message.channel.send({ embeds: [embed] });
}
});
client.login(process.env.TOKEN);
예: discord.py (v2) 예제
# Python + discord.py v2
from discord.ext import commands
from discord import Embed
bot = commands.Bot(command_prefix='!')
@bot.command()
async def image(ctx):
embed = Embed(title="샘플 이미지")
embed.set_image(url="https://example.com/image.png")
await ctx.send(embed=embed)
bot.run(os.getenv("TOKEN"))
2단계: 로컬 파일을 업로드해서 전송하기
로컬 파일을 직접 전송하려면 실행 환경에서 파일이 접근 가능한지 확인한다. 개발 머신(macOS)에서는 경로가 동작해도, 호스팅 환경은 대소문자 구분이나 상대경로가 달라 실패할 수 있다. 배포 시 파일을 컨테이너에 포함하거나, 외부 스토리지에 업로드한 뒤 URL로 제공하는 방식을 권장한다.
discord.js (v14) 파일 업로드 예
const { AttachmentBuilder } = require('discord.js');
const file = new AttachmentBuilder('./images/pic.png');
message.channel.send({ files: [file] });
discord.py 파일 업로드 예
from discord import File
await ctx.send(file=File('images/pic.png'))
3단계: 호스팅 전략과 권장 방식
- 파일 크기 제한 문제를 피하려면 외부 스토리지(CDN, S3, Cloudflare R2 등)에 업로드하고 공개 HTTPS 링크를 사용해 임베드로 표시한다.
- 직접 호스팅하는 경우 정적 파일 서버가
Content-Type: image/*를 반환하도록 설정한다. - 디스코드에서 이미지가 보이지 않을 때는 브라우저에서 URL을 열어 직접 접근 가능한지, 리다이렉트나 인증 요구가 없는지 확인한다.
- 개발 환경이 macOS이면 배포 환경(Linux)와 경로/대소문자 차이를 사전에 점검한다.
- 배포(호스팅) 플랫폼으로 디스호스트 같은 서비스를 사용하면 정적 호스팅 또는 객체 스토리지에 이미지를 올리고 그 URL을 임베드에 사용하면 안정적이다.
마무리
이미지를 전송하려면 공개 HTTPS 이미지 URL을 임베드의 image로 사용하는 방법이 가장 간단하며, 로컬 파일 전송은 호스팅 환경과 파일 크기 제한을 반드시 확인해야 한다. 디스코드 봇 개발 시에는 올바른 URL, 접근 권한, 호스팅 설정을 우선 점검하면 문제를 빠르게 해결할 수 있다.