이 가이드는 mublo 코어가 실제로 어떻게 짜여 있는지를 설명한다. 확장(플러그인/패키지)을 만드는 법이 아니라, src/ 아래의 클래스들이 하나의 HTTP 요청을 어떤 순서로 처리하는지, 각 책임이 어느 파일에 있는지를 짚어 준다. 코드를 처음 여는 사람이 "이 기능은 이 파일을 보면 된다"를 알 수 있도록 이정표를 주는 것이 목적이다.
실행의 중심 — Application
모든 요청은 src/Core/App/Application.php 한 곳으로 수렴한다. Application은 진입점이자 실행 흐름의 지휘자로, 스스로 비즈니스 로직을 두지 않고 각 단계를 전담 객체에 위임한다. 실제로 처리되는 큰 흐름은 다음과 같다.
Request → Context → (Extensions) → Middleware → Router → Dispatcher → Response → Rendering
Application::run()의 주석에도 축약된 형태(Request → Context → Router → Dispatcher → Response → Rendering / Output)로 흐름이 적혀 있으니 참고하라. 그에 앞서 Application::boot()이 환경변수·에러핸들러·ServiceProvider·이벤트 시스템을 준비하고, run() 본문이 위 순서를 차례로 돌린다. 참고로 코어 버전은 Application::VERSION 상수가 단일 진실원천(SSOT)이다.
요청 흐름과 담당 파일
| 단계 | 책임 | 주요 파일 |
|---|---|---|
| Request | 전역 변수 수집·위험 경로 차단 | src/Core/Http/Request.php |
| Context | 요청 해석 결과(도메인·Front/Admin/Api·스킨) 보관 | src/Core/Context/Context.php, ContextBuilder.php |
| Extension | 활성 플러그인/패키지 로딩·Provider boot | src/Core/Extension/ExtensionManager.php |
| Middleware | 세션·CSRF·보안헤더·인증 | src/Core/Middleware/MiddlewarePipeline.php |
| Router | URL → Controller/Method 결정(FastRoute) | src/Core/App/Router.php |
| Dispatcher | Controller 생성·Action 호출(DI 주입) | src/Core/App/Dispatcher.php |
| Rendering | ViewResponse → 화면 조립 | src/Core/Rendering/FrontViewRenderer.php, AdminViewRenderer.php |
관통하는 두 축 — 컨테이너와 이벤트
흐름 전체를 지탱하는 두 기반 시설이 있다. 하나는 src/Core/Container/DependencyContainer.php로, PSR-11 경량 DI 컨테이너다. 명시적 등록을 우선하고 Service 네임스페이스만 auto-wiring 한다(Controller/Context/Response는 auto-wiring 금지). Dispatcher가 Controller 생성자와 Action 파라미터를 Reflection으로 분석해 여기서 의존성을 채운다.
// Dispatcher::invokeAction — Context/라우트 파라미터 자동 주입
public function index(Context $context) { ... }
public function show(array $params, Context $context) { ... }
다른 하나는 src/Core/Event/EventDispatcher.php다. 코어는 확장점마다 이벤트를 발행하고 확장은 이를 구독해 개입한다. 예로 SiteContextReadyEvent·RendererResolveEvent는 src/Core/Event/Rendering/ 하위에, RequestInterceptEvent는 src/Core/Event/ 바로 아래에 있다. 코어와 확장의 계약은 src/Contract/ 인터페이스 + src/Core/Registry/ContractRegistry.php(1:1 bind / 1:N register)로 이어진다.
src/ 디렉토리 지도
src/Core/— 프레임워크 뼈대. 위 표의 App·Context·Middleware·Rendering·Container·Event·Extension·Registry가 모두 여기 있다.src/Controller/—Admin/,Front/,Api/로 나뉜 진입 컨트롤러.src/Service/— 비즈니스 로직 계층(auto-wiring 대상).src/Repository/·src/Entity/— 데이터 접근과 도메인 객체.src/Infrastructure/— DB·캐시·로그·보안 등 하부 기술.src/Contract/— 확장이 구현하는 표준 인터페이스.src/Helper/·src/Enum/·src/Exception/·src/Subscriber/— 보조 유틸·상수·예외·이벤트 구독자.
읽는 순서 팁:
Application::run()을 위에서 아래로 한 번 훑으면 전체 뼈대가 잡힌다. 이후 관심 단계(예: 화면 조립이면FrontViewRenderer)로 내려가면 된다. 각 코어 클래스 상단 주석에 "책임"과 "금지"가 명시돼 있으니, 그 파일이 무엇을 하고 무엇을 하지 않는지 먼저 확인하라.