타운에 있는 활동메달처럼 현재 활동의 지표가 되는 무언가로 메달을 부여하는 제도를 사이트에 구현하고 싶은 희망은 있었습니다.
딱히 경험치 같은 것을 사용하지 않기 때문에 타운처럼 경험치를 근거로 하기도 어렵고 포인트로 하기도 어렵기도 하고 그리고 결정적으로 제가 구현하기는 쉽지 않아 가장 간단한 게시글의 추천받은 수로 하기로 했습니다.
원래 모듈을 제작할 능력이 된다면
1.특정한 시점(ex:매월 1일 00시 05분)에 회원들의 순위를 매길 수 있는 쿼리를 돌려 회원들의 순번을 나열하기
2.이 순위를 해당 모듈의 db 테이블에 저장하기
3.이 저장된 순위를 이용해 메달을 부여하기
- 쿼리 내용이 부담이 없어 캐시가 없더라도 부담이 없고 캐시를 적당히 줄 수 도 있고...
모듈을 만들 능력이 되지 않아 이렇게 꼼지락 거렸습니다.
전체회원의 이전 달 게시글의 추천수 합을 구하는 것도 굉장한 부하는 아니지만 크게 변동도 없을 이 데이터를 매번 구할 필요는 없다. 하지만 난 모듈을 만들기는 역부족이다.
사실 회원 랭킹 제공하는 경우 이 정도 쿼리는 수시로 하고 있습니다. 월간랭킹이 이런식이죠.
그래서 지난번 처럼 외부파일에 이 전체회원의 이전 달 1일부터 말일 까지의 게시글 추천수의 합을 구하고 그 숫자로 줄세우기하는 코드를 작성했습니다.
1.특정한 시점이 아닌 외부파일에서 쿼리를 통해 회원의 순번을 세우게 했습니다.
- 이때 특정한 시점에만 데이터를 갱신하는 효과를 주기 위해 캐시 기간을 굉장히 길게 주었습니다.
- 캐시 갱신은 crontab으로 매월 1일 새벽에 갱신하도록 했습니다.
- 캐시파일 재생성이 되어 새롭게 그 전에 갱신되어도 크게 문제가 될 정도는 아닙니다.
- 뭐 적당한 캐시로 지속적으로 갱신하게 해도 무방합니다. 하지만 전 그냥 이렇게 구성한 겁니다. 적당한 간격으로 갱신한다면 순위 변동이 되어야 할 시점에 반영되는 장점? 혹은 단점? 이 있을 수 있습니다.
2.외부파일에서 만들어낸 이 줄세이기 데이터를 각 필요한 부분에서 모두 활용할 수 있어 원하는 곳곳에 이 메달을 표시해 줄 수 있었습니다.
아마 언젠가는 모듈을 만들어 데이터를 저장하고 편하게 가져다 쓰는 것을 하고 싶다 라는 맘이 들지도 모르겠네요. 사람 앞일은 모르는 거니까요.