전체 유저 공지 개선: Broadcast Alarm을 활용한 성능 향상
전체 공지 개선하기
Q&A 플랫폼 회원수가 계속해서 늘어남에 따라 예전에 작성해 두었던 코드들이 문제를 일으키는 경우가 종종 생겼다. 그중 회원수가 4천명도 채 되지 않았을때 만들었던 공지 알림 기능이 문제가 생겼다.
회원마다 각자의 Alarm 이 있다. 누군가 나의 글에 댓글을 달거나 나를 mention 하거나 알림을 줘야하는 상황이 오면 나의 AlarmList에 해당 정보를 쌓아 두고 Q&A 플랫폼에 들어오면 그 알림을 보여준다.
이런 기능이 들어가면 또 당연히 들어가면 좋겠는것이 관리자가 한번에 모든 사람들이 볼수 있는 Alarm 을 추가 할 수 있도록 하는 것이다! 그래서 그때는 단순하게 생각하고 모든 사람들의 Alarm List 를 돌아다니면서 모두 새로운 Alarm 을 하나씩 넣어주었다.
1
2
3
4
5
6
7
8
AlarmItem alarmItem = new AlarmItem(msg, ...);
do {
profileList = getProfileList(page);
for (Profile profile : profileList) {
Alarm profileAlarm = profile.getAlarm();
profileAlarm.getAlarmList.add(alarmItem);
}
} while(profileList.size() > 0)
그리고 posthandle 에서 본인의 alarmlist 를 넣어준다!
1
2
3
4
5
6
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView modelAndView) throws Exception {
...
modelAndView.addObject("alarmList", userAlarm.getAlarmList());
...
}
사람이 얼마 되지 않았을때는 전혀 문제가 되지 않았지만 지금 그에 비해 무려 13배가 넘는 회원이 생겨버려서 이제는 공지 Alarm을 할때 시간이 너무 오래 걸렸다. 또 에러가 발생하는 경우 디버깅이 너무 힘들었다 (시간이 너무 오래 걸리니까!! )
broadcastAlarm 을 하나를 만들어 모두가 공유하자!
따라서 저렇게 전체 공지를 하는 경우에 사용할 broadcastAlarm 을 하나 만들기로 했다. 그리고 유저가 Q&A 플랫폼에 들어오면 본인의 Alarm 들과 boradcastAlarm 들을 가져오는 것이다. 그러면 단순히 추가 할때 do while 이 아닌 한번만 넣어주면 된다! 벌써 여기서 부터 엄청난 시간이 단축된다! 또 만약 에러가 발생하면 금방 찾아 낼 수 있다!
1
2
3
AlarmItem alarmItem = new AlarmItem(msg, ...);
Alarm broadcastAlarm = utils.getBroadcastAlarm();
broadcastAlarm.getAlarmList().add(alarmItem);
1
2
3
4
5
6
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView modelAndView) throws Exception {
...
modelAndView.addObject("alarmList", getMergedAlarmList(userAlarm.getAlarmList(), broadcastAlarm.getAlarmList());
...
}
더 생각해본점
기존에 확인한 알림의 경우에는 alarmitem 에 checked 라는 필드가 있어서 checked가 false인 item 이 있으면 새로운 알림을 표시했는데 broadcastAlarm 이 생기면서 한명 한명 다 저장하기는 어렵다고 생각했다.
따라서 이제는 그 필드를 확인하지 않고 알림 dropdown 을 누른 시간을 저장하고 알림들의 추가된 시간을 저장해서 그 사람이 확인하지 않은 새로운 알림이 있는지를 표시 하도록 했다.
개선된 점
- 우선 속도가 굉장히 빨라 졌다!! 기존에는 추가버튼을 누르고 한참을 있어야 모든 사람이 확인 할 수 있었는데 현재는 추가버튼을 누르자 마자 사람들이 볼수 있다.
- 필요없는 정보들이 많이 사라졌다. 똑같은 내용이 50000개 이상 db 에 있었는데 이제는 단 1개로 충분하다!
- 계속해서 말하지만 알수 없는 에러가 없어졌다. 엄청난 do while을 돌다보니 에러가 나도 뭔가 다시 재현하기도 어렵고 그랬는데 이제는 그런 에러들을 마주하지 않아도 된다.