Laravel life cycle

석호·2022년 2월 11일
0
post-thumbnail

Laravel

라라벨(Laravel)은 PHP 기반의 web framework 중 하나입니다.
모델-뷰-컨트롤러(MVC) 아키텍처 패턴을 따르고 있으며, 최고의 PHP 프레임워크라고 불립니다.
세계에서도 많은 인기를 끌고 있는 프레임워크입니다.

Laravel의 장단점

그렇다면 라라벨을 사용하는 이유에는 무엇이 있을까요?

그 이유는 다음과 같습니다.

장점 

- 많은 기능을 포함하여 빠른 개발 속도
- 거대한 커뮤니티
- 데이터 베이스 작업시 ORM인 Eloquent를 제공하여 편한 DB 연결
- PHP 패키지 매니저인 composer를 지원
- 간결하고 기억하기 쉬운 문법을 제공하는 파사드 패턴

이런 이유들과는 다르게, 라라벨의 단점이라고 불리우는 이유들도 있습니다.

단점

- 많은 기능을 포함하고 있기에 다른 프레임워크에 비해서 느린 속도
- PHP에 대한 부정적인 시선들

Laravel life cycle

larave의 life cycle을 알아보고 laravel의 이해도가 좀 더 높아지길 기대합니다.

1. Web server에서 public/index를 실행

Web server Nginx, Apache 에는 configuration을 설정할 수 있습니다.
이곳에는 laravel application의 첫번째 경로가 지정되어 있습니다.
이 경로를 통해서 laravel application의 public/index.php 를 실행합니다.

2. public/index.php 에서 composer autoload 를 실행

composer 는 PHP의 의존성 관리 도구입니다.
프로젝트에서 사용하는 라이브러리를 선언하고 의존성을 해결해줍니다.

3. public/index.php 에서 bootstrap/app.php 를 실행

composer autoload를 실행한 후 public/index.php 에서는 bootstrap/app.php 스크립트에서 laravel application instance 를 가져오게 됩니다.
bootstrap은 한 번 시작되면 알아서 진행되는 일련의 과정을 뜻합니다.
bootstrap 에서는 Http kernel, console kernel, exception handler 를 singleton 디자인 패턴을 통해서 다음 사진과 같이 인스턴스화 합니다.

4. 애플리케이션이 시작된 유형에 따라 전송된 요청을 HTTP 커널이나 Console 커널로 전달합니다.

커널의 역할은 다음과 같습니다.

  1. 사용자의 요청을 미들웨어에 전달, 예외 발생시 예외 처리
  2. closure 나 controller에 반환되는 최종 response를 client에게 제공

HTTP Kernerl과 Console Kernel이 하는 행동은 다음과 같습니다.

  • 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() 함수는 저장된 인스턴스를 호출해서 실행하는 역할을 합니다.

다음은 그 예로 Swagger service provider 입니다.

서비스 프로바이더는 DB, Queue, Validation, Routing 등 부팅(부트스트래핑)의 처리를 책임지기에 가장 중요합니다.

애플리케이션 코드를 작동시키기 전, 사전에 실행해야하는 코드는 서비스 프로바이더에 넣는 것이 적합합니다.

애플리케이션을 위한 기본 서비스 프로바이더는 app/Providers 디렉토리에 존재합니다.
기본적으로 AppServiceProvider는 비어있는데, 이 프로바이더는 부트스트래핑과 서비스 컨테이너 바인딩 코드를 추가하기 위한 곳입니다.
즉 얼마든지 원하는대로 서비스프로바이더를 만들 수 있습니다.

6. Request 처리-디스패칭

라라벨 애플리케이션이 부트스트래핑되고, 서비스 프로바이더가 등록 된 후, Request가 라우터를 통해 전달됩니다.

7. Middleware, Controller

라우터를 통해 Request가 지정된 미들웨어와 컨트롤러로 전달됩니다.


마무리하며

프레임워크가 어떻게 동작하는지 이해한다면 앞으로 프레임워크를 다루는데 있어서 자신감과 호기심이 생길 수 있다고 생각했습니다 :) 호기심은 학습에 좋은 도구라고 생각하고 있습니다. 라라벨 라이프 사이클 학습을 시작으로 라라벨은 물론 다른 프레임워크에게도 어떤 특성과 라이프 사이클이 있는지 궁금해졌습니다. 또한 앞으로 한 층 더 이해도 높게 라라벨을 다룰 수 있게 될 것 같습니다.

📚 참고 (라라벨 korea 공식문서)
https://laravel.kr/docs/8.x/lifecycle

profile
BackEnd Developer

0개의 댓글