실시간 파사드는 어떻게 동작하는가 free

2019-09-06

1일 1식 라라벨 43호에서 라라캐스트의 새 시리즈 Laravel Explained 의 첫번째 에피소드인 파사드는 어떻게 동작하는가?(Explain How a Facade Works Under the Hood)를 정리해서 소개해드렸었죠. 오늘 소개할 내용은 두번째 에피소드인 실시간 파사드 파헤치기(Explain Real-Time Facades From the Inside-Out) 입니다.


실시간 파사드를 아직 모르시는 분은 더 진행하기 전에 매뉴얼을 한 번 읽고 와주세요.(분량 짧습니다 ^^) 파사드가 생소하신 분들은 아예 매뉴얼의 파사드 섹션을 처음부터 읽어보시길 권합니다.


원리


실시간 파사드의 원리는 spl_autoload_register() 를 이용해서 “Facade\“로 시작하는 클래스가 호출되면 파사드 클래스를 캐시 디렉터리에 생성하고 오토로드 되게 하는 것입니다.


spl_autoload_register()


클래스를 사용하려면 클래스 파일을 require() 등의 매서드로 불러들여야 합니다. 하지만 직접 불러들이는 일은 너무 번거롭기 때문에 대부분 컴포저 오토로드를 사용합니다. 컴포저는 composer.json에 autoload 항목에 정의된대로 오토로드 파일(vendor/bin/autoload.php)을 만들어줍니다. 라라벨은 app 디렉터리 하위의 클래스를 오토로드하도록 설정되어 있고, 앱이 구동될때 오토로드 파일을 불러들이고 있를 해주는데, 라라벨의 경우 app 디렉터리 하위에 만드는 클래스는 네임스페이스만 규칙대로 적용한다면 알아서 오토로드 되도록 설정되어 있습니다.


실시간 파사드는 있지도 않은 파사드 클래스를 즉석에서 만들어서 사용하는 것입니다. 따라서 컴포저 오토로드로는 해결이 안되죠. 실시간 파사드는 spl_autoload_register()를 이용해서 이 문제를 해결합니다. spl_autoload_register()는 로드되지 않은 클래스가 호출되면 동작하는 PHP 기능입니다.


spl_autoload_register(function ($class) {
include 'classes/' . $class . '.class.php';
});

$user = new User();

위와 같이 하면 classes/User.class.php가 인클루드 되는것이죠.


예제 코드


아래 이미지는 라라캐스트에서 원리를 설명하기 위해 직접 작성한 spl_autoload_register() 코드입니다.


image


한 줄 씩 해석해보면 다음과 같습니다.



  • 7: LaracastsFacades로 시작하는지 확인

  • 8: 파사드 클래스 템플릿 가져옴

  • 9: 클래스명에서 네임스페이스만 뽑아냄

  • 10: 클래스명에서 클래스명만 뽑아냄

  • 11: 억세서명을 만듦

  • 13: 템플릿에서 네임스페이스, 클래스명, 억세서를 치환함

  • 18: 템플릿을 파일로 만들어 저장함

  • 21: 만든 파일을 로드(require)함


참고로 facade.stub 파일은 아래와 같이 생겼어요.


image


마치며


덕분에 실시간 파사드라는게 있었다는걸 다시 인식하는 계기가 됐습니다. 의존성을 주입해서 사용하는게 더 정석적인 방법이지만 테스트에 크게 문제가 되지 않으니 개인 프로젝트에는 한 번 써볼까 하는 생각이 드네요.


1일 1식 라라벨 49호

2019년 9월 6일


이현석

메쉬 코리아 개발자. 바쁜 팀장님 대신 알려주는 신입 PHP 개발자 안내서를 쓰고, 클린 아키텍처 인 PHP를 번역했습니다. 2020년에 출간될 Laravel Up & Running 2nd Edition을 번역하고 있습니다.