August 7, 2020

PHP MVC - Laravel 디렉터리 구조

Title: PHP Laravel - Directory Tree
Author: DongDongE
Tags: Programming
Release: 2020.08.07


PHP MVC 패턴 - 디렉터리 구조

이번에는 Laravel 프레임워크 디렉터리 구조에 대해 알아보도록 하겠습니다.

라라벨 애플리케이션 구조는 크고,작은 애플리케이션에서 좋은 시작점을 제공하기 위한 의도하고 있습니다.

라라벨은 Composer가 클래스를 자동로드(오토로딩) 할 수 있는 한 클래스를 어디에 위치 시키든지에 대한 제한이 없습니다.

Laravel을 시작할 때 많은 개발자들이 "models" 디렉터리가 없는 것에 대해 띠용? 하면서 혼란스러워 합니다.
그러나 해당 디렉터리가 없는건 의도 되었습니다. "Models"가 많은 사람들에게 각기 다른 의미로 받아져 모호하기 때문이라고 합니다.
일부 개발자들은 애플리케이션 "Models"을 모든 비지니스 로직의 전체로서 참조하는 반면, 다른 개발자들은 "models"를 관계형 데이터베이스와 상호 작용하는데 사용한다고 합니다.

이러한 이유로 Laravel에서는 기본적으로 "Eloquent" 모델을 디렉터리에 배치하고 개발자가 원하는 경우 다른 곳에 배치할 수 있도록 선택합니다.



Root Directory

app Driectory


app 디렉터리는 예상대로 으용 프로그램의 핵심 코드가 포함되어 있으며, 애플리케이션의 거의 모든 클래스가 들어 있습니다.



bootstrap Driectory


bootstrap 디렉터리는 프레임워크의 자동 로딩과 부트스트래핑을 설정하는 파일을 포함하고 있으며, 프레임워크가 라우트나 서비스 캐시 파일과 같은 성능 최적화 향상을 위해서 생성하는 "cache" 디렉터리를 가지고 있습니다.



config Driectory


config 디렉터리는 이름에서 알 수 있듯이 응용 프로그램의 구성파일을 제공합니다. 해당 디렉터리속 모든 파일을 확인해보고 사용할 수 있는 옵션을 미리 익혀두는것이 좋다고 합니다.



database Driectory


database 디렉터리는 데이터베이스 마이그레이션 및 시딩 파일들을 포함하고 있습니다. 원한다면 해당 디렉터리를 SQLite 데이터베이스가 저장되는 곳으로 사용할 수 있습니다.



public Driectory


public 디렉터리는 애플리케이션에 진입하는 모든 요청에 대한 시작점입니다. "index.php" 파일을 가지고 있으며, CSS, Javascript, image 등과 같은 파일들도 포함되고 있습니다.



resources Driectory


resources 디렉터리는 View 파일과 LESS, SASS, Javascript와 같이 컴파일 되지 않은 asset 파일들을 가지고 있습니다.



routes Driectory


routes 디렉터리는 애플리케이션에서 경로 정의된 모든 라우팅들이 들어 있습니다.
기본적으로 라라벨에서 포함하는 "web.php", "api.php", "console.php" 파일이 포함되어 있습니다.

"web.php" 파일은 "RouteServiceProvidetr"의 "web" 미들웨어 그룹안에 포함되어 있으며, 세션 상태, CSRF 보호, Cookie 암호화 기능을 제공합니다.
만약 상태를 비 저장 RESTful API를 제공하지 않을 경우 모든 라우팅 경로가 "web.php" 파일에 정의됩니다.

"api.php" 파일은 "RouteServiceProvider"의 "api" 미들웨어 그룹안에 포함되어 있으며, 접근 속도 제한 제한 기능을 제공합니다. 이러한 라우트들은 상태를 비 저장을 위한 것으로 이러한 경로를 통해 응용 프로그램에 들어오는 요청은 토큰을 통해 인증되며 세션 상태에 액세스할 수 없습니다.

"console.php" 파일은 클로저 기반의 명령어들을 정의합니다. 각 클로저는 각각의 명령어 IO 메소드와 상호 작용하는 간단한 명령어를 구현하는 명령어 인스턴스에 바인드 되어 있습니다. 해당 파일은 HTTP 라우트가 정의되어 있지 않지만, 애플리케이션에 콘솔 기반의 진입점을 정의합니다.



storage Driectory


storage 디렉터리는 컴파일된 블레이드 템플릿, 파일 기반 세션, 파일 캐시 및 프레임워크에 의해 생성되는 다른 파일이 포함되어 있습니다.
"app", "framework", "logs" 디렉터리로 구성되어 있습니다.

"app" 디렉터리는 애플리케이션에 의해서 생성된 모든 파일을 저장하는데 사용됩니다.

"framework" 디렉터리는 프레임워크에 의해서 생성한 파일 및 캐시를 저장하는데 사용됩니다.

"logs" 디렉터리는 애플리케이션의 로그 파일들을 가지고 있습니다.

"storage/app/public" 디렉터리는 공개적으로 접근이 가능해야 하며, 사용자 프로필 이미지 같은 사용자가 업로드한 파일들에 사용할 수 있습니다. "public/storage" 디렉터리는 심볼릭 링크를 생성해야 하며 아래와 같은 아티즌 명령어를 통해 링크를 생성할 수 있습니다.


root@961789beb441:/var/www/html/myapp$ php artisan storage:link 
The [public/storage] directory has been linked.



tests Driectory


tests 디렉터리는 자동화된 테스트가 포함되어 있습니다. 기본적으로 "PHPUnit" 예제가 제공되며, 각 테스트 클래스에는 "Test" 라는 단어가 추가되어야합니다. "Test"라는 단어가 추가되어야 합니다.
"phpunit", "php vendor/bin/phpunit" 명령어를 통해 실행할 수 있습니다.



vendor Driectory


ventor 디렉터리는 "Composer" 의존성 디렉터리입니다.




APP Directory

응용프로그램의 대부분은 "app" 디렉터리에 있습니다. 기본적으로 해당 디렉터리는 네임스페이스(namespace)이 "App"으로 지정되며 "PSR-4 오토로딩 표준"를 사용하는 Composer에 의해 자동로드됩니다.

"app" 디렉터리는 다음과 같은 ("Console, "Http", Providers")와 같은 다양한 추가 디렉터리를 포함하고 있습니다.
"Console", "Http" 디렉터리는 애플리케이션의 코어에 API를 제공한다고 생각하시면 됩니다. HTTP 프로토콜과 CLI는 모두 응용 프로그램과 상호 작용하는 메커니즘이지만 실제로 응용프로그램 로직을 포함하지는 않습니다.
즉, 응용프로그램에 명령을 내리는 두 가지 방법뿐입니다. "Console" 디렉터리는 모든 아티즌(Artisan) 명령어를 포함하고, "Http" 디렉터리는 컨트롤러와 미들웨어, 요청을 포함합니다.

다른 다양한 디렉터리는 클래스를 생성하기 위해 "Artisan" 명령어(make)를 사용하여 클래스를 생성하면 "app" 디렉터리 내에 생성됩니다.
예를 들어 Job 클래스를 생성하기 위해 "php artisan make:Job" 아티즌 명령어를 사용하기전까지는 "app/jobs" 디렉터리가 존재하지 않습니다.

"app" 디렉터리 안에 있는 많은 클래스는 Artisan 명령어를 통해 생성됩니다. 사용가능한 명령어를 보기 위해 아래와 같이 명령어를 입력해주시면 됩니다.


root@961789beb441:/var/www/html/myapp$ php artisan list make
Laravel Framework version 5.3.31

Usage:
  command [options] [arguments]

Options:
  -h, --help            Display this help message
  -q, --quiet           Do not output any message
  -V, --version         Display this application version
      --ansi            Force ANSI output
      --no-ansi         Disable ANSI output
  -n, --no-interaction  Do not ask any interactive question
      --env[=ENV]       The environment the command should run under
  -v|vv|vvv, --verbose  Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Available commands for the "make" namespace:
  make:auth          Scaffold basic login and registration views and routes
  make:command       Create a new Artisan command
  make:controller    Create a new controller class
  make:event         Create a new event class
  make:job           Create a new job class
  make:listener      Create a new event listener class
  make:mail          Create a new email class
  make:middleware    Create a new middleware class
  make:migration     Create a new migration file
  make:model         Create a new Eloquent model class
  make:notification  Create a new notification class
  make:policy        Create a new policy class
  make:provider      Create a new service provider class
  make:request       Create a new form request class
  make:seeder        Create a new seeder class
  make:test          Create a new test class



Console Driectory


Console 디렉터리는 애플리케이션의 모든 사용자 지정 아티즌(Artisan) 명령어들을 포함하고 있습니다.
이러한 명령어들을 사용하여 생성할 수 있으며, 사용자가 정의한 아티즌 명령어들이 스케줄링 작업(예약된 작업)이 정의되어 있는 콘솔 커널도 있습니다.



Events Driectory


Events 디렉터리는 기본적으로 존재하지 않지만 아티즌(Artisan) 명령에 의해 생성됩니다. 해당 디렉터리는 이름에서 알 수 있듯이 이벤트 클래스가 저장되는 곳입니다. 이벤트는 애플리케이션이 특정 작업(액션)이 발생 했음을 알리는데 사용됩니다. 상당한 유연성과 분리를 제공하며 "event:generate" 또는 "make:event Events" 명령을 통해 생성할 수 있습니다.



Exceptions Driectory


Exceptions 디렉터리는 애플리케이션의 예외 처리 핸들러를 포함하고 있습니다. 애플리케이션이 발생하는 모든 예외(Exception)들을 처리하기 좋은 장소입니다. 예외를 기록하거나 렌더링 방법을 정의하기 위해 "Handler" 디렉터리에서 클래스를 수정하면 됩니다.



Http Driectory


Http 디렉터리는 컨트롤러, 미들웨어 및 요청이 포함되어 있습니다. 애플리케이션으로 들어오는 요청을 처리하는 모든 로직이 해당 디렉터리에 배치됩니다.



Jobs Driectory


Jobs 디렉터리 또한 기본적으로 존재하지 않습니다. 아티즌(Artisan) 명령(make:job)을 통해 자동으로 생성할 수 있습니다. "Jobs" 디렉터리는 애플리케이션의 큐로 지정한 작업들을 모아 놓은곳입니다. 애플리케이션에 의해 대기열에 추가되거나 현재 요청 수명주기 내에서 동기적으로 실행될 수 있습니다.
현재 요청 중에 동기적으로 실행되는 작업은 명령 패턴의 구현으로 "command"라고 합니다.



Listeners Driectory


Listeners 디렉터리 또한 기본적으로 존재하지 않습니다. 아티즌(Artisan) 명령 ("event:generate", "make:listener")을 통해 자동으로 생성할 수 있습니다.
이벤트를 처리하는 클래스를 포함하고 있으며, 이벤트 리스너는 이벤트 인스턴스를 수신하여 발생하는 이벤트에 대해 응답으로 로직을 수행합니다. 예를 들어 "UserRegistered" 이벤트는 "SendWelcomEmail" 리스너에 의해서 처리됩니다.



Mail Driectory


Mail 디렉터리 또한 기본적으로 존재하지 않습니다. 아티즌(Artisan) 명령("make:mail")을 통해 자동으로 생성할 수 있습니다. 해당 디렉터리는 애플리케이션에 의해서 발송되는 이메일을 나타내는 클래스입니다.
메일 객체는 "Mail::send" 메소드를 사용하여 보낼 수 있는 간단한 클래스를 통하여 전자 메일을 구성할 수 있는 로직 캡슐화되어 있습니다.



Notifications Driectory


Notifications 디렉터리 또한 기본적으로 존재하지 않습니다. 아티즌(Artisan) 명령("make:notification")을 통해 자동으로 생성할 수 있습니다. 해당 디렉터리에서는 애플리케이션 내에서 발생하는 이벤트에 대한 간단한 알림과 같이 애플리케이션에서 전송하는 모든 "트랜잭션" 알림이 포함되어 있습니다. 라라벨의 알림 기능은 "이메일", "Slack", "SMS"와 같은 다양한 드라이버를 통해 알림을 전송하거나 데이터베이스에 저장할 수 있습니다.



Policies Driectory


Policies 디렉터리 또한 기본적으로 존재하지 않습니다. 아티즌(Artisan) 명령 ("make:policy")을 통해 자동으로 생성할 수 있습니다. 해당 디렉터리는 애플리케이션에 대한 "권한 부여" 정책 클래스가 들어 있으며, 정책은 사용자가 리소스에 대해 주어진 작업을 수행할 수 있는지 여부를 결정합니다.



Providers Driectory


Providers 디렉터리는 모든 애플리케이션의 "서비스 프로바이더" 파일을 가지고 있습니다. 서비스 프로바이더는 애플리케이션에서 필요한 서비스들을 컨테이너에 바인딩하고, 이벤트를 등록하고, 애플리케이션에 수신 요청에 대해 처리를 하기 위해서 준비되어야 하는 작업들을 수행합니다.