파일 오토로딩
모든 애플리케이션은 서로 다른 위치에 있는 수많은 클래스로 구성됩니다. 프레임워크는 핵심 기능을 위한 클래스를 제공하며, 애플리케이션은 라이브러리, 모델 및 기타 엔티티들을 통해 작동합니다. 또한 프로젝트에서 사용하는 서드파티 클래스들도 있을 수 있습니다. 모든 파일의 위치를 추적하고, 이를 requires()를 사용하여 파일에 하드코딩하는 것은 매우 번거롭고 에러가 발생하기 쉽습니다. 여기서 오토로더(autoloader)가 필요해집니다.
CodeIgniter4 오토로더
CodeIgniter는 매우 적은 설정으로 사용할 수 있는 유연한 오토로더를 제공합니다. PSR-4 오토로딩 디렉토리 구조를 따르는 개별 네임스페이스 클래스들을 찾을 수 있습니다.
오토로더는 단독으로도 잘 작동하지만, 필요에 따라 Composer와 같은 다른 오토로더나 사용자 정의 오토로더와 함께 사용할 수도 있습니다. 이들은 모두 spl_autoload_register를 통해 등록되므로, 순차적으로 작동하며 서로 방해하지 않습니다.
오토로더는 항상 활성화되어 있으며, 프레임워크 실행 시작 시점에 spl_autoload_register()를 통해 등록됩니다.
중요
파일 이름의 대소문자에 항상 주의해야 합니다. 많은 개발자가 Windows나 macOS의 대소문자를 구분하지 않는 파일 시스템에서 개발합니다. 하지만 대부분의 서버 환경은 대소문자를 구분하는 파일 시스템을 사용합니다. 파일 이름의 대소문자가 틀리면 오토로더가 서버에서 파일을 찾을 수 없습니다.
설정
초기 설정은 app/Config/Autoload.php에서 이루어집니다. 이 파일에는 클래스맵(classmap)을 위한 배열과 PSR-4 호환 네임스페이스를 위한 배열이라는 두 개의 주요 배열이 포함되어 있습니다.
네임스페이스
클래스를 정리하는 권장 방법은 애플리케이션 파일에 대해 하나 이상의 네임스페이스를 만드는 것입니다.
설정 파일의 $psr4 배열을 사용하여 네임스페이스를 해당 클래스가 위치한 디렉토리에 매핑할 수 있습니다.
<?php
namespace Config;
use CodeIgniter\Config\AutoloadConfig;
class Autoload extends AutoloadConfig
{
// ...
public $psr4 = [
APP_NAMESPACE => APPPATH,
];
// ...
}
각 행의 키는 네임스페이스 자체입니다. 마지막에 백슬래시()를 붙일 필요는 없습니다. 값은 클래스를 찾을 수 있는 디렉토리의 위치입니다.
기본적으로 App 네임스페이스는 app 디렉토리에 위치하며, Config 네임스페이스는 app/Config 디렉토리에 위치합니다.
PSR-4에 따라 해당 위치에 클래스 파일을 생성하면 오토로더가 자동으로 이를 로드합니다.
네임스페이스 확인
spark namespaces 명령을 통해 네임스페이스 설정을 확인할 수 있습니다.
php spark namespaces
애플리케이션 네임스페이스
기본적으로 애플리케이션 디렉토리는 App 네임스페이스로 지정됩니다. 애플리케이션 디렉토리에 있는 컨트롤러, 라이브러리 또는 모델에는 네임스페이스를 지정해야 하며, 이들은 App 네임스페이스 아래에서 찾을 수 있게 됩니다.
Config 네임스페이스
설정 파일들은 예상과 달리 App\Config가 아닌 Config 네임스페이스로 지정됩니다. 이를 통해 애플리케이션 네임스페이스가 변경되더라도 핵심 시스템 파일들이 항상 설정 파일을 찾을 수 있습니다.
참고
v4.5.3 App Starter부터 Config\\ 네임스페이스가 composer.json의 autoload.psr-4에 추가되었습니다.
App 네임스페이스 변경
app/Config/Constants.php 파일을 편집하고 APP_NAMESPACE 설정 아래에 새 네임스페이스 값을 설정하여 이 네임스페이스를 변경할 수 있습니다.
defined('APP_NAMESPACE') || define('APP_NAMESPACE', 'App');
Composer 오토로더를 사용하는 경우, composer.json에서도 App 네임스페이스를 변경하고 composer dump-autoload를 실행해야 합니다.
{
...
"autoload": {
"psr-4": {
"App\\": "app/" <-- Change
},
...
},
...
}
참고
v4.5.0 App Starter부터 App\\ 네임스페이스가 composer.json의 autoload.psr-4에 추가되었습니다. 만약 composer.json에 이 내용이 없다면, 이를 추가하여 앱의 오토로딩 성능을 향상시킬 수 있습니다.
현재 네임스페이스를 참조하고 있는 기존 파일들을 모두 수정해야 합니다.
클래스맵(Classmap)
Composer 패키지가 아니며 네임스페이스가 지정되지 않은 서드파티 라이브러리를 사용하는 경우, 클래스맵을 사용하여 해당 클래스들을 로드할 수 있습니다.
<?php
namespace Config;
use CodeIgniter\Config\AutoloadConfig;
class Autoload extends AutoloadConfig
{
// ...
public $classmap = [
'Markdown' => APPPATH . 'ThirdParty/markdown.php',
];
// ...
}
각 행의 키는 찾고자 하는 클래스의 이름입니다. 값은 해당 클래스가 위치한 경로입니다.
Composer 지원
Composer 지원은 기본적으로 자동으로 초기화됩니다.
기본적으로 ROOTPATH . 'vendor/autoload.php'에서 Composer의 오토로드 파일을 찾습니다. 어떤 이유로든 이 파일의 위치를 변경해야 하는 경우, app/Config/Constants.php에 정의된 값을 수정할 수 있습니다.
오토로더 우선순위
동일한 네임스페이스가 CodeIgniter와 Composer 양쪽 모두에 정의되어 있는 경우, Composer의 오토로더가 파일을 찾을 기회를 먼저 갖게 됩니다.
참고
v4.5.0 이전에는 동일한 네임스페이스가 양쪽에 정의된 경우 CodeIgniter의 오토로더가 먼저 기회를 가졌습니다.
FileLocator 캐싱
Added in version 4.5.0.
FileLocator는 PHP 오토로딩으로는 달성할 수 없는 파일 찾기나 파일에서 클래스 이름을 가져오는 작업을 담당합니다.
성능 향상을 위해 FileLocator 캐싱이 구현되었습니다.
작동 방식
캐시 데이터가 업데이트된 경우, 객체 소멸 시 FileLocator가 찾은 모든 데이터를 캐시 파일에 저장합니다.
캐시 데이터가 있는 경우, 객체 생성 시 이를 복원합니다.
캐시 데이터는 영구적으로 사용됩니다.
캐시 데이터 삭제 방법
한번 저장된 캐시 데이터는 만료되지 않습니다.
따라서 파일을 추가/제거하거나 기존 파일 경로 또는 네임스페이스를 변경하는 경우, 오래된 캐시 데이터가 반환되어 앱이 제대로 작동하지 않을 수 있습니다.
이러한 경우 캐시 파일을 수동으로 삭제해야 합니다. Composer를 통해 CodeIgniter 패키지를 추가하는 경우에도 캐시 파일을 삭제해야 합니다.
spark cache:clear 명령을 사용할 수 있습니다.
php spark cache:clear
또는 단순히 writable/cache/FileLocatorCache 파일을 삭제하십시오.
참고
spark optimize 명령은 캐시를 지웁니다.
FileLocator 캐싱 활성화 방법
app/Config/Optimize.php에서 다음 속성을 true로 설정하십시오:
public bool $locatorCacheEnabled = true;
또는 spark optimize 명령으로 활성화할 수 있습니다.
참고
이 속성은 환경 변수에 의해 오버라이드될 수 없습니다.
경고
워커 모드(Worker Mode)에서 앱을 실행할 때는 이 옵션을 사용하지 마십시오.