*[0] Laravel Life Cycle
INDEX
https://slowbreeze.tistory.com/9
0. 라라벨 라이프사이클 정리
1) 기본 라이프 사이클
2) 테스트 라이프 사이클
CONTENTS
1) 기본 라이프 사이클
https://velog.io/@seo_kk/Laravel-life-cycle
Laravel life cycle
라라벨의 라이프 사이클을 직접 따라가보며 프레임워크의 이해도를 높여봅니다.
velog.io
1. Web server에서 public/index를 실행
2. public/index.php 에서 composer autoload 를 실행
require __DIR__.'/../vender/autoload.php';
3. public/index.php 에서 bootstrap/app.php 를 실행
bootstrap/app.php 스크립트에서 laravel application instance 를 가져옴
(bootstrap: 한 번 시작되면 알아서 진행되는 일련의 과정)
Http kernel, console kernel, exception handler 를 singleton 디자인 패턴을 통해서 인스턴스화
4. 애플리케이션이 시작된 유형에 따라 전송된 요청을 HTTP 커널이나 Console 커널로 전달
Kernerl
- 사용자의 요청을 미들웨어에 전달, 예외 발생시 예외 처리
- closure 나 controller에 반환되는 최종 response를 client에게 제공
- HTTP Kernel
1. Illuminate\Foundation\Http\Kernel 클래스를 상속한다.
2. 요청을 실행하기 전에 처리되는 bootstrappers(시작코드)의 배열을 정의한다. (에러 처리, 로그 설정)
3. application 에서 request가 통과하는 Middleware의 목록을 정의한다.
4. HTTP 세션을 읽고,쓰고 CSRF토큰을 확인하는 등 request가 처리되기 전에 실행한다. - Console Kernel
1. laravel console 에서 사용하는 cron, artisan 에서 사용한다.
5. 서비스 프로바이더 로딩
커널의 부팅 과정이 일어나면서 라라벨 애플리케이션의 서비스 프로바이더가 함께 등록됨
서비스 프로바이더는 config/app.php 파일의 providers 배열에 위치
register 메소드가 먼저 호출 되고, 이후 모든 boot 메소드가 호출됨
- register(): 등록된 서비스 프로바이더에서 해당 메서드를 통해 인스턴스를 서비스 컨테이너에 저장하는 역할
- boot(): 저장된 인스턴스를 호출해서 실행하는 역할
애플리케이션 코드를 작동시키기 전, 사전에 실행해야하는 코드는 서비스 프로바이더에 넣는 것이 적합
애플리케이션을 위한 기본 서비스 프로바이더는 app/Providers 디렉토리에 존재
AppServiceProvider는 부트스트래핑과 서비스 컨테이너 바인딩 코드를 추가하기 위한 곳
--- 라라벨 애플리케이션이 부트스트래핑되고, 서비스 프로바이더가 등록 된 후 ---
6. Request 처리-디스패칭
Request가 라우터를 통해 전달됨
7. Middleware, Controller
라우터를 통해 Request가 지정된 미들웨어와 컨트롤러로 전달됨
2) 테스트 라이프 사이클
Laravel은 PHPUnit을 테스트 프레임워크로 사용하므로 PHPUnit의 테스트 라이프 사이클을 기반으로 한다.
- 라이프 사이클은 각 테스트 메서드마다 반복된다.
- 각 테스트 메서드는 독립적인 환경에서 실행되며, 이전 테스트의 상태에 영향을 받지 않습니다.
테스트 라이프 사이클의 일반적 구성:
1. 테스트 시작:
- `phpunit` 명령어로 테스트를 시작합니다. Laravel은 PHPUnit를 사용하여 테스트를 실행하며, `phpunit.xml` 파일에 기반하여 설정이 로드됩니다.
2. Testbench 환경 설정
- Orchestra\Testbench\TestCase 클래스를 확장하여 사용자의 테스트 케이스가 작성됩니다.
이 클래스는 테스트 환경에서 실제 Laravel 애플리케이션을 부트스트래핑하고 필요한 설정을 제공합니다.
2. 애플리케이션 생성:
- 각 테스트 메서드 실행 전에 Testbench가 Laravel 애플리케이션 인스턴스를 생성합니다.
이로 인해 새로운 서비스 컨테이너가 준비되며, 서비스 프로바이더들이 등록될 준비가 됩니다.
3. 서비스 프로바이더 등록:
- TestCase 에서 getPackageProviders 메서드를 오버라이드하여 개발 중인 패키지의 서비스 프로바이더를 등록합니다.
이후, `config/app.php`에 명시된 모든 서비스 프로바이더의 register 메서드가 호출됨
(이 단계에서 주로 서비스 바인딩과 기본 설정이 처리됨)
(필요한 경우, getEnvironmentSetUp 메서드를 통해 테스트 환경에서 특정 설정을 오버라이드)
4. 테스트 케이스의 `setUp` 메서드 실행:
- Laravel의 테스트 케이스에는 `setUp` 메서드가 있습니다. 이 메서드는 테스트 메서드 실행 전에 호출되며, 여기서는 일반적으로 사용하는 트레이트의 설정, 데이터베이스 마이그레이션 초기화 등의 작업이 이루어집니다.
- setUp 및 setUpTraits 메서드들은 각 테스트 메서드가 실행되기 전에 호출됩니다.
- Laravel에서, setUp 메서드는 애플리케이션 인스턴스를 생성하거나 다른 준비 작업을 수행하는 데 사용됩니다.
- setUpTraits는 특정 트레잇에서 제공하는 setUp 로직을 실행합니다.
5. 서비스 프로바이더 부팅:
- 모든 서비스 프로바이더들의 `boot` 메서드가 호출됩니다. 이 과정에서 라우트, 뷰, 이벤트 리스너, 미들웨어 등이 등록됩니다.
6. 테스트 메서드 실행:
- 이제 실제 테스트 메서드가 실행됩니다. 이 메서드에서는 HTTP 요청을 시뮬레이션하거나, 데이터베이스 작업을 수행하며, 애플리케이션의 기능을 테스트합니다.
/** @test */ 어노테이션이나 test 접두사를 사용하여 정의된 실제 테스트 메서드가 이 시점에서 실행됩니다.
7. 테스트 케이스의 `tearDown` 메서드 실행:
- 테스트 메서드 실행 후, `tearDown` 메서드가 호출됩니다. 주로 테스트 리소스의 해제 및 초기화 작업이 이루어집니다.
- tearDown 및 tearDownTraits 메서드들은 각 테스트 메서드 실행 후에 호출됩니다.
- 테스트 리소스 해제 또는 기타 정리 작업을 수행하기 위해 사용됩니다.
8. 애플리케이션 인스턴스 소멸:
- 각 테스트 메서드 실행이 끝난 후에 Laravel 애플리케이션 인스턴스는 소멸됩니다.
이로 인해 다음 테스트 메서드에 영향을 주지 않게 됩니다.