개발블로그

Laravel 프로젝트 구조와 주요 클래스·MVC패턴 개요 본문

STUDY/Laravel

Laravel 프로젝트 구조와 주요 클래스·MVC패턴 개요

devmel 2026. 8. 11. 20:00
Contents 접기
 

MVC

개념

애플리케이션을 Model, View, Controller 세 가지 역할로 나누어 구성하는 디자인 패턴

하나의 코드에 데이터 처리, 요청 처리, 화면 출력 로직을 모두 작성하는 대신 각각의 책임을 분리하여 코드의 역할을 명확하게 만든다. 

 

구분 역할 비유 Laravel 위치
Model 데이터와 상태를 관리하고 데이터와 관련된 처리를 담당

- 데이터베이스 테이블과 매핑되어, 라라벨의 Eloquent ORM을 통해 데이터를 조회하거나 수정
요리사
: 주방에서 실제 요리(데이터 처리), 냉장고(DB)에서 재료를 꺼내어 로직에 따라 조리함
app/Models/
View 데이터를 사용자가 볼 수 있는 화면으로 표현 플레이팅 resources/views/
Controller 사용자의 요청을 받아 필요한 처리를 연결하고 전체 흐름을 제어
(모델과 뷰를 중개)
웨이터
: 손님의 주문을 받고, 주방에 전달 → 요리가 나오면 손님에게 가져다 줌
app/Http/Controllers/

 

 

사용

  지향 지양
Controller
  • Reuqest 데이터 받기 ($request → input())
  • FormRequest로 검증 호출
  • 권한 체크
  • 서비스/리포지토리 호출
  • response/redirect/json 반환
아래 로직들은 서비스로 빼는 게 좋음
  • 트랜잭션이 필요한 여러 단계 로직
  • 회원탈퇴 같은 업무 흐름(유저 상태 변경 + 토큰 삭제 + 연결 해제 + 로그 저장)
  • 여러 모델이 동시에 얽히는 처리
  • 외부 API 호출 + 예외처리 + DB업데이트
Model
  • 관계정의 : user(), tags()..
  • 스코프 : scopeActive(), scopePublished()
  • 캐스팅/액세서 : getProfileImageUrlArtibute
  • 간단한 도메인 규칙(너무 무겁지 않은 것)
ex) isAdmin(), activate(), deactivate()
한 테이블/엔티티 중심을 넘어서면 과해짐
  • 회원가입 전체 흐름 같은 유스케이스
  • 외부 api 연동(카카오/구글 등)
  • 여러 모델을 동시에 바꾸는 처리


View  
  • 복잡한 데이터 가공(정렬/필터링/권한에 따른 분기 로직)
  • db호출 (balde에서 쿼리 날리는 패턴)

 

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 설정