I am public blog

Hello word I am Public Blog

[su_heading size=”30″ class=”top” align=”left” margin=”10″]# Introduction[/su_heading]

Facade는 어플리케이션의 서비스 컨테이너에서 사용할 수 있는 클래스에 “정적” 인터페이스를 제공한다. 라라벨은 대부분의  라라벨의 기능에 엑세스할 수 있는 여러 facade를 제공한다. 라라벨 facade는 서비스 컨테이너의 기본 클래스에 “정적 프록시” 역할을 하며 기존 정적 메서드보다 테스트 및 유연성을 유지하면서 간결하고 표현이 풍부한 구문의 이점을 제공한다.

모든 라라벨 facade는 [su_label type=”black”]Illuminate\Support\Facades[/su_label] 네임스페이스에 정의되어 있다. 그래서 다음과 같이 facade에 쉽게 엑세스할 수 있다.

use Illuminate\Support\Facades\Cache;

Route::get('/cache', function () {
    return Cache::get('key');
});

라라벨 문서 전체에서 많은 예제가 프레임워크의 다양한 기능을 설명하기 위해 facade를 사용한다.

[su_heading size=”30″ align=”left” margin=”10″]# When To Use Facades[/su_heading]

Facade는 많은 이점이 있다. 직접 주입하거나 구성해야 하는 긴 클래스 이름을 기억할 필요 없이 라라벨의 기능을 사용할 수 있는 간결하고 기억하기 쉬운 구문을 제공한다. 또한 PHP의 동적 메서드는 사용하기 때문에 쉽게 테스트할 수 있다.

그러나 파사드를 사용할 때 주의해야 할 것이 있다. 가장 주의해야 할 것은 클래스 영역이 변경되는 것이다. 파사드는 사용하기 쉽고 주입이 필요 없기 때문에 클래스가 점점 커지고 단일 클래스 내에 많은 파사드를 사용할 수 있다. 의존성 주입을 사용하면 시각적 피드백을 통해 이러한 가능성을 완화시킬 수 있다. 큰 생성자는 클래스가 너무 커지게 할 수 있기 때문에 파사드를 사용할 때는 클래스의 책임 범위가 좁아지도록 특별한 주의를 해야 한다.

[su_note note_color=”#40749c” text_color=”#ffffff”]라라벨과 상호연동되는 서드파티 패키지를 제작할 때는 파사드를 사용하는 것 보다는 라라벨 컨트랙트를 주입하는 것이 좋다. 패키지는 라라벨 외부에서 빌드되기 때문에 라라벨의 파사드 테스트 헬퍼에 엑세스할 수 없다.[/su_note]

[su_heading size=”30″ align=”left” margin=”10″]# Facades Vs. Dependency Injection[/su_heading]

의존성 주입의 주요 이점 중 하나는 주입된 클래스의 구현을 바꿀 수 있는 능력이다. mock 이나 stub을 주입할 수 있고 stub에서 여러 메서드들이 호출되었다고 할 수 있기 때문에 테스트 하는 동안 유용하다.

일반적으로 정적 클래스 메서드를 mock 또는 stub 하는것은 불가능하다. 그러나 파사드는 서비스 컨테이너에서 해결된 객체를 프록시 메서드 호출을 위해 동적 메서드를 사용하고, 실제로 주입된 클래스 인스턴스를 테스트 하는 것 처럼 파사드를 테스트 할 수 있다. 예를 들어 다음과 같이 route가 주어진다.

use Illuminate\Support\Facades\Cache;

Route::get('/cache', function () {
    return Cache::get('key');
});

다음의 테스트를 작성하여 예상한 인수로 [su_label type=”black”]Cache::get[/su_label] 메서드가 호출되었는지 확인할 수 있다.

use Illuminate\Support\Facades\Cache;

public function testBasicExample()
{
    Cache::shouldReceive('get')
        ->with('key')
        ->andReturn('value');

    $this->visit('/cache')
        ->see('value');
}