엄마한테 빌려준 돈 못 받고 울분에 차서 잠자리를 뒤척이다가 생각난 것을 글로 써봅니다.
다음의 기능이 필요하다고 가정하겠습니다.
- 라이믹스 게시판의 글 목록에 관여하는 기능이 필요합니다. (상점: 공지 설정, 글 제목 색상 지정, 내용 치환 등)
- 퀴즈: 님이 개발자라면 이 기능을 개발할 때 게시판에 어떻게 간섭 하겠습니까?
object cache 이야기 하지 않고 php opcache (=include) 접근만 하겠습니다.
- 애드온을 제작하고 관리자 설정에서 작동 범위를 대상 게시판으로 설정한다.
- 전역 트리거를 집어넣는다: moduleHandler.init 또는 moduleHandler.proc
- 게시판 트리거를 넣는다: act:board.dispBoardContent
답을 생각하셨다면 스크롤을 내려주세요.
답 그런거 없고요, 그냥 하고 싶은대로 하면 됩니다. 성능 차이는 어차피 미미하거든요.
하지만 님이 변태스러운 코딩 쉽덕후라면? 고민이 필요할지 모릅니다.
이렇게 설계하면 어떨까요?
- module.xml / update / install 시점의 트리거는 없습니다.
- 유저가 구매한 아이템(예: 공지 설정, 글 제목 색 지정, 내용 치환 등)을 활성화하면 act:board.dispBoardContent 트리거가 켜지고 관련 메소드가 연결됩니다.
- 연결된 그 메소드는 활성화된 아이템이 없을 때 트리거를 끕니다.
include 하는 꼼수도 있겠지만, RXE에서 지향하는 범용적인 단독 모듈이라면 이 방법 괜찮다는 생각이 듭니다.
코어에서 조건부 트리거를 지원해주면 환상적이겠지만,, 안 될거야 이건 아마..
필요할 때만 addTriggerFunction() 하면 그게 조건부 트리거죠.
물론 이 트리거를 넣을지 뺄지 결정하기 위한 최초 1회의 트리거는 미리 등록되어 있어야 합니다. 현재 접속한 유저가 특정 아이템을 구매했는지 여부에 따라 공용으로 사용하는 트리거 DB에서 계속 insert/delete하는 것은 더 비효율적이니까요.
정답은 없지만 오답은 있습니다. act가 dispBoardContent일 때만 실행하도록 한다면, 게시판이 아닌 곳(예: 메인화면 위젯, 사이드바 위젯, 작성 글 보기, 서드파티 자료가 제공하는 개인 프로필 화면 등)에서 글 목록을 불러올 때는 작동하지 않겠지요. 예외가 발견되거나 새 자료가 출시될 때마다 일일이 땜빵하는 불상사를 피하려면, document.getDocumentList처럼 act와 무관하게 공통적으로 사용하는 경로에 트리거를 걸어두는 것을 추천합니다.