Shell Script 문법 정리
Title: Bash Shell Script 문법 정리 Author: DongDongE Tags: Programming Release: 2021.02.08 [Shell
Title: PHP Laravel - Directory Tree
Author: DongDongE
Tags: Programming
Release: 2020.08.07
이번에는 Laravel 프레임워크 디렉터리 구조에 대해 알아보도록 하겠습니다.
라라벨 애플리케이션 구조는 크고,작은 애플리케이션에서 좋은 시작점을 제공하기 위한 의도하고 있습니다.
라라벨은 Composer가 클래스를 자동로드(오토로딩) 할 수 있는 한 클래스를 어디에 위치 시키든지에 대한 제한이 없습니다.
Laravel을 시작할 때 많은 개발자들이 "models" 디렉터리가 없는 것에 대해 띠용? 하면서 혼란스러워 합니다.
그러나 해당 디렉터리가 없는건 의도 되었습니다. "Models"가 많은 사람들에게 각기 다른 의미로 받아져 모호하기 때문이라고 합니다.
일부 개발자들은 애플리케이션 "Models"을 모든 비지니스 로직의 전체로서 참조하는 반면, 다른 개발자들은 "models"를 관계형 데이터베이스와 상호 작용하는데 사용한다고 합니다.
이러한 이유로 Laravel에서는 기본적으로 "Eloquent" 모델을 디렉터리에 배치하고 개발자가 원하는 경우 다른 곳에 배치할 수 있도록 선택합니다.
app 디렉터리는 예상대로 으용 프로그램의 핵심 코드가 포함되어 있으며, 애플리케이션의 거의 모든 클래스가 들어 있습니다.
bootstrap 디렉터리는 프레임워크의 자동 로딩과 부트스트래핑을 설정하는 파일을 포함하고 있으며, 프레임워크가 라우트나 서비스 캐시 파일과 같은 성능 최적화 향상을 위해서 생성하는 "cache" 디렉터리를 가지고 있습니다.
config 디렉터리는 이름에서 알 수 있듯이 응용 프로그램의 구성파일을 제공합니다. 해당 디렉터리속 모든 파일을 확인해보고 사용할 수 있는 옵션을 미리 익혀두는것이 좋다고 합니다.
database 디렉터리는 데이터베이스 마이그레이션 및 시딩 파일들을 포함하고 있습니다. 원한다면 해당 디렉터리를 SQLite 데이터베이스가 저장되는 곳으로 사용할 수 있습니다.
public 디렉터리는 애플리케이션에 진입하는 모든 요청에 대한 시작점입니다. "index.php" 파일을 가지고 있으며, CSS, Javascript, image 등과 같은 파일들도 포함되고 있습니다.
resources 디렉터리는 View 파일과 LESS, SASS, Javascript와 같이 컴파일 되지 않은 asset 파일들을 가지고 있습니다.
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 디렉터리는 컴파일된 블레이드 템플릿, 파일 기반 세션, 파일 캐시 및 프레임워크에 의해 생성되는 다른 파일이 포함되어 있습니다.
"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 디렉터리는 자동화된 테스트가 포함되어 있습니다. 기본적으로 "PHPUnit" 예제가 제공되며, 각 테스트 클래스에는 "Test" 라는 단어가 추가되어야합니다. "Test"라는 단어가 추가되어야 합니다.
"phpunit", "php vendor/bin/phpunit" 명령어를 통해 실행할 수 있습니다.
ventor 디렉터리는 "Composer" 의존성 디렉터리입니다.
응용프로그램의 대부분은 "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 디렉터리는 애플리케이션의 모든 사용자 지정 아티즌(Artisan) 명령어들을 포함하고 있습니다.
이러한 명령어들을 사용하여 생성할 수 있으며, 사용자가 정의한 아티즌 명령어들이 스케줄링 작업(예약된 작업)이 정의되어 있는 콘솔 커널도 있습니다.
Events 디렉터리는 기본적으로 존재하지 않지만 아티즌(Artisan) 명령에 의해 생성됩니다. 해당 디렉터리는 이름에서 알 수 있듯이 이벤트 클래스가 저장되는 곳입니다. 이벤트는 애플리케이션이 특정 작업(액션)이 발생 했음을 알리는데 사용됩니다. 상당한 유연성과 분리를 제공하며 "event:generate" 또는 "make:event Events" 명령을 통해 생성할 수 있습니다.
Exceptions 디렉터리는 애플리케이션의 예외 처리 핸들러를 포함하고 있습니다. 애플리케이션이 발생하는 모든 예외(Exception)들을 처리하기 좋은 장소입니다. 예외를 기록하거나 렌더링 방법을 정의하기 위해 "Handler" 디렉터리에서 클래스를 수정하면 됩니다.
Http 디렉터리는 컨트롤러, 미들웨어 및 요청이 포함되어 있습니다. 애플리케이션으로 들어오는 요청을 처리하는 모든 로직이 해당 디렉터리에 배치됩니다.
Jobs 디렉터리 또한 기본적으로 존재하지 않습니다. 아티즌(Artisan) 명령(make:job)을 통해 자동으로 생성할 수 있습니다. "Jobs" 디렉터리는 애플리케이션의 큐로 지정한 작업들을 모아 놓은곳입니다. 애플리케이션에 의해 대기열에 추가되거나 현재 요청 수명주기 내에서 동기적으로 실행될 수 있습니다.
현재 요청 중에 동기적으로 실행되는 작업은 명령 패턴의 구현으로 "command"라고 합니다.
Listeners 디렉터리 또한 기본적으로 존재하지 않습니다. 아티즌(Artisan) 명령 ("event:generate", "make:listener")을 통해 자동으로 생성할 수 있습니다.
이벤트를 처리하는 클래스를 포함하고 있으며, 이벤트 리스너는 이벤트 인스턴스를 수신하여 발생하는 이벤트에 대해 응답으로 로직을 수행합니다. 예를 들어 "UserRegistered" 이벤트는 "SendWelcomEmail" 리스너에 의해서 처리됩니다.
Mail 디렉터리 또한 기본적으로 존재하지 않습니다. 아티즌(Artisan) 명령("make:mail")을 통해 자동으로 생성할 수 있습니다. 해당 디렉터리는 애플리케이션에 의해서 발송되는 이메일을 나타내는 클래스입니다.
메일 객체는 "Mail::send" 메소드를 사용하여 보낼 수 있는 간단한 클래스를 통하여 전자 메일을 구성할 수 있는 로직 캡슐화되어 있습니다.
Notifications 디렉터리 또한 기본적으로 존재하지 않습니다. 아티즌(Artisan) 명령("make:notification")을 통해 자동으로 생성할 수 있습니다. 해당 디렉터리에서는 애플리케이션 내에서 발생하는 이벤트에 대한 간단한 알림과 같이 애플리케이션에서 전송하는 모든 "트랜잭션" 알림이 포함되어 있습니다. 라라벨의 알림 기능은 "이메일", "Slack", "SMS"와 같은 다양한 드라이버를 통해 알림을 전송하거나 데이터베이스에 저장할 수 있습니다.
Policies 디렉터리 또한 기본적으로 존재하지 않습니다. 아티즌(Artisan) 명령 ("make:policy")을 통해 자동으로 생성할 수 있습니다. 해당 디렉터리는 애플리케이션에 대한 "권한 부여" 정책 클래스가 들어 있으며, 정책은 사용자가 리소스에 대해 주어진 작업을 수행할 수 있는지 여부를 결정합니다.
Providers 디렉터리는 모든 애플리케이션의 "서비스 프로바이더" 파일을 가지고 있습니다. 서비스 프로바이더는 애플리케이션에서 필요한 서비스들을 컨테이너에 바인딩하고, 이벤트를 등록하고, 애플리케이션에 수신 요청에 대해 처리를 하기 위해서 준비되어야 하는 작업들을 수행합니다.