라라벨 - 이벤트 처리
안녕하세요, 미래의 라라벨 마법사 여러분! 오늘 우리는 라라벨의 이벤트 처리 세계로 깊게 빠져들어갈 거예요. 프로그래밍에 처음 도전하는 분이라면 걱정하지 마세요. 저는 수년 동안 수많은 학생들을 가르치며 이 여정을 단계별로 안내해 왔습니다. 그럼 애용하는 음료를 한 잔 들고, 이 흥미로운 모험을 함께 시작해 보세요!
라라벨에서 이벤트는 무엇인가요?
이벤트를 상상해 보세요. (물론 코드 파티에서 말이죠!) 중요한 일이 일어나면 - 예를 들어 케이크가 도착하면 - 모두가 흥분합니다. 라라벨에서 이벤트는 이러한 흥분적인 순간들입니다. 이들은 애플리케이션에서 중요한 일이 일어났을 때 발생하는 특별한 사건들입니다.
예를 들어, 사용자가 웹사이트에 등록할 때는 이벤트입니다. 주문이 접수될 때도 또 다른 이벤트입니다. 이벤트는 코드를 조직화하는 데 도움을 주며, 애플리케이션의 다른 부분들이 이러한 중요한 순간에 반응할 수 있게 합니다.
이벤트를 사용하는 이유는 무엇인가요?
-
이해체화: 이벤트는 애플리케이션의 다른 부분들을 분리하는 데 도움을 줍니다. 다른 팀들이 있는 것처럼, 각 팀은 다른 팀이 무엇을 하는지 모두 알 필요가 없습니다.
-
유연성: 이벤트에 대한 새로운 반응을 쉽게 추가할 수 있습니다. 기존 코드를 변경할 필요가 없습니다.
-
명확성: 이벤트는 코드를 이해하기 쉽게 만듭니다. 무엇이 일어나고 언제 일어나는지 명확하게 알 수 있습니다.
첫 이벤트 만들기
우리는 함께 첫 번째 이벤트를 만들어 보겠습니다. 새로운 사용자가 등록할 때 발생하는 이벤트를 만들어 보겠습니다. 다음과 같이 합니다:
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