| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 |
- 디자인패턴
- MySQL
- mcp server
- SQL문법
- Agent Loop
- SQL
- OOP
- MCP
- PHP
- 객체지향
- 어댑터패턴
- LLM
- PHP객체지향
- 객체복제
- SQL기초
- Laravel
- Tool Calling
- 소프트웨어설계
- docker network
- mcp client
- 데이터베이스
- linux 권한
- 인덱스
- ai 에이전트
- 데코레이터패턴
- 라라벨
- dhgrp
- docker
- 매직메서드
- ai agent
- Today
- Total
개발블로그
Laravel 프로젝트 구조와 주요 클래스·MVC패턴 개요 본문
MVC
개념
애플리케이션을 Model, View, Controller 세 가지 역할로 나누어 구성하는 디자인 패턴
하나의 코드에 데이터 처리, 요청 처리, 화면 출력 로직을 모두 작성하는 대신 각각의 책임을 분리하여 코드의 역할을 명확하게 만든다.

| 구분 | 역할 | 비유 | Laravel 위치 |
| Model | 데이터와 상태를 관리하고 데이터와 관련된 처리를 담당 - 데이터베이스 테이블과 매핑되어, 라라벨의 Eloquent ORM을 통해 데이터를 조회하거나 수정 |
요리사 : 주방에서 실제 요리(데이터 처리), 냉장고(DB)에서 재료를 꺼내어 로직에 따라 조리함 |
app/Models/ |
| View | 데이터를 사용자가 볼 수 있는 화면으로 표현 | 플레이팅 | resources/views/ |
| Controller | 사용자의 요청을 받아 필요한 처리를 연결하고 전체 흐름을 제어 (모델과 뷰를 중개) |
웨이터 : 손님의 주문을 받고, 주방에 전달 → 요리가 나오면 손님에게 가져다 줌 |
app/Http/Controllers/ |
사용
| 지향 | 지양 | |
| Controller |
|
아래 로직들은 서비스로 빼는 게 좋음
|
| Model |
|
한 테이블/엔티티 중심을 넘어서면 과해짐
|
| View |
|
Laravel MVC 확장구조
기존 MVC 구조만으로도 애플리케이션을 만들 수 있지만,
기능이 많아질수록 Controller와 Model에 여러 책임이 집중될 수 있다.
ex) Controller에 입력 검증, 권한 확인, 비지니스 로직, 데이터 조회, 화면 데이터 가공, 후속작업 까지 모두 처리하면 코드가 길어지고 수정이나 테스트가 어려워 짐.

| 위치 | 구조 | 간단한 역할 |
| Controller 앞 | Route | URL과 처리 코드 연결 |
| Middleware | 요청 전·후 공통 처리 | |
| FormRequest | 입력값 검증 ·인가 | |
| Controller | Controller | 요청 처리 흐름 연결 |
| Policy | 리소스 접근 권한 판단 | |
| Controller ↔ Model | DTO | 전달 데이터 구조화 |
| Service | 비지니스 업무 흐름 | |
| Action | 하나의 구체적인 동작 | |
| 데이터 접근 | Query | 복잡한 조회 조건 분리 |
| Repository | 데이터 접근 로직 분리 | |
| Model | Model | 데이터·관계 관리 |
| Cast/Accessor | Model값 변환 ·가공 | |
| Scope | 반복 조회 조건 | |
| Observer | Model 변경 감지 | |
| Model ↔ View | Presenter | 객체의 화면 표현 가공 |
| ViewModel | 화면에 필요한 데이터 구성 | |
| View | Blade | 화면 Template |
| Layout | 공통 화면 골격 | |
| Component | 재사용 UI | |
| API | Resource | API JSON 응답 변환 |
| 후속 처리 | Event | 발생한 사건 표현 |
| Listener | Event 후속 처리 | |
| Job / Queue | 비동기 작업 |
라라벨 폴더 구조
| 표시 | 구분 | 의미 |
| 🟢 | 기본 | Laravel 설치 시 기본으로 존재 |
| 🔵 | 공식 | Laravel 공식 기능이며 필요 시 Artisan 명령 등으로 생성 |
| 🟠 | 관례 | Laravel 공식 계층은 아니며 프로젝트 설계에 따라 직접 추가 |
| 🟣 | 패키지 | Livewire 등 별도 패키지를 사용할 때 추가 |
Laravel Project
│
├── app/ → 애플리케이션 핵심 PHP 코드
│ │
│ ├── 🟢 Http/ → HTTP 요청 처리 영역
│ │ │
│ │ ├── 🟢 Controllers/ → 요청을 받고 처리 흐름 연결
│ │ │ ├── Controller.php → 기본 Controller
│ │ │ ├── PostController.php → 게시글 요청 처리
│ │ │ └── OrderController.php → 주문 요청 처리
│ │ │
│ │ ├── 🔵 Middleware/ → 요청 전/후 공통 처리
│ │ │ ├── Authenticate.php → 인증 확인
│ │ │ └── CheckAdmin.php → 관리자 접근 확인
│ │ │
│ │ ├── 🔵 Requests/ → 입력값 검증 + 요청 권한 확인
│ │ │ ├── StorePostRequest.php → 게시글 생성 검증
│ │ │ └── UpdatePostRequest.php → 게시글 수정 검증
│ │ │
│ │ └── 🔵 Resources/ → Model → API JSON 구조 변환
│ │ ├── PostResource.php → 게시글 API 응답
│ │ └── UserResource.php → 사용자 API 응답
│ │
│ │
│ ├── 🟢 Models/ → Eloquent Model
│ │ ├── User.php → 사용자 Model
│ │ ├── Post.php → 게시글 Model
│ │ ├── Order.php → 주문 Model
│ │ │
│ │ └── 🔵 Scopes/ → Eloquent Global Scope
│ │ └── PublishedScope.php → 공통 게시 상태 Query 조건
│ │
│ │
│ ├── 🟢 Providers/ → 서비스 등록·앱 초기 설정
│ │ ├── AppServiceProvider.php → 기본 Service Provider
│ │ └── PaymentServiceProvider.php → 추가 서비스 등록
│ │
│ │
│ ├── 🔵 Casts/ → Model Attribute 값 변환
│ │ └── MoneyCast.php → DB 값 ↔ Money 객체
│ │
│ ├── 🔵 Policies/ → Model/Resource 권한 규칙
│ │ └── PostPolicy.php → 게시글 조회·수정·삭제 권한
│ │
│ ├── 🔵 Events/ → 어떤 일이 발생했다는 사실
│ │ ├── PostCreated.php → 게시글 생성됨
│ │ ├── OrderPaid.php → 주문 결제됨
│ │ └── UserRegistered.php → 회원 가입됨
│ │
│ ├── 🔵 Listeners/ → Event 발생 후 실행할 처리
│ │ ├── UpdateSearchIndex.php → 검색 인덱스 갱신
│ │ └── SendOrderNotification.php → 주문 알림 발송
│ │
│ ├── 🔵 Observers/ → Model 생성·수정·삭제 Event 감지
│ │ └── PostObserver.php → Post Model 변경 처리
│ │
│ ├── 🔵 Jobs/ → 오래 걸리는 작업·Queue 작업
│ │ ├── ResizeImage.php → 이미지 리사이즈
│ │ ├── SyncExternalPosts.php → 외부 API 동기화
│ │ └── UpdateSearchIndex.php → 검색 인덱스 처리
│ │
│ ├── 🔵 Notifications/ → 사용자 알림
│ │ └── CommentCreatedNotification.php → 댓글 생성 알림
│ │
│ ├── 🔵 Mail/ → 이메일 구성
│ │ └── OrderCompletedMail.php → 주문 완료 이메일
│ │
│ ├── 🔵 Console/
│ │ └── Commands/ → 직접 만든 Artisan CLI
│ │ └── UpdateRanking.php → 랭킹 갱신 배치
│ │
│ ├── 🔵 Rules/ → Custom Validation Rule
│ │ └── ValidUsername.php → 사용자명 검증
│ │
│ ├── 🔵 Exceptions/ → 사용자 정의 Exception
│ │ └── PaymentException.php → 결제 관련 예외
│ │
│ ├── 🔵 Broadcasting/ → Broadcast Channel 관련 처리
│ │
│ ├── 🔵 View/
│ │ └── Components/ → Class 기반 Blade Component
│ │ └── Alert.php → 공통 Alert UI
│ │
│ │
│ │ ───────────── 관례적으로 추가 ─────────────
│ │
│ ├── 🟠 Services/ → 실제 비즈니스 업무 흐름
│ │ ├── PostService.php → 게시글 관련 업무
│ │ ├── OrderService.php → 주문 생성·취소·환불
│ │ └── PaymentService.php → 결제 처리
│ │
│ ├── 🟠 Actions/ → 하나의 구체적인 동작·Use Case
│ │ ├── CreatePost.php → 게시글 하나 생성
│ │ ├── AttachTags.php → 태그 연결
│ │ ├── CreateOrder.php → 주문 하나 생성
│ │ └── CancelOrder.php → 주문 하나 취소
│ │
│ ├── 🟠 DTOs/ → 계층 사이에서 전달할 데이터 객체
│ │ ├── CreatePostData.php → 게시글 생성 데이터
│ │ └── CreateOrderData.php → 주문 생성 데이터
│ │
│ ├── 🟠 Queries/ → 복잡한 읽기·검색·필터 Query
│ │ ├── PostListQuery.php → 게시글 목록 검색/필터
│ │ └── OrderStatisticsQuery.php → 주문 통계 조회
│ │
│ ├── 🟠 Repositories/ → 데이터 접근 로직 추상화
│ │ ├── PostRepository.php → 게시글 데이터 접근
│ │ └── OrderRepository.php → 주문 데이터 접근
│ │
│ ├── 🟠 Presenters/ → 객체를 화면 표시용으로 가공
│ │ └── OrderPresenter.php → paid → 결제 완료
│ │ → 35000 → 35,000원
│ │
│ ├── 🟠 ViewModels/ → 특정 화면 전체에 필요한 데이터
│ │ └── OrderDetailViewModel.php → 주문·결제·배송 데이터 조합
│ │
│ ├── 🟠 ValueObjects/ → 의미를 가진 값을 객체화
│ │ ├── Money.php → 금액 + 통화
│ │ └── Address.php → 주소 값 객체
│ │
│ ├── 🟠 Enums/ → 상태·분류·고정 옵션값
│ │ ├── PostStatus.php → Draft / Published / Archived
│ │ └── OrderStatus.php → 주문 상태
│ │
│ ├── 🟠 Concerns/ → 여러 클래스에서 재사용할 Trait
│ │ ├── HasSlug.php → Slug 공통 기능
│ │ └── InteractsWithImages.php → 이미지 공통 기능
│ │
│ └── 🟣 Livewire/ → Livewire Component 로직
│ └── Profile/
│ └── EditProfile.php → 프로필 화면 상태·동작
│
│
├── 🟢 bootstrap/ → Laravel 앱 부팅·초기화
│ ├── app.php → Routing·Middleware·Exception 설정
│ ├── providers.php → Service Provider 등록
│ └── cache/ → Framework 최적화 Cache
│ ├── config.php → 설정 Cache 등
│ └── ... → Framework가 자동 생성
│
│
├── 🟢 config/ → 애플리케이션 설정
│ ├── app.php → 앱 이름·Locale 등
│ ├── auth.php → 인증 설정
│ ├── cache.php → Cache 설정
│ ├── database.php → DB·Redis 연결
│ ├── filesystems.php → Local·S3 등 File Storage
│ ├── logging.php → Log 설정
│ ├── mail.php → Mail 설정
│ ├── queue.php → Queue 설정
│ ├── services.php → 외부 API 서비스 설정
│ └── session.php → Session 설정
│
│ .env
│ ↓
│ config/*.php
│ ↓
│ config()
│
│
├── 🟢 database/ → DB 관련 코드
│ │
│ ├── migrations/ → Table·Column·Index 변경 이력
│ │ └── xxxx_create_posts_table.php
│ │
│ ├── seeders/ → 초기·샘플 데이터 입력
│ │ ├── DatabaseSeeder.php
│ │ └── PostSeeder.php
│ │
│ └── factories/ → 테스트용 가짜 Model 데이터
│ ├── UserFactory.php
│ └── PostFactory.php
│
│
├── 🔵 lang/ → 다국어 번역 문자열
│ ├── ko/
│ │ └── messages.php
│ ├── en/
│ │ └── messages.php
│ ├── ko.json
│ └── en.json
│
│
├── 🟢 public/ → 웹 서버 Document Root
│ ├── index.php → HTTP 요청 진입점
│ ├── .htaccess → Apache Rewrite
│ ├── robots.txt → 검색 Bot 설정
│ │
│ ├── 🔵 build/ → Vite Build 결과 JS/CSS
│ │
│ └── 🔵 storage/ → storage/app/public Symbolic Link
│
│
├── 🟢 resources/ → 사용자 UI 원본
│ │
│ ├── views/ → Blade Template
│ │ ├── welcome.blade.php
│ │ ├── 🟠 layouts/ → 공통 Layout
│ │ │ └── app.blade.php
│ │ ├── 🟠 posts/
│ │ │ ├── index.blade.php
│ │ │ └── show.blade.php
│ │ └── 🟣 livewire/ → Livewire View
│ │
│ ├── css/ → CSS Source
│ │ └── app.css
│ │
│ ├── js/ → JS Source·Vite Entry
│ │ └── app.js
│ │
│ └── 🟠 sass/ → Sass 사용 시 추가
│
│
├── 🟢 routes/ → URL 요청의 진입 경로 정의
│ │
│ ├── web.php → Web Page Route
│ │
│ ├── console.php → Console Command·Schedule
│ │
│ ├── 🔵 api.php → Stateless API Route
│ │
│ └── 🔵 channels.php → Broadcasting Channel 권한
│
│
├── 🟢 storage/ → Application 생성 파일
│ │
│ ├── app/ → 애플리케이션 저장 파일
│ │ ├── private/ → 비공개 저장 파일
│ │ └── public/ → 공개 가능한 Upload 파일
│ │
│ ├── framework/ → Laravel 실행 중 생성 파일
│ │ ├── cache/ → Cache
│ │ ├── sessions/ → File Session
│ │ └── views/ → Compile된 Blade
│ │
│ └── logs/ → Application Log
│ └── laravel.log
│
│
├── 🟢 tests/ → 자동화 Test
│ ├── Feature/ → HTTP·DB·기능 단위 Test
│ ├── Unit/ → 작은 독립 로직 Test
│ └── TestCase.php → Laravel Test 기본 클래스
│
│
├── 🟢 vendor/ → Composer로 설치한 PHP Package
│
│
│ ───────────── 프로젝트 루트 주요 파일 ─────────────
│
├── 🟢 artisan → Laravel CLI 실행 진입점
│
├── 🟢 .env → 환경별 설정·Secret
│ DB / Redis / Mail / APP_KEY 등
│
├── 🟢 .env.example → .env 작성용 예제
│
├── 🟢 composer.json → PHP Package·PSR-4 Autoload
│
├── 🟢 composer.lock → 설치 Package Version 고정
│
├── 🟢 package.json → npm Package·Frontend Script
│
├── 🟢 package-lock.json → Node Package Version 고정
│
├── 🟢 vite.config.js → Vite Build·HMR 설정
│
├── 🟢 phpunit.xml → Test 환경 설정
│
├── 🟢 .gitignore → Git 제외 대상
│
├── 🟢 .gitattributes → Git File 설정
│
└── 🟢 .editorconfig → Editor Formatting 설정
'STUDY > Laravel' 카테고리의 다른 글
| [Laravel 데이터 및 상태 관리] Redis 활용 (0) | 2026.08.14 |
|---|---|
| [Laravel 데이터 및 상태 관리] 성능 및 데이터 재사용 - Cache (0) | 2026.08.13 |
| [Laravel 데이터 및 상태 관리] 사용자 상태 관리 - Cookie와 Session (0) | 2026.08.13 |
| Laravel 화면 데이터 구성 - Presenter, ViewModel, View Composer (0) | 2026.08.12 |