Laravel 동작 방식을 이해하기 위한 Design Pattern 자료
라라벨 동작을 이해하는 데 도움이 되는 디자인 패턴을 몇 개 추렸습니다.
예제가 자바인건 현실적인 이유때문이니 자바도 같이 배워둡시다.!
꼭 알아둬야 할 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);
Triple DES 를 사용할 경우 파라미터의 알고리즘 이름(String) 만 변경하면 factory 에서 인스턴스를 생성해 주므로 알고리즘과 소스 코드와의 결합도를 줄일 수 있음.
Cipher c = Cipher.getInstance("DESede/CBC/PKCS5Padding");
c.init(Cipher.ENCRYPT_MODE, myKey, myParams);
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);
}
}
그런데 위 코드는 팩토리에 객체가 추가될 수록 팩토리 생성 코드가 늘어나게 되므로 좋은 코드가 아님.
이런 문제를 방지하려면 Reflection 에 대한 이해가 필요하며 다음과 같이 if-else 를 제거할 수 있음.
public Cipher getInstance(String param) {
String[] arr = param.split("/");
String algorithm = arr[0];
return Class.forName(algorithm).newInstance();
}
Fluent interface
method chaining 을 통해서 소스 코드의 가독성을 높이기 위한 패턴으로 method 에서는 this 객체를 리턴
class Post extends Model
{
public function count(): self
{
// do something
return $this;
}
]
사용할 경우 메소드 체이닝을 이용해서 개행해서 코딩
\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();
});
});
Facade
Laravel 에서 쓰는 파사드 용어때문에 Design pattern 에서 사용하는 facade 헷갈릴수 있으므로 잘 알아 둘 필요가 있음.
파사드 패턴을 구현한 대표적인 제품은 자바용 로깅 프레임워크인 slf4j 를 들 수 있음.
라라벨 파사드는 일종의 Static Factory 라 생각하면 맞을 듯
Observer
laravel의 Event broad casting 기능이 대표적인 옵저버 패턴