운용되는 시스템을 유저가 사용하다가 문제가 발생하면, 개발자는 어떻게 알 수 있을까? 아무런 대책없이 그대로 운용하게 된다면 개발자는 유저의 문제 발생 문의를 보고서야 로그를 확인하고 수정을 하게 될 것이다. 이러한 상황을 방지하기 위한 방법 중 하나가 Webhook을 사용하는 것이다.
이번 글에서는 특정 이벤트가 발생했을 때, Slack, Google Chat과 같은 메시지 플랫폼에서 실시간으로 알림을 받을 수 있는 Webhook이라는 기능에 대해 알아보고 실제 구현하는 방법까지 기술하고자 한다.
웹훅은 웹 개발에서 사용자 정의 콜백을 사용하여 웹 페이지 또는 웹 애플리케이션의 동작을 강화하거나 변경하는 방법이다. - 위키피디아
Webhook은 서버간 데이터를 송수신하는 방식으로, 지속적으로 요청을 보내는 폴링(API통신) 과는 다르게 특정 이벤트가 발생할 때에 서버에 요청을 보내는 방식이다.

| 폴링 | 웹훅 | |
|---|---|---|
| 방식 | 클라이언트가 주기적으로 서버에 요청 송신 | 특정 이벤트 발생시, 서버에 송신 |
| 응답 시간 | 요청 주기마다 지연 발생 가능성 있음 | 실시간 데이터 전송 가능 |
| 효율성 | 주기적으로 요청하기에 비효율 | 이벤트가 발생할 때에만 요청하기에 효율 |
| 사용 예시 | 하드웨어 부팅 체크 | 이벤트 알림 |
특정 이벤트가 발생했을 때, Google Chat의 Webhook 방식을 통한 실시간 알림을 구현해보자.
아래 링크의 "이용 방법"을 참고하여 알림을 받고자 하는 채팅방의 Webhook을 생성한다.

$webhookUrl = {생성한 Webhook URL};
$message = array("text" => {송신하고자 하는 메시지});
// cURL 초기화 및 옵션 세팅
$ch = curl_init($webhookUrl);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($message));
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
// 요청 실행
$response = curl_exec($ch);
// cURL 종료
curl_close($ch);
// 응답 로그 출력
Log::info('google chat webhook 응답 : ' . $response);
이벤트가 발생할 때마다 지정한 채팅방에 아래의 알림이 송신되는 것을 확인할 수 있었다.

이벤트가 발생할 때마다 송신되는 방식인 Webhook. 이번 글에서는 간단한 에러 알림 송신 로직을 작성했지만, 쉘 스크립트를 활용한 프로젝트 배포 알림 공유, 스케줄러를 활용한 정기적인 작업 메시지 송신 등 생각보다 사용할 수 있는 곳이 많다고 생각되어지기에..잘 기억해놓았다가 필요할 때 꼭꼭 사용하도록 하자!