본문 바로가기
Framework/Laravel Framework

[Laravel] Request LifeCycle (2)

by 사용자 원동호 2021. 7. 16.

2021.07.09 - [Framework/Laravel Framework] - [Laravel] Request LifeCycle (1)

 

전 포스팅에서는 LifeCycle의 구성도와 public\index.php 파일의 코드를 간략하게 알아 보았다.

 

이번 포스팅에서는 Composer의 autoloading에 대해서 살펴 볼 것이다.

 


require __DIR__.'/../vendor/autoload.php';

 

autoload.php

<?php

// autoload.php @generated by Composer

require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInit84a7ea8a8deweewfwefwe805c0d::getLoader();

autoload.php 파일은 Composer에 의해 생성된다고 한다. Compose는 PHP의 종속성 관리 도구이다.

 

왜 autoload를 사용 해야 할까 ?

예를 들어 Image를 파싱하는 라이브러리를 설치하고자 한다. 오토로딩 기능이 없다면 Image 라이브러리를 사용하기 위해  require 또는 include문 을 사용하여 코드에 포함 시켜 줘야 한다. 웹 어플리케이션의 규모가 작을 경우엔 괜찮을지 모르지만 어플리케이션의 규모가 커질수록 다양한 라이브러리를 사용할 것이고 그에 따른 require , include 문이 점점 늘어날 것이고 유지보수가 힘들어질 가능성이 매우 크다.

라라벨에서는 Composer을 종속성 관리도구로 쓰이고 있다. 클래스 사용시 autoload는 해당 클래스가 로드 되었는지 확인하고 그렇지 않은 경우 필요한 클래스를 메모리에 로드한다. 라이브러리 파일을 수동으로 직접 추가할 필요가 없다. 

 

 

autload_real.php

// 3.
public static function loadClassLoader($class) {
	if ('Composer\Autoload\ClassLoader' === $class) {
		require __DIR__ . '/ClassLoader.php';
	}
}

위 method는 Composer\Autoload\ClassLoader.php 파일을 검색하는데 사용한다.

 

public static function getLoader() {
        if (null !== self::$loader) {
            return self::$loader;
        }
        // 1. autoloading method 등록
        spl_autoload_register(array
        ('ComposerAutoloaderInit84a7ea8a8de98c72643ba2ba69805c0d', 'loadClassLoader'),
          true, 
          true
        );
        // 2.
        self::$loader = $loader = new \Composer\Autoload\ClassLoader();
        // 4.
        spl_autoload_unregister(array
          ('ComposerAutoloaderInit84a7ea8a8de98c72643ba2ba69805c0d','loadClassLoader')
        );
        .
        .
        .
}
  1. spl_autoload_register은 콜백 함수 매커니즘에 의해 autoloading stack에 해당 method를 등록하는 함수이다. 따라서 loadClassLoader라는 method를 등록하는것이다.
  2. new \Composer\Autoload\ClassLoader(); 라는 Class를 호출 했지만 코드에 존재하지 않기때문에 (require로 선언 X) autoloading에 등록되어있는 queue를 호출하게 되고 1번에서 등록한 loadClassLoader method가 실행된다.
  3. loadClassLoader($class) 메소드의 $class 변수에 \Composer\Autoload\ClassLoader() 값이 할당 되고 결국 \Composer\Autoload\ClassLoader.php 파일을 require하게 된다.
  4. autoloading queue에 저장된 method를 삭제하는 함수이다. 따라서 loadClassLoader method를 autoloading queue에서 삭제한다.

결국 ClassLoader.php 를 require하여 composer를 통해 설치한 vendor 디렉토리 하위에 존재하는 composer 구성 요소들을 Autoloading 하게 된다.

 

댓글0