라라벨 - 이벤트 처리

안녕하세요, 미래의 라라벨 마법사 여러분! 오늘 우리는 라라벨의 이벤트 처리 세계로 깊게 빠져들어갈 거예요. 프로그래밍에 처음 도전하는 분이라면 걱정하지 마세요. 저는 수년 동안 수많은 학생들을 가르치며 이 여정을 단계별로 안내해 왔습니다. 그럼 애용하는 음료를 한 잔 들고, 이 흥미로운 모험을 함께 시작해 보세요!

Laravel - Event Handling

라라벨에서 이벤트는 무엇인가요?

이벤트를 상상해 보세요. (물론 코드 파티에서 말이죠!) 중요한 일이 일어나면 - 예를 들어 케이크가 도착하면 - 모두가 흥분합니다. 라라벨에서 이벤트는 이러한 흥분적인 순간들입니다. 이들은 애플리케이션에서 중요한 일이 일어났을 때 발생하는 특별한 사건들입니다.

예를 들어, 사용자가 웹사이트에 등록할 때는 이벤트입니다. 주문이 접수될 때도 또 다른 이벤트입니다. 이벤트는 코드를 조직화하는 데 도움을 주며, 애플리케이션의 다른 부분들이 이러한 중요한 순간에 반응할 수 있게 합니다.

이벤트를 사용하는 이유는 무엇인가요?

  1. 이해체화: 이벤트는 애플리케이션의 다른 부분들을 분리하는 데 도움을 줍니다. 다른 팀들이 있는 것처럼, 각 팀은 다른 팀이 무엇을 하는지 모두 알 필요가 없습니다.

  2. 유연성: 이벤트에 대한 새로운 반응을 쉽게 추가할 수 있습니다. 기존 코드를 변경할 필요가 없습니다.

  3. 명확성: 이벤트는 코드를 이해하기 쉽게 만듭니다. 무엇이 일어나고 언제 일어나는지 명확하게 알 수 있습니다.

첫 이벤트 만들기

우리는 함께 첫 번째 이벤트를 만들어 보겠습니다. 새로운 사용자가 등록할 때 발생하는 이벤트를 만들어 보겠습니다. 다음과 같이 합니다:

php artisan make:event NewUserRegistered

이 명령어는 app/Events 디렉토리에 NewUserRegistered.php라는 새로운 파일을 생성합니다. 내용을 살펴보겠습니다:

<?php

namespace App\Events;

use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class NewUserRegistered
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $user;

    public function __construct($user)
    {
        $this->user = $user;
    }

    public function broadcastOn()
    {
        return new PrivateChannel('channel-name');
    }
}

이 코드에 intimidates되지 마세요! 이것은 요리의 레시피와 같아요. 각 재료를 차례대로 살펴보겠습니다:

  • 상단의 use 문은 필요한 도구를 가져오는 것입니다.
  • 우리의 이벤트 클래스 NewUserRegistered는 마법이 일어나는 곳입니다.
  • $user 프로퍼티는 새로운 사용자에 대한 정보를 담을 것입니다.
  • __construct 메서드는 이 이벤트를 생성할 때 호출되며, 사용자 정보를 저장합니다.

이벤트 발사(디스패치)

이제 우리는 이벤트를 가지고 있습니다. 이를 사용해 보겠습니다! 새로운 사용자가 등록할 때 이 이벤트를 발사합니다. 컨트롤러에서 이를 어떻게 할 수 있는지 살펴보겠습니다:

use App\Events\NewUserRegistered;

public function register(Request $request)
{
    // ... 사용자 등록 로직 ...

    $user = User::create($request->all());

    event(new NewUserRegistered($user));

    return redirect('/welcome');
}

여기서, 새로운 사용자를 생성한 후, event() 함수를 사용하여 이벤트를 발사합니다. 새로운 사용자를 축하하기 위해 불꽃을 쏘는 것과 같습니다!

이벤트를 듣기

이제 우리는 이벤트에 반응하는 리스너를 만들어 보겠습니다. 케이크가 도착했을 때 파티帽을 나눠주는 파티의 사람을 상상해 보세요.

먼저 리스너를 만들어 보겠습니다:

php artisan make:listener SendWelcomeEmail --event=NewUserRegistered

이 명령어는 app/Listeners 디렉토리에 SendWelcomeEmail.php라는 새로운 파일을 생성합니다. 내용을 살펴보겠습니다:

<?php

namespace App\Listeners;

use App\Events\NewUserRegistered;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;

class SendWelcomeEmail
{
    public function handle(NewUserRegistered $event)
    {
        // $event->user를 사용하여 사용자에 접근
        // 환영 이메일 전송 로직을 여기에 추가
    }
}

handle 메서드는 이벤트가 발생할 때 실행되는 코드를 담는 곳입니다. 이 경우, 환영 이메일을 보내는 로직을 추가할 것입니다.

이벤트 리스너 등록

우리의 이벤트와 리스너를 연결하기 위해 등록해야 합니다. app/Providers/EventServiceProvider.php를 엽니다. $listen 배열에 다음을 추가합니다:

protected $listen = [
    NewUserRegistered::class => [
        SendWelcomeEmail::class,
    ],
];

이는 라라벨에게 "Hey, NewUserRegistered가 발생할 때 SendWelcomeEmail을 실행해!"라고 말하는 것입니다.

이벤트 구독자

때로는 하나의 클래스가 여러 이벤트를 처리하고 싶을 수 있습니다. 이때 이벤트 구독자가 도움이 됩니다. 그들은 파티 기획자처럼 파티의 여러 측면을 담당합니다.

이벤트 구독자를 만들어 보겠습니다:

php artisan make:listener UserEventSubscriber

그런 다음 UserEventSubscriber 클래스에서:

<?php

namespace App\Listeners;

class UserEventSubscriber
{
    public function handleUserRegistered($event) {}

    public function handleUserLoggedIn($event) {}

    public function subscribe($events)
    {
        $events->listen(
            'App\Events\NewUserRegistered',
            'App\Listeners\UserEventSubscriber@handleUserRegistered'
        );

        $events->listen(
            'App\Events\UserLoggedIn',
            'App\Listeners\UserEventSubscriber@handleUserLoggedIn'
        );
    }
}

이 구독자를 등록하려면 EventServiceProvider$subscribe 프로퍼티에 추가합니다:

protected $subscribe = [
    'App\Listeners\UserEventSubscriber',
];

큐에 등록된 이벤트 리스너

리스너가 시간이 오래 걸리는 작업(예: 이메일 보내기)을 수행하는 경우, 애플리케이션의 속도를 늦추지 않도록 큐에 등록할 수 있습니다. 이는 "忙しいとき에 나중에 이 작업을 처리해 줘!"라고 말하는 것과 같습니다.

리스너를 큐에 등록하려면 ShouldQueue 인터페이스를 구현합니다:

use Illuminate\Contracts\Queue\ShouldQueue;

class SendWelcomeEmail implements ShouldQueue
{
    // ...
}

이제 라라벨이 자동으로 이 리스너를 큐에 등록합니다!

이벤트 메서드 표

이벤트에서 주로 사용하는 메서드를 정리한 표입니다:

메서드 설명
event() 이벤트를 디스패치합니다
listen() 이벤트 리스너를 등록합니다
subscribe() 이벤트 구독자를 등록합니다
dispatch() 이벤트를 디스패치하는 또 다른 방법
broadcast() 실시간 애플리케이션을 위한 이벤트 방송

그렇게 해서, 우리는 함께 라라벨 이벤트 처리의 세계를 탐험했습니다. 연습이 완벽을 이루는 열쇠이니, 자신의 프로젝트에서 이 개념들을 실험해 보세요. 누가 알겠는가? 당신의 이벤트 처리 기술로 가장 멋진 코드 파티를 열 수 있을지도 모릅니다!

행복하게 코딩하세요, 그리고 이벤트가 항상 우아하게 처리되기를 바랍니다!

Credits: Image by storyset