라라벨 동작을 이해하는 데 도움이 되는 디자인 패턴을 몇 개 추렸습니다.

예제가 자바인건 현실적인 이유때문이니 자바도 같이 배워둡시다.!


꼭 알아둬야 할 Design patterns

위 자료에서 우선적으로 다음 내용만 알아두면 됨.

Factory

팩토리 패턴을 사용하는 제품중에 가장 유명한 것중에 하나는 Java 의 JCE 구현체.


암호 알고리즘마다 동작 방식이 상이하며 이를 구현한 벤더마다 구현 방식이 다를 수 있지만 단일 인터페이스로 사용하기 위해서 factory pattern 을 적용.


예로 AES CBC 모드로  암호화할 경우 아래와 같이 getInstance 에 사용할 알고리즘을 명시하면 Cipher 팩토리 내에서 맞는 인스턴스를 생성해서 리턴함

Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");  
c.init(Cipher.ENCRYPT_MODE, myKey, myParams);  
JAVA


Triple DES 를 사용할 경우 파라미터의 알고리즘 이름(String) 만 변경하면 factory 에서 인스턴스를 생성해 주므로 알고리즘과 소스 코드와의 결합도를 줄일 수 있음.

Cipher c = Cipher.getInstance("DESede/CBC/PKCS5Padding");  
c.init(Cipher.ENCRYPT_MODE, myKey, myParams);  
JAVA

Reflection

리플렉션은 디자인 패턴이 아니고 언어에서 제공하는 low level 한 기능이지만 Factory pattern 이나 DI 동작의 기본이 되므로 꼭 알아두어야 함.


일반적인 Factory pattern 은 내부적으로 파라미터 문자열(ex: "AES/CBC/PKCS5Padding") 을 파싱하고 여기에 맞게 if else 구문으로 객체를 생성하고 리턴하고 모르는 객체 이름일 경우 예외를 던지게 구현함

public Cipher getInstance(String param) {
        String[] arr = param.split("/");

        String algorithm = arr[0];

        if (algorithm.equals("AES")) {
            return new AES();
        } else if (algorithm.equals("DESede")) {
            return new DESede();
        } else {
            throw new NoSuchAlgorithmException("모르는 알고리즘" + algorithm);
        }
    }
CODE

그런데 위 코드는 팩토리에 객체가 추가될 수록 팩토리 생성 코드가 늘어나게 되므로 좋은 코드가 아님.


이런 문제를 방지하려면 Reflection 에 대한 이해가 필요하며 다음과 같이 if-else 를 제거할 수 있음.

 public Cipher getInstance(String param) {
        String[] arr = param.split("/");

        String algorithm = arr[0];

        return Class.forName(algorithm).newInstance();
}
CODE


Fluent interface

method chaining 을 통해서 소스 코드의 가독성을 높이기 위한 패턴으로 method 에서는 this 객체를 리턴

class Post extends Model
{
	public function count(): self
	{
		// do something
		return $this;
	}
]
PHP


사용할 경우 메소드 체이닝을 이용해서 개행해서 코딩

\App\Models\Post::factory(157)
            ->create()
            ->each(function (Post $post){
                $cnt = mt_rand(7, 29);

                Comment::factory()
                    ->count($cnt)
                    ->create()
                    ->each(function (Comment $comment) use($post){
                        $comment->post_id = $post->id;
                        $comment->save();
                });
            });
PHP



Facade

Laravel 에서 쓰는 파사드 용어때문에 Design pattern 에서 사용하는 facade 헷갈릴수 있으므로 잘 알아 둘 필요가 있음.

파사드 패턴을 구현한 대표적인 제품은 자바용 로깅 프레임워크인 slf4j 를 들 수 있음.


라라벨 파사드는 일종의 Static Factory 라 생각하면 맞을 듯

Observer

laravel의 Event broad casting 기능이 대표적인 옵저버 패턴


Laravel DI Container 심화