블랙홀에 빠진 유저 처리 - (2)

Siwon Choi·2022년 11월 25일
0

42Cabi-#Troubleshooting

목록 보기
2/3

✏️ 지난 글 요약

❓ 블랙홀에 빠진 유저는 42 intra 로그인을 할 수 없기 때문에 Cabi 사이트에도 로그인이 불가능하다. 따라서 해당 유저가 대여하고 있던 사물함이 있어도 반납할 수 없다. 이로 인해 사용되지 않은 채로 방치되는 사물함이 생기고, 해당 유저에게 연체 메일이 발송되는 문제가 발생했다..!

🤔 이를 해결하고자 블랙홀에 빠진 유저를 DB에서 삭제 처리하려고 했으나, 이러면 어드민 사이트에서 대여 로그 확인이 불가능해지는 문제가 생길 수 있다.

❗️ 삭제해도 문제고, 가만히 놔두어도 문제이니 블랙홀에 빠진 유저의 정보를 업데이트하자! 해서 블랙홀에 빠지면 해당 유저의 user_id를 음수로, intra_id는 [blackholed]${intra_id} 형태로 변경을 시켰다.

🤔 그러나...! 어드민 사이트에서는 intra_id로 특정 유저를 검색할 때 string 값이 정확히 일치하는 경우에만 결과가 나오게 설정되어 있다. 검색어가 부분 일치되는 결과를 모두 뿌려주면 해결되는 문제가 아닌가 생각을 했지만 단순한 문제가 아니었다...

🪨 걸림돌

어드민 사이트는 intra_id로 검색을 할 때는 결과 값이 무조건 1명이 나오는 상황만 상정을 하고 페이지 구현을 했었다. 따라서 검색어가 부분 일치되는 결과를 뿌려준다면 1명 이상의 결과 값이 나올 수 있기 때문에 이를 프론트에서 적절히 처리해주기가 어렵다. 이 방법대로면 아예 프론트에서 대공사가 진행되어야 하는 상황이 벌어진다..!

👩🏻‍🔧 임시 방편

사실 어떤 유저가 하필이면 사물함을 반납하지 못한채로 블랙홀에 빠지고, 하필이면 사물함에 귀중품을 보관하고 있었어서 데스크에 짐을 찾으러 가는 상황이 빈번하게 발생할 일도 없다.
이때 당시 새로운 요구 사항 구현을 위해 관련 API 명세 작성 및 구현 작업을 하고 있었기 때문에 들이는 공수에 비해 리턴이 작은 블랙홀 유저 처리보다는 당장 급한 일을 처리하기로 하고 일단 이 문제는 임시 방편으로 처리하기로 했다.

sichoi라는 유저로 검색을 했을 때 검색 결과가 나오지 않는다면 해당 유저는 블랙홀에 빠졌기 때문에 intra_id가 변경된 것이므로 [blackholed]sichoi라고 다시 검색 요청을 한 결과를 보여주는 것으로 대처했다.
최근에 8기 1차 피씬이 종료가 되었기 때문에 최소 한 달 간은 새로운 유저가 들어오지 않는다.
따라서 sichoi라는 다른 유저가 생기게 되는 것도 최소 한 달 뒤에 가능한 일이다.
그렇기 때문에 데스크에서 당장은 유저의 대여 로그 확인에는 문제가 없을 것이다.

💡 새로운 해결 방법?

장기적으로 봤을 때도 결국 이 문제도 꼭 해결이 필요한 문제이다. 때문에 조금 공수가 들더라도 어드민 사이트에서 intra_id로 특정 유저를 검색할 때 검색어가 부분 일치되는 결과를 모두 뿌려주고 프론트에서 이를 적절히 처리할 수 있도록 페이지 구성을 수정하는 쪽으로 위 문제를 해결하려고 했었다.
그러나 조금 더 근본적으로 문제를 해결할 수 있는 방안을 팀원 분이 제시해주었다.

처음 생각한대로 DB에서 블랙홀에 빠진 유저를 삭제하는 것이다. 대신, 대여 로그를 추후에 확인할 수 있도록 lent_log 테이블에 intra_id라는 필드를 추가해야 한다.
기존에는 lent_log 테이블에 user_id라는 필드만 존재하고 대여 로그를 조회할 때는 user 테이블에 조인을 하여 intra_id를 가져오는 식으로 했었다.
때문에 대여 로그를 확인하려면 해당 유저가 반드시 DB에 존재했어야 했지만, lent_log 테이블에 intra_id 필드를 추가함으로써 이제 더이상 유저가 DB에 존재하지 않더라도 대여 로그 확인이 가능한 것이다..!

✨ 최종 해결 방법

42에서 공통과정을 모두 클리어한 사람에게는 member라는 호칭이 붙게되는데 member는 블랙홀 날짜를 가지고 있지 않는다.
또한 42 staff분들도 Cabi에 로그인 하신 분들이 계신다. (두둥..!)
아마 사물함을 대여하시려는 목적보다는 그냥 한 번 로그인 해보신 것 같다.
staff분들은 굳이 삭제 처리하지 않고 유지시키는 것으로 했다.

lent_log에 intra_id 필드 추가

  • lent_log 테이블에 intra_id 필드를 추가한다.
  • 기존에 존재하는 lent_log에는 intra_id 값이 존재하지 않기 때문에 user 테이블과의 조인을 통해 모두 intra_id 값을 추가해주어야 한다.

user 테이블에 blackhole_date 추가

  • user 테이블에 blackhole_date(블랙홀 날짜) 필드를 추가했다.
  • 유저가 최초로 로그인을 하게 되면 블랙홀 날짜도 함께 받아와 DB에 저장한다.

blackhole_date에 동작하는 타이머 추가

  • 서버가 재가동 되면 DB에 존재하는 모든 유저에게 자신이 가지고 있는 블랙홀 날짜에 동작하는 타이머를 달아둔다.
  • 타이머가 발동하면 42 intra에 해당 유저의 정보를 받아와 블랙홀 날짜와 오늘 날짜를 비교한다.
  • 이때 블랙홀에 빠진 유저라면 해당 유저를 DB에서 삭제한다.
  • 블랙홀에 아직 빠지지 않았다면 DB에 블랙홀 날짜를 업데이트하고 해당 날짜에 동작하는 타이머를 다시 등록한다.
  • member이거나 staff라면 90일 정도로 넉넉한 타이머를 달아두었다.
  • 90일 후에 다시 유저 정보를 받아왔을 때 intra에 해당 유저가 존재 하지 않아 404 Not Found를 응답받는다면 42 intra에서 완전히 삭제된 유저이므로 해당 유저를 삭제 처리한다.
  • 그렇지 않은 경우에는 또다시 90일 타이머를 달아둔다.

최종 블랙홀 처리 루틴에 대한 도표는 아래와 같다.

profile
올바로 작동하지 않는다고 걱정하지 마라. 모든 게 잘 되었다면, 내가 할 일이 없어진다.

0개의 댓글