Observer Pattern 이란
옵서버 패턴(observer pattern)은 객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴이다. 주로 분산 이벤트 핸들링 시스템을 구현하는 데 사용된다. 발행/구독 모델로 알려져 있기도 하다. - 출처 wikipedia
옵저버 패턴은 객체의 상태 변화를 등록한 관찰자에게 알려주는 패턴으로 데이터 변경이 발생할 때 여러 객체에게 통지할 수 있습니다.
라라벨은 Eloquent Model 에 옵저버를 등록하고 변경 사항(생성, 수정, 삭제, 조회등)이 발생할 경우 등록한 옵저버에서 특정 작업을 수행하게 할 수 있습니다.
Observer 생성
make:observer artisan 명령으로 옵저버를 생성할 수 있으며 다음 명령은 Post 모델의 event 를 받는 PostObserver 를 생성합니다.
옵저버 생성
php artisan make:observer PostObserver --model=Post
App\Observers namespace 밑에 PostObserver 클래스가 생기며 아래와 같은 skeleton code 를 볼 수 있습니다.
App/Observers/PostObserver
<?php namespace App\Observers; use App\Post; class PostObserver { /** * Handle the post "created" event. * * @param \App\Post $post * @return void */ public function created(Post $post) { // } /** * Handle the post "updated" event. * * @param \App\Post $post * @return void */ public function updated(Post $post) { // } /** * Handle the post "deleted" event. * * @param \App\Post $post * @return void */ public function deleted(Post $post) { // } /** * Handle the post "restored" event. * * @param \App\Post $post * @return void */ public function restored(Post $post) { // } /** * Handle the post "force deleted" event. * * @param \App\Post $post * @return void */ public function forceDeleted(Post $post) { // } }
Laravel Model Event 는 다음과 같은 상황에 대해 통지받을 수 있습니다.
- retrieved : DB 에서 레코드를 가져온 후에
- creating : 레코드를 DB 에 insert 하기 전
- created : 레코드를 DB 에 insert 한 후
- updating : 레코드를 DB 에 update 하기 전
- updated : 레코드를 DB 에 update 한 후
- saving : 레코드를 DB 에 저장하기 전(created 와 updated 모두 해당).
- saved : 레코드를 DB 에 저장한 후(created 와 updated 모두 해당).
- deleting : 레코드를 DB 에서 삭제하기 전(soft delete 와 delete 모두 해당).
- deleted : 레코드를 DB 에서 삭제한 후(soft delete 와 delete 모두 해당).
- restoring : Soft delete 한 레코드를 DB 에서 복구하기 전
- restored : Soft delete 한 레코드를 DB 에서 복구한 후
발생시 특정 처리가 필요한 이벤트 메서드에 처리할 로직을 구현해 주면 되며 사용하지 않는 이벤트 메서드는 삭제하면 됩니다.
예로 restoring 이벤트를 처리하는 로직을 구현할 경우 아래와 같은 로직을 작성해 주면 됩니다.
<?php namespace App\Observers; use App\Post; class PostObserver { /** * Handle the post "restoring" event. * * @param \App\Post $post * @return void */ public function restoring(Post $post) { \Log::info("restoring " . $post->id); }
Observer 생성
사례
Ref
- https://laravel.com/docs/7.x/eloquent#observers
- https://www.larashout.com/how-to-use-laravel-model-observers