get_config()의 Hook의 이해하기 어려운 부분 > 자유게시판

자유게시판

get_config()의 Hook의 이해하기 어려운 부분 정보

get_config()의 Hook의 이해하기 어려운 부분

본문

그누보드 DB에서 환경설정 데이터를 가져오는 `get_config()` 함수가 있죠.

 

2900516399_1702768321.2347.png

 

여기에는 좀 이상한 것들이 있죠.

 

---

 

나름대로 DB 쿼리를 줄이기 위해서 함수 내부에서 DB에서 가져온 데이터를 static 변수에 담아두고 DB 요청을 줄이는 방법을 사용합니다.

 

헌데, cache 가져오는 것이 기본적으로 비활성($is_cache = false)로 되어 있죠. 기본 값을 true로 두는게 맞는 것 같은데 조금 요상합니다.

이거는 뭐 그냥 왜 그랬을까? 싶은 정도라서 어쨌든 뭐 그러려니 하지만...

정작 common.php 파일에서 그누보드를 구동하는 초기과정에서 환경설정 데이터를 가져올 떄는 cache에서 가져오도록 `get_config(true)`로 가져와 `$config` 전역변수에 담아둡니다.

 

추측해보자면, 아마도 Memcached 등을 고려한 것이라고 생각됩니다. `$is_cache = true`는 Memcache 등에 저장된 "캐시 데이터를 우선 사용하겠다"라는 의미로 사용된 것같기도 합니다.

 

이 추측은 `get_config_cache` Hook이 있는 것에 기반한 추측입니다. `get_config_cache` 훅을 이용해 Memcache 데이터가 있으면 이 데이터를 반환하는 콜백을 구성할 수 있죠. 헌데, 이런 cache를 이용하지 않는 경우에는 함수 내부의 static $config 변수 때문에 Hook 걸기가 꽤나 괴이해집니다.

 

게다가 `$is_cache` 파라미터로 cache 데이터를 사용할건지 구분할 수 있는데도 `get_config_cache` Hook이 항상 호출되어 콜백에서 `$is_cache` 파라미터를 항상 확인해서 처리해줘야 합니다.

 

2900516398_1702773426.0229.png

이렇게 구성되었어야 했죠.

 

---

 

이상하기보다는 좀 애매한 상황이긴한데...

 

마찬가지로 `get_config()` 함수에 Hook을 사용해 일부 데이터를 변경이 필요할 경우, 그누보드는 대부분의 동작을 `$config` 전역변수에 의존하기 때문에 Hook 도 걸고 `$config` 전역변수에서도 값을 변경해줘야 합니다.

예를 들어 사이트 제목인 `cf_title` 값을 변경하려면:

2900516399_1702769568.4426.png

 

이런 기괴한 방법을 사용해야 합니다.

`get_config()` 함수 내부의 cache와 전역변수 `$config`에도 데이터 변경을 반영하기 위해서죠.

 

Hook 목록 페이지에서 get_config() 함수 내의 hook에 대해 정리하다가

아... 이건 좀....

그냥 예시를 제거하고 이 Hook은 사용하지 말라는 경고를 적어두기로 했습니다.

 

아마도 g5_get_cache() 같은 cache 매니저를 추가하기 전의 코드인 것같습니다.

 

----

 

`get_board_db()` 함수 같은 것들도 `get_board_db_cache`, `get_board_db` 이렇게 cache와 DB에서 가져온 것에 대한 hook이 분리되어있죠.

`get_board_db()` 함수는 더 이상합니다. `get_board_db` hook에는 DB에서 가져온 데이터가 전달되지 않고 빈배열이 전달되죠. 아니 이거 왜죠?

 

`get_board_db_cache`가 이미 있어서 cache처리는 할 수 있는데, `get_board_db`에서는 DB에서 가져온 데이터가 아니라 빈배열을 넘겨주는 걸까요? 이 때문에 첫번째 콜백은 항상 빈 배열을 받게되고 제대로 데이터를 받으려면 콜백을 한번 더 걸어줘야 합니다. 한번더 건다고 해결되는 것도 아닙니다. 첫번째 함수 호출은 콜백의 영향을 받지 않기 때문에, 콜백의 영향을 받지않는 데이터를 함수를 실행해서 버려줘야 합니다. 세번째 이미지의 27라인처럼요.

하지만 이것 또한 다른 어떤 곳에서 먼저 사용되기 전에 해줘야하는 과정이어서 데이터의 무결성을 유지할 수가 없습니다. 어떤 곳에서는 이미 데이터를 가져간 이후일 수 있기 때문에 어디에선가는 처리되지 않은 데이터를 이미 가져갔을 수가 있죠....

 

게다가 이것들도 마찬가지로 함수 내부에서 static 변수로 캐싱을 하기 때문에 `get_board_db_cache` Hook에도 콜백을 걸어줘야 합니다. 위 두번째 이미지의 예시처럼 12~15라인의 코드처럼 *_cache Hook에는 값이나 cache 사용여부를 체크도 항상 해줘야 합니다. 대체 왜....

 

`get_board_db()` 함수 뿐만 아니라 이런 유사한 것들이 수두룩 합니다.

최대한 호환성 문제가 없도록 수정해서 PR 보내려고 했으나, 이런게 한두개가 아니고 알수없는 어떤 문제나 사용처가 있을지 몰라서 함부로 건드리기도 어렵습니다.

 

---

 

이건 별개의 이야기인데, 관리페이지에서 환경설정 변경을 위한 `adm/config_form.php` 페이지에서도 환경설정 데이터를 DB에서 직접 가져오지 않고 전역변수 `$config`에 의존하므로 변조 가능성이 있는 데이터를 신뢰하여 사용하고 있죠. 특정 조건에서 테마를 변경하거나 특정 설정을 일시적으로 변경하는 등 `$config` 값을 변경하는 코드가 팁으로 공유되기도하는데 이런 것들이 적용되어 환경설정을 저장할 때 영향을 줄 가능성이 있죠. `$config` 전역변수는 물론 Hook으로 인한 데이터 변조에도 영향을 받게 되죠.  그누보드 이슈 #296

 

---

 

그누보드는 파면 팔수록 괴기한 것들이 마구 튀어나옵니다. 이런것들이 나오면 여러 상황을 가졍하고 분석해내야 합니다. 그래야만 가이드에 제대로된 설명을 쓸 수 있으니까요. 제가 파악한 모든 상황을 정확하게 적어놓아야 가이드 문서를 본 사람이 같은 문제를 겪지 않을테니까요.

 

이런 것들을 본지는 오래됐는데 마땅히 기회가 없어서 글을 적지는 않았었는데... 이번에 Hook 목록을 정리하다가 get_config()에서 너무 큰 현타가 와서 적어봅니다.

 

https://g5guide.github.io/developers/hook-list.html

 

추천
2

댓글 1개

전체 199,630 |RSS
자유게시판 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1402호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT