Skip to content

Commit fbbb39a

Browse files
Add: 그누보드 훅(Hook) 사용법과 이벤트 종류 완벽 정리
- bbs 폴더 수정 없이 코드 삽입하는 훅 기능 상세 설명 - 바로 사용 가능한 코드 예시와 실제 활용 사례 제공 - 전체 이벤트 목록과 파라미터 정보 정리 - 스킨 방식과의 차이점 및 구현 팁 포함 - Summary 우선 구조로 즉시 해결 가능한 형태로 작성
1 parent 16cd515 commit fbbb39a

1 file changed

Lines changed: 296 additions & 0 deletions

File tree

Lines changed: 296 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,296 @@
1+
---
2+
layout: post
3+
title: "그누보드 훅(Hook) 사용법과 이벤트 종류 완벽 정리"
4+
date: 2023-07-20 10:00:00 +0900
5+
categories: [Development, Tutorial]
6+
tags: [gnuboard, php, hooks, korean-cms, web-development]
7+
author: "Kevin Park"
8+
excerpt: "그누보드 bbs 폴더 수정 없이 코드 삽입하는 훅 기능 사용법과 모든 이벤트 종류를 정리했습니다. extend 폴더 활용부터 실제 구현까지"
9+
---
10+
11+
# 그누보드 훅(Hook) 사용법과 이벤트 종류 완벽 정리
12+
13+
## 🎯 Summary
14+
15+
그누보드 훅은 **bbs 폴더를 직접 수정하지 않고** 중간에 코드를 삽입할 수 있는 기능입니다. extend 폴더에 PHP 파일을 생성하여 원하는 시점에 함수를 실행할 수 있습니다.
16+
17+
### 기본 사용법 (바로 사용 가능)
18+
19+
```php
20+
<?php
21+
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
22+
23+
// 이벤트 등록
24+
add_event('write_update_after', 'my_custom_function', G5_HOOK_DEFAULT_PRIORITY, 4);
25+
26+
// 실행될 함수
27+
function my_custom_function($board, $wr_id, $w, $qstr, $redirect_url)
28+
{
29+
global $g5;
30+
31+
// 게시글 작성/수정 후 실행될 코드
32+
// 예: 로그 기록, 알림 발송 등
33+
34+
// 로그 예시
35+
$log_data = "게시판: {$board['bo_table']}, 글번호: {$wr_id}, 작업: {$w}";
36+
write_log($log_data, 'board_activity');
37+
}
38+
?>
39+
```
40+
41+
### 주요 이벤트 예시
42+
43+
```php
44+
// 1. 회원 로그인 후 처리
45+
add_event('member_login_check', 'after_login_process');
46+
47+
// 2. 게시글 작성 전 검증
48+
add_event('write_update_before', 'validate_content');
49+
50+
// 3. 관리자 설정 변경 후 처리
51+
add_event('admin_config_form_update', 'config_changed_notify');
52+
```
53+
54+
---
55+
56+
## 📚 상세 설명
57+
58+
### 그누보드 훅의 작동 원리
59+
60+
그누보드 훅 시스템은 이벤트 기반으로 작동합니다. 그누보드 코어에서 특정 시점마다 `run_event()` 함수를 호출하여 등록된 훅 함수들을 순차적으로 실행합니다.
61+
62+
```php
63+
// 그누보드 코어 내부 (bbs 폴더)
64+
run_event('event_name', $params);
65+
```
66+
67+
이때 `extend` 폴더에 등록된 훅 함수들이 실행되는 구조입니다.
68+
69+
### 훅 파일 생성 및 등록
70+
71+
**1단계: 파일 생성**
72+
```
73+
/extend/my_hooks.php (파일명은 자유)
74+
```
75+
76+
**2단계: 기본 구조 작성**
77+
```php
78+
<?php
79+
if (!defined('_GNUBOARD_')) exit;
80+
81+
// 우선순위와 파라미터 개수 지정
82+
add_event('이벤트명', '함수명', G5_HOOK_DEFAULT_PRIORITY, 파라미터_개수);
83+
84+
function 함수명($param1, $param2, ...)
85+
{
86+
// 실행할 코드
87+
}
88+
?>
89+
```
90+
91+
**3단계: 파라미터 활용**
92+
```php
93+
function write_update_handler($board, $wr_id, $w, $qstr, $redirect_url)
94+
{
95+
// $board: 게시판 설정 배열
96+
// $wr_id: 게시글 번호
97+
// $w: 작업 구분 (write/modify/reply)
98+
// $qstr: 쿼리 스트링
99+
// $redirect_url: 리다이렉트 URL
100+
101+
if ($w === 'write') {
102+
// 새 게시글 작성 시에만 실행
103+
send_notification($board['bo_table'], $wr_id);
104+
}
105+
}
106+
```
107+
108+
### 실제 활용 사례
109+
110+
**사례 1: 게시글 작성 시 슬랙 알림**
111+
```php
112+
<?php
113+
if (!defined('_GNUBOARD_')) exit;
114+
115+
add_event('write_update_after', 'slack_notification', G5_HOOK_DEFAULT_PRIORITY, 5);
116+
117+
function slack_notification($board, $wr_id, $w, $qstr, $redirect_url)
118+
{
119+
if ($w === 'write') {
120+
$write = get_write($board['bo_table'], $wr_id);
121+
122+
$message = "새 게시글: [{$board['bo_subject']}] {$write['wr_subject']}";
123+
send_slack_message($message);
124+
}
125+
}
126+
127+
function send_slack_message($message)
128+
{
129+
$webhook_url = 'YOUR_SLACK_WEBHOOK_URL';
130+
$data = json_encode(['text' => $message]);
131+
132+
$ch = curl_init($webhook_url);
133+
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
134+
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
135+
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
136+
curl_exec($ch);
137+
curl_close($ch);
138+
}
139+
?>
140+
```
141+
142+
**사례 2: 회원 가입 시 추가 처리**
143+
```php
144+
<?php
145+
if (!defined('_GNUBOARD_')) exit;
146+
147+
add_event('register_form_update_after', 'welcome_process', G5_HOOK_DEFAULT_PRIORITY, 2);
148+
149+
function welcome_process($mb_id, $w)
150+
{
151+
if ($w === '') { // 신규 가입
152+
// 환영 메시지 발송
153+
send_welcome_message($mb_id);
154+
155+
// 기본 그룹 추가
156+
add_member_to_default_group($mb_id);
157+
158+
// 가입 로그 기록
159+
write_log("신규 회원 가입: {$mb_id}", 'member_register');
160+
}
161+
}
162+
?>
163+
```
164+
165+
## 📋 그누보드 훅 이벤트 전체 목록
166+
167+
### 공통 및 레이아웃
168+
169+
| 이벤트명 | 파일위치 | 파라미터 | 설명 |
170+
|---------|----------|----------|------|
171+
| `common_header` | common.php | - | 공통 헤더 로드 시 |
172+
| `pre_head` | head.php | - | HTML head 생성 전 |
173+
| `tail_sub` | tail.sub.php | - | 하단 템플릿 로드 시 |
174+
175+
### 관리자 영역
176+
177+
| 이벤트명 | 파일위치 | 파라미터 | 설명 |
178+
|---------|----------|----------|------|
179+
| `admin_common` | adm/_common.php | - | 관리자 공통 로드 시 |
180+
| `admin_board_form_update` | adm/board_form_update.php | $bo_table, $w | 게시판 설정 변경 시 |
181+
| `admin_config_form_update` | adm/config_form_update.php | - | 기본 설정 변경 시 |
182+
| `admin_member_form_update` | adm/member_form_update.php | $w, $mb_id | 회원 정보 변경 시 |
183+
| `admin_member_form_add` | adm/member_form.php | $mb, $w, 'table' | 회원 폼 추가 시 |
184+
185+
### 게시판 기능
186+
187+
| 이벤트명 | 파일위치 | 파라미터 | 설명 |
188+
|---------|----------|----------|------|
189+
| `bbs_write` | bbs/write.php | $board, $wr_id, $w | 글쓰기 폼 로드 시 |
190+
| `write_update_before` | bbs/write_update.php | $board, $wr_id, $w, $qstr | 글 저장 전 |
191+
| `write_update_after` | bbs/write_update.php | $board, $wr_id, $w, $qstr, $redirect_url | 글 저장 후 |
192+
| `bbs_delete` | bbs/delete.php | $write, $board | 글 삭제 시 |
193+
| `bbs_good_before` | bbs/good.php | $bo_table, $wr_id, $good | 추천 전 |
194+
| `bbs_good_after` | bbs/good.php | $bo_table, $wr_id, $good | 추천 후 |
195+
196+
### 댓글 기능
197+
198+
| 이벤트명 | 파일위치 | 파라미터 | 설명 |
199+
|---------|----------|----------|------|
200+
| `comment_update_after` | bbs/write_comment_update.php | $board, $wr_id, $w, $qstr, $redirect_url, $comment_id, $reply_array | 댓글 저장 후 |
201+
| `bbs_delete_comment` | bbs/delete_comment.php | $comment_id, $board | 댓글 삭제 시 |
202+
203+
### 회원 기능
204+
205+
| 이벤트명 | 파일위치 | 파라미터 | 설명 |
206+
|---------|----------|----------|------|
207+
| `register_form_update_before` | bbs/register_form_update.php | $mb_id, $w | 회원가입 처리 전 |
208+
| `register_form_update_after` | bbs/register_form_update.php | $mb_id, $w | 회원가입 처리 후 |
209+
| `member_login_check` | bbs/login_check.php | $mb, $link, $is_social_login | 로그인 확인 시 |
210+
| `member_logout` | bbs/logout.php | $link | 로그아웃 시 |
211+
| `password_is_wrong` | bbs/login_check.php, bbs/password_check.php | 'login', $mb 또는 'bbs', $wr, $qstr | 비밀번호 오류 시 |
212+
213+
### 파일 및 다운로드
214+
215+
| 이벤트명 | 파일위치 | 파라미터 | 설명 |
216+
|---------|----------|----------|------|
217+
| `download_file_header` | bbs/download.php | $file, $file_exist_check | 파일 다운로드 전 |
218+
| `write_update_file_insert` | bbs/write_update.php | $bo_table, $wr_id, $upload[$i], $w | 파일 업로드 시 |
219+
220+
## 스킨 방식과의 차이점
221+
222+
### 기존 스킨 방식
223+
```php
224+
// 게시판 스킨 내부
225+
// update_head.skin.php
226+
// 특정 스킨에서만 동작
227+
```
228+
229+
### 훅 방식의 장점
230+
1. **광범위한 적용**: 관리자 페이지(/adm/)까지 포함
231+
2. **중앙 집중 관리**: extend 폴더에서 통합 관리
232+
3. **스킨 독립적**: 스킨 변경과 무관하게 동작
233+
4. **우선순위 제어**: 여러 훅의 실행 순서 조정 가능
234+
235+
### 실제 구현 팁
236+
237+
**1. 에러 처리**
238+
```php
239+
function my_hook_function($param1, $param2)
240+
{
241+
try {
242+
// 메인 로직
243+
process_data($param1, $param2);
244+
} catch (Exception $e) {
245+
// 에러 로그 기록
246+
error_log("Hook Error: " . $e->getMessage());
247+
}
248+
}
249+
```
250+
251+
**2. 조건부 실행**
252+
```php
253+
function conditional_hook($board, $wr_id, $w)
254+
{
255+
// 특정 게시판에서만 실행
256+
if ($board['bo_table'] !== 'notice') {
257+
return;
258+
}
259+
260+
// 신규 작성시에만 실행
261+
if ($w !== 'write') {
262+
return;
263+
}
264+
265+
// 실제 처리 로직
266+
send_notification($board, $wr_id);
267+
}
268+
```
269+
270+
**3. 성능 최적화**
271+
```php
272+
function optimized_hook($params)
273+
{
274+
// 불필요한 DB 쿼리 방지
275+
static $cache = [];
276+
277+
$cache_key = md5(serialize($params));
278+
if (isset($cache[$cache_key])) {
279+
return $cache[$cache_key];
280+
}
281+
282+
// 처리 로직
283+
$result = expensive_operation($params);
284+
$cache[$cache_key] = $result;
285+
286+
return $result;
287+
}
288+
```
289+
290+
## 결론
291+
292+
그누보드 훅 시스템은 코어 파일 수정 없이 원하는 기능을 추가할 수 있는 강력한 도구입니다. 특히 관리자 영역까지 포괄하는 넓은 적용 범위와 이벤트 기반의 명확한 실행 시점이 큰 장점입니다.
293+
294+
훅을 효과적으로 활용하면 그누보드 사이트의 기능을 안전하고 체계적으로 확장할 수 있으며, 업데이트 시에도 기능 손실 없이 유지할 수 있습니다.
295+
296+
**다음 단계**: 실제 프로젝트에 필요한 기능을 파악하고, 적절한 이벤트를 선택하여 훅을 구현해보세요. 작은 기능부터 시작하여 점차 복잡한 비즈니스 로직을 추가해나가는 것을 권장합니다.

0 commit comments

Comments
 (0)