Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

Version 1 Next »

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


  • No labels