라이믹스에서는 회원들의 포인트 적립과 사용 내역을 확인할 수 있는 자료로 포인트히스토리 모듈을 사용할 수 있습니다. 이 포인트히스토리 모듈에서는 코어에서 지급과 차감되는 내역은 메시지를 구분해서 어떤 사유로 포인트가 적립 또는 차감되었는지 알수 있게 처리 되어있습니다.
그런데 알려지지 않은 다른 모듈에 의해 포인트 변경이 발생할 경우 포인트를 변경시킨 모듈에서 메시지를 설정해서 포인트히스트로리에서 그 메시지를 기록 할 수 있도록 기능이 제공됩니다.
제가 지금 이 글을 쓰고 있는 이유는 제가 최근 포인트히스토리의 db에 기록된 데이터를 기반으로 한 위젯을 개발을 했는데 해당 위젯을 개발하면서 핵심이 되는 내용을 공유해서 비슷한 방식으로 개발을 하실 수 있는 힌트가 될 수 있길 바래서 입니다.
다시 본래 이야기로 돌아와서..
포인트 히스토리 모듈에서 서드파티 개발자에게
Context::set('__point_message__', '포인트 메세지 내용');
포인트 증감이 있는 곳에서 포인트를 세팅하기 바로 직전에 위와 같이 작성해 주면 포인트히스토리의 db에 기록이 될때 해당 메시지가 기록된다고 합니다.
녹색으로 칠한 부분의 필드에 서드파티에서 직접 메시지를
Context::set('__point_message__', '포인트 메세지 내용'); 로 설정하면 설정한 대로 기록이 된다는 것 입니다.
그런데 제가 이번에 개발하려고 했던 위젯은 위 기록에서 유료모듈인 회원가입확장모듈의 회원가입 초대장 배포로 인해 적립한 포인트의 기록으로 랭킹을 보여주는 위젯을 개발하려고 했습니다.
포인트 히스토리 모듈에서 초대장배포해서 회원이 신규로 가입할때 적립된 포인트만 뽑아서 순위를 매길수 있어야겠죠?
보통은 모듈 자체에서 log를 기록하면 이렇게 포인트히스토리의 log에 의존하지 않고 자체 db를 활용할 수 있습니다. 그렇지 않은 경우나 특별히 포인트히스토리 모듈의 log를 이용할 경우 제가 지금 적고 있는 이 방법이 유효한거죠.
유료모듈인 회원가입확장 모듈에서는
Context::set('__point_message__', "{$obj->nick_name}님께서 초대장으로 가입");
이런식으로 초대장 가입으로 인한 포인트 증가라고 세팅을 해주고 있었습니다. 개발 당시 제가 요청한 부분이라서요.
그런데 초대장으로 라는 단어 포함으로 쿼리해서 포인트를 합산하기에는 성능이 조금 떨어지기에 db를 좀더 살펴보았습니다.
message_type 라는 필드가 눈에 들어오네요. 매 데이터 마다 구분이 될 수 있는 필드였습니다.
그리고 포인트히스토리 모듈의 코드를 열어보니
Context::set('__point_message_type__', '타입구분식별자);
도 함께 세팅할 수 있게 되어 있는 것을 발견하고
Context::set('__point_message_type__', 'signupextend');
를 추가해서 메시지,메시지타입 2가지 필드에 구분될 수 있도록 해주어 초대장배포로 인해 적립된 포인트만 따로 구분해서 쿼리할 수 있게 되었습니다.
이렇게 해서 보여드린 초대 포인트 적립 랭킹 위젯을 쉽게 개발 할 수 있게 되었습니다.
Context::set('__point_message_type__') 은 알려지지 않아서 잘 모르는 분들이 많을 것 같아 공유해 보았습니다.