app.py 유지하면서 Cogs로 파일 쪼개기 및 한 번에 실행하기

Q&A 아카이브2026년 8월 10일·메시지 11

원본 디스코드 대화 기록 (11개 메시지)

질문자06. 28. PM 02:36

app.py로 구축을하엿습니다 하지만 명령어가 많아지다보니 파일을 쪼개야할거같아서요 디스호스트에서는 app.py가 기본실행파일인데 쪼개는법과 한번에 켜지는방법을 알려주실수있을까용..

용기있는 사슴06. 28. PM 02:39

Cogs를 검색해보세요!

질문자06. 28. PM 02:52

오...

질문자06. 28. PM 02:52

확인하였습니다

질문자06. 28. PM 02:52

감사합니당

창의적인 코알라06. 29. AM 07:16

클로드나 코덱스에 커서에 파일 올리고 쪼개 달라고 하면 깔끔하고 완벽하게 쪼개줍니다

질문자06. 29. AM 07:27

클로드 무료사용가능한가용?

정직한 펭귄06. 29. PM 03:13

어떤 봇인지 정확히 모르기 때문에, 대략적인 과정을 먼저 말씀드리자면,

1. 명령어를 카테고리 별로 분리한다.

명령어들의 주제가 비슷한 것 끼리 분류 하는 과정입니다. 이 과정을 거치셔야 AI한테 부탁할때 ,프롬포트 작성하기 조금 수월할 것입니다.

예시 (서버 관리 봇)

  • 실행 파일(app.py)
  • 로그 기록 하는 cog
  • 티켓 툴 생성하고 관리하는 cog
  • 서버 제재 cog

이런 식으로 작성 했던 것 같습니다.

정직한 펭귄06. 29. PM 03:16

2. app.py 작성

cog로 방식으로 전환하면 실행파일(app.py)에 이제 만드신 cog를 불러오는 소스코드가 있어야 합니다. 이건 제 파일 예시로 첨부해드리니, app.py는참고 해보시면 좋을거 같습니다.

정직한 펭귄06. 29. PM 03:18
import asyncio
import os
from pathlib import Path
from typing import List

import discord
from discord.ext import commands
from dotenv import load_dotenv

load_dotenv()


class BotName(commands.Bot):
    def __init__(self):
        raw_prefixes = os.getenv("BOT_PREFIXES")
        prefixes: List[str] = [p.strip() for p in raw_prefixes.split(",")]

        intents = discord.Intents.default()
        intents.members = True
        intents.message_content = True
        intents.voice_states = True

        super().__init__(
            command_prefix=prefixes,
            intents=intents,
            help_command=None
        )

    async def setup_hook(self):
        """봇 실행 시 Cog 파일 자동 로드"""
        cogs_path = Path(__file__).parent / "cogs"

        if not cogs_path.exists():
            cogs_path.mkdir()
            print("📂 'cogs' 폴더가 없어 새로 생성합니다.")

        for filepath in cogs_path.glob("*.py"):
            if filepath.stem.startswith("__"):
                continue

            cog_name = f"cogs.{filepath.stem}"
            try:
                await self.load_extension(cog_name)
                print(f"✅ {cog_name} 로드 성공")
            except Exception as e:
                print(f"❌ {cog_name} 로드 실패 -> {e}")

    async def on_ready(self):
        print("-" * 30)
        print(f"🟢 {self.user.name} 온라인")
        print(f"🆔 ID: {self.user.id}")
        print("-" * 30)
        await self.change_presence()


async def main():
    bot = BotName()
    token = os.getenv("BOT_TOKEN")

    if not token:
        print("❌ 오류: BOT_TOKEN이 .env에서 설정되지 않았습니다.")
        return

    async with bot:
        try:
            await bot.start(token)
        except discord.LoginFailure:
            print("❌ 오류: 토큰이 유효하지 않음")
        except Exception as e:
            print(f"❌ 실행 중 오류 발생: {e}")


if __name__ == "__main__":
    try:
        asyncio.run(main())
    except KeyboardInterrupt:
        print("\n종료 신호를 감지, 봇 종료.")```