LEVEL 50 QUEST
프로젝트 구조 설계
MVC 패턴 기반 디렉토리 구조, 라우터, 오토로더, 환경변수 관리까지
MVC 기반 디렉토리 구조
AgentDesk 프로젝트 전체 구조
깔끔하고 확장 가능한 MVC(Model-View-Controller) 패턴으로 설계합니다.
각 디렉토리의 역할을 명확히 분리하면 유지보수가 쉬워집니다.
agentdesk/
├── public/ # 웹 루트 (외부 접근 가능)
│ ├── index.php # 프론트 컨트롤러 (모든 요청의 시작점)
│ ├── .htaccess # URL 리라이트 규칙
│ └── assets/ # CSS, JS, 이미지
│ ├── css/
│ ├── js/
│ └── img/
├── app/ # 애플리케이션 핵심 코드
│ ├── Controllers/ # 컨트롤러 (요청 처리)
│ │ ├── AuthController.php
│ │ ├── DashboardController.php
│ │ ├── AgentController.php
│ │ └── ApiController.php
│ ├── Models/ # 모델 (데이터베이스 로직)
│ │ ├── User.php
│ │ ├── Tenant.php
│ │ ├── Subscription.php
│ │ ├── AIAgent.php
│ │ └── Conversation.php
│ ├── Views/ # 뷰 (HTML 템플릿)
│ │ ├── layouts/
│ │ │ └── main.php
│ │ ├── auth/
│ │ │ ├── login.php
│ │ │ └── register.php
│ │ ├── dashboard/
│ │ └── agent/
│ ├── Middleware/ # 미들웨어 (인증, 권한 체크)
│ │ ├── AuthMiddleware.php
│ │ └── TenantMiddleware.php
│ └── Services/ # 서비스 (비즈니스 로직)
│ ├── AIService.php
│ ├── PaymentService.php
│ └── EmailService.php
├── core/ # 프레임워크 핵심
│ ├── Router.php
│ ├── Database.php
│ ├── Request.php
│ ├── Response.php
│ └── App.php
├── config/ # 설정 파일
│ ├── config.php
│ ├── database.php
│ └── routes.php
├── storage/ # 로그, 캐시, 업로드
│ ├── logs/
│ ├── cache/
│ └── uploads/
├── migrations/ # DB 마이그레이션 파일
├── vendor/ # Composer 의존성 (자동 생성)
├── .env # 환경변수 (Git 제외!)
├── .env.example # 환경변수 템플릿
├── .gitignore
└── composer.json
Model (모델)
데이터베이스와 직접 소통하는 계층. 데이터 조회, 삽입, 수정, 삭제 로직을 담당합니다.
View (뷰)
사용자에게 보여지는 HTML 화면. 컨트롤러에서 전달받은 데이터를 표시합니다.
Controller (컨트롤러)
요청을 받아 모델에서 데이터를 가져오고, 뷰에 전달하는 중간 다리 역할입니다.
핵심 파일 구현
public/index.php - 프론트 컨트롤러
모든 HTTP 요청이 이 파일 하나로 들어옵니다. 여기서 라우터가 적절한 컨트롤러에 요청을 배분합니다.
<?php
/**
* AgentDesk - Front Controller
* 모든 HTTP 요청의 시작점
*/
declare(strict_types=1);
// 에러 리포팅 (개발 중)
error_reporting(E_ALL);
ini_set('display_errors', '1');
// 프로젝트 루트 정의
define('ROOT_PATH', dirname(__DIR__));
// Composer 오토로더
require ROOT_PATH . '/vendor/autoload.php';
// 환경변수 로드
$dotenv = Dotenv\Dotenv::createImmutable(ROOT_PATH);
$dotenv->load();
// 세션 시작
session_start();
// 설정 로드
$config = require ROOT_PATH . '/config/config.php';
// 애플리케이션 초기화 및 실행
$app = new Core\App($config);
$app->run();
public/.htaccess - URL 리라이트
모든 요청을 index.php로 라우팅합니다. 실제 파일/디렉토리가 있으면 그대로 서빙합니다.
RewriteEngine On
# HTTPS 리다이렉트
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# 실제 파일이나 디렉토리가 아니면 index.php로
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
# 보안: .env, .git 등 숨김 파일 접근 차단
RewriteRule (^\.|/\.) - [F]
# 디렉토리 목록 비활성화
Options -Indexes
config/config.php - 설정 파일
<?php
// 환경변수에서 값을 가져와 배열로 반환
return [
'app' => [
'name' => $_ENV['APP_NAME'] ?? 'AgentDesk',
'env' => $_ENV['APP_ENV'] ?? 'production',
'debug' => ($_ENV['APP_DEBUG'] ?? 'false') === 'true',
'url' => $_ENV['APP_URL'] ?? 'http://localhost',
],
'database' => [
'host' => $_ENV['DB_HOST'] ?? '127.0.0.1',
'port' => $_ENV['DB_PORT'] ?? '3306',
'database' => $_ENV['DB_DATABASE'] ?? 'agentdesk',
'username' => $_ENV['DB_USERNAME'] ?? 'root',
'password' => $_ENV['DB_PASSWORD'] ?? '',
'charset' => 'utf8mb4',
],
'ai' => [
'openai_key' => $_ENV['OPENAI_API_KEY'] ?? '',
'model' => $_ENV['AI_MODEL'] ?? 'gpt-4o-mini',
'max_tokens' => (int)($_ENV['AI_MAX_TOKENS'] ?? 1000),
],
];
🔒
여기까지는 미리보기입니다
프로젝트 구조 설계
무료 가입하면 이어서 볼 수 있고, 강의를 완료할 때마다 XP와 레벨이 쌓입니다.
Google로 3초 만에 시작 →🧵 Threads로 시작무료 공개 강의 둘러보기 (Lv.1~3)무료 가입하면 이어서 볼 수 있고, 강의를 완료할 때마다 XP와 레벨이 쌓입니다.