타운광장토픽게시판

포인트 마켓에 올린 회원 분리하기 모듈 소개글입니다.

 

제가 만들고 있는 커뮤니티 사이트에 채용할려고 만든 기능인데 이 분리하기 기능 만큼은 가급적이면 여기저기서 많이 써줬으면 하는 바램에 미리 공개합니다. 뭐 다른 모듈들도 일단 제가 좀 써먹고 나중에 다 공개할 생각이긴 합니다만...

 

회원 분리하기는 몇년전에 그누보드로 운영하던 제 사이트에서 실험적으로 만들어봤었고 회원들에게서 좋은 반응을 얻었었습니다. 그누보드에선 이 기능을 배포/재활용 가능한 모듈 형태로 만들 방법이 없었고 XE/라이믹스 모듈로는 진작부터 만들고 싶었는데 오랫동안 미뤄오다가 이제서야 모듈 제작을 공부해서 만들게 되었네요. 이 모듈의 제작에는 기존 회원 차단하기 모듈이 많은 도움이 되었습니다. 문서 하나 없이 기존 모듈 소스 분석하는 식으로만 공부하다보니 꽤 힘들었네요. 마지막 남은 버그가 [모바일에 최적화된 화면으로 보기]가 자꾸 화면 밑에 뜨는거였는데 알고 보니 member_divide.mobile.php 파일이 없어서 일어난 단순한 버그... 아 이걸 역으로 디버깅해서 알아내려니 참 짜증이...

 

하여튼 그럼 회원 분리하기가 회원 차단하기와 뭐가 다르냐?

 

일단 기존의 회원 차단하기는 따지고 보면 굉장히 무례한 기능이었습니다.

뭐 물론 차단당한 사람이야 내가 차단당했다는 것도 모를테지만 어쨌든 일방적으로 차단당한다는건 굉장히 무시당하는 느낌이라서... 내가 차단당했다는걸 알았을때 화 안날 사람 드물겁니다.

 

게다가 차단한 사람 입장에서도 굉장히 찝찝한 기분입니다. 예를 들면 내 글에 악성댓글을 남기는 누군가를 차단했다고 치죠. 이제 차단당한 사람의 쓴 댓글은 나한테는 안보입니다. 하지만 나한테 안보인다고 해서 그 댓글이 정말 사라진건가요? 여전히 남아있잖습니까? 나는 못보지만 제삼자들은 여전히 그 댓글을 보고 있죠. 내 욕을 하던 그 댓글을 제 삼자들은 여전히 잘 보고 있다 그 말입니다. 그걸 생각하면 차단이란건 그냥 눈가리고 아웅이라는 생각밖에 안듭니다. 물론 일단 내 눈에 안뜨이면 받는 스트레스가 줄어드는건 맞습니다만 본질적인 문제 해결과는 거리가 있죠. 

 

게다가 성능의 문제도 있습니다. 이게 서버에 부하를 굉장히 많이 주는 기능입니다. 그래서 다른 사이트의 예를 들면 클리앙은 최대 13명, 루리웹은 최대 100명만 지원합니다. 회원 차단하기 모듈 원본도 최대 인원이 디폴트 20명이었습니다. 그렇게 자주 쓰는 기능도 아니지만 진짜 맘먹고 써볼려고 해도 사실 최대 차단 인원이 너무 적죠. 대형 사이트 상주인원을 생각해보면 고작 이정도 인원을 차단한다 한들 큰 의미가 없습니다.

 

회원 분리하기는 놀랍게도 이런 문제를 모두 해결하였습니다!!

 

회원 분리하기는 간단히 요약하자면 쌍방 차단입니다.

내가 X라는 회원을 차단하면 나 역시 X라는 회원으로부터 차단당하는 식입니다.

X가 쓴 글을 내가 볼 수도 없지만, 그 대신 내가 쓴 글을 X가 보는 것도 불가능합니다.

서로 상대방이 쓴 글을 볼 수 없다?

즉 두 사람은 하나의 사이트를 접속했지만 실제로는 완전히 서로 다른 세계를 경험하고 있다고 봐도 무방합니다. 두 사람의 세계는 [분리]된 것입니다. 그런 의미에서 이 기능의 이름은 회원 분리하기 입니다.

 

이 기능은 일방적이지 않기 때문에 기분이 나쁠 일도 별로 없습니다. 

내가 차단을 [당한게] 아닙니다. 내가 뭔가의 조치를 나도 모르는 사이에 일방적으로 당한게 아니라 나도 너도 다 같이 똑같은 조치를 당한겁니다. 이런 식으로 생각하면 기분나쁠 일이 많이 줄어들죠. 

 

그리고 이런 식으로 서로의 세계가 완전히 분리되면 더이상 문제가 발생할 소지가 없습니다. 저 사람은 나의 세계에서 완전히 사라졌기 때문에 내 글을 보지도 못하고 내 글에 댓글을 달 수도 없습니다. 악성 댓글이 내 눈에만 안보이는게 아니라 그 사람이 내 글에 악성댓글을 달 가능성이 미래에 완전히 사라지는겁니다. (이미 작성되어있는 과거의 댓글들이야 그냥 안보일뿐인건 마찬가지지만요.. 뭐 그건 어쩔 수 없죠)

 

게다가 이 기능은 컨텐츠를 만들어내는 사람에게 굉장히 유용합니다.

예를 들면 좋은 자료를 올려주는 우량 회원 A님이 계십니다. 이 분은 사이트에 크게 도움이 되는 분인데 이 분이 올리는 글에 깐족대는 댓글을 달아대는 B라는 놈이 있습니다. A님의 고마움도 모르고 B는 A를 괴롭힙니다. 여기서 관리자가 그리고 A회원이 할 수 있는 일이 뭐가 있을까요? 별로 없습니다. B가 선을 넘지 않는 이상 말입니다.

하지만 회원 분리하기 기능이 있다면? A회원이 B회원과 분리하면 그만입니다.

B회원은 이제 A회원이 올려주는 양질의 자료를 아예 볼 수 조차 없게 되었습니다. A회원은 더이상 스트레스를 받지 않을뿐더러 자기 자료를 B회원한테 보여주지 않게 됨으로써 작은 복수까지 성공한 셈이 되었네요? 아주 기쁜 일입니다.

 

마지막으로 성능에 관해서 말씀드리겠습니다.

회원 분리하기는 성능 문제를 해결하기 위해서 처리를 서버에서 하지 않고 클라이언트로 옮겼습니다. 그 결과 어마어마한 처리 성능을 가지게 되었습니다. 제가 테스트로 3000명을 분리해봤습니다만 아무 문제 없었습니다. 

 

아 물론 클라이언트에서 하다보니 크롬의 개발자 모드를 좀 다룰 줄 안다면 귀찮기는 해도 깨버릴 수 있기는 합니다... 하지만 뭐 그렇게까지 해서 나하고 분리된 회원의 글을 읽으려고 할 사람이 얼마나 있겠습니까? 애초에 보안과는 아무 상관이 없는 기능이고, 자기와 분리된 회원의 글을 읽으려고 그렇게까지 한다면 그건 그거대로 비참한 짓 아니겠습니까?

 

그리고 마지막으로 회원 분리하기 기능이 가지는 자그마한 추가 장점은..

원래 서버단에서 처리하는 차단하기 기능은 기본적으로 로그인이 되어 있지 않으면 처리 자체가 불가능합니다. 그래서 로그인 안되어 있으면 차단된 회원의 불쾌한 글을 우연히 다시 볼 수 있는 가능성이 있죠. 하지만 회원 분리하기 기능은 로그인이 안되어 있어도 작동합니다. 왜냐면 분리 목록이 localStorage에 남기 때문이죠. 그래서 로그인이 풀려도 우연이라도 분리된 회원을 다시 볼 일은 없습니다.

 

참고로 이 기능이 내부적으로 어떤 식으로 동작하는지 말씀드리겠습니다.

 

rx_member의 extra_vars에 divide_update_dt라는 필드를 추가적으로 만듭니다.

이건 분리하기 목록이 마지막 업데이트된 일시를 기록합니다.

그리고 이 divide_update_dt를 매번 meta태그를 통해서 클라이언트로 전달합니다.

클라이언트는 이 divide_update_dt를 이용해서 자기가 가진 분리목록이

최신이 아닌 경우 ajax를 통해 분리목록을 업데이트합니다.

그리고 모든 페이지에서 자동으로 localStorage로부터 분리목록을 로드해서

DOM을 조작해서 분리된 회원이 작성한 글을 가려줍니다.

이게 가능한 이유는 XE/라이믹스는 게시판 목록 같은걸 만들때 

member_{$member_srl} 이라는 CSS 클래스 형태로

이게 어떤 회원에 의해 만들어진건 자료인지 흔적을 남겨둡니다.

이게 있기에 클라이언트에서 DOM만 쳐다보고도 처리가 가능한거죠. 

그누보드에는 이런게 없어서 따로 추가해줘야 했었는데

XE/라이믹스에는 이미 이게 있어서 다행이었습니다.

이건 스킨을 수정해야 하는거라서.. 모듈로 배포가 불가능하죠.

만약 스킨을 전부 수정해야 하는거라면

회원 분리하기 모듈은 도저히 배포가능한 모듈이 될 수가 없었겠죠.

각자 쓰시는 레이아웃이나 보드 스킨에 약간씩 커스터마이즈가

필요할 수도 있습니다.

스킨에 따라 member_{$member_srl} 클래스 출력을 군데군데 빼먹고

안하는 경우도 있기 때문입니다.

스킨에 따라 적당한 커스터마이즈도 필요할 수 있지만

뭐 대부분은 괜찮게 동작할겁니다.

  • profile
    오 굉장히 유용해 보이네요!
  • profile
    혹시 분리하기 버튼이 어디에 추가되는 부분일까요?!
    게시글 제목이 '차단된 게시글입니다' 로만 보이는걸까요?
  • profile ?

    분리하기는 기존 차단하기와 마찬가지로 회원 닉네임을 클릭했을때 나오는 팝업메뉴에 추가됩니다.
    그리고 완전히 사라져서 그냥 안보입니다. 차단된 게시글입니다 이런 식으로 흔적을 남기지 않습니다.

    만약 게시글 본문이 분리된 회원의 글이라면 history.back()으로 자동으로 뒤로 갑니다.

    목록에서 안보이면 게시글 본문까지 들어오는 경우는 거의 없지만 뭐 어쨌든 들어올 가능성이 0은 아니라서...

    스킨에 따라 안되는 경우 일단 스킨에서 정상적으로 member_{$member_srl} 출력을 하고 있는지 확인하시고

    그 다음에는 member_divide.js 파일에서 hide()하는 조건을 추가하는 식으로 커스터마이즈하시면 됩니다.

    그리고 추가적으로 서로 쪽지 송신도 막습니다.

  • ? profile
    감사합니다!
  • profile
    자세한 설명 감사합니다.
    확실히 설명을 잘해주셔서 이해가 쉽고 좋네요
    감사합니다 :)
  • profile
    모듈 공유도 감사하지만 자세한 설명이 감격이네요.
  • profile
    오........