기존에는 하나의 사물함에 한 명의 유저가 대여를 할 수 있었기 때문에 단순하게 사용 가능
, 대여중
두 가지 상태만 존재했다. 하지만 일부 사물함이 공유 사물함
으로 이용됨에 따라 하나의 사물함을 여러 유저가 대여를 하는 경우가 발생한다.
공유 사물함은 풀방이 되기전까지는 만료시간이 없는 상태로 사용할 수 있다가, 풀방이 되면 만료시간이 설정된다. 한 번 만료시간이 설정되고 난 후에는 모든 유저가 반납을 하기 전까지는 만료시간이 유지가 된다. ex) 풀방이 되어 만료시간이 설정되고 난 후, 누군가 반납을 하여 자리가 생긴 곳에 또다른 유저가 대여를 하면, 해당 사물함을 이용중인 유저의 만료시간으로 새 유저의 만료시간이 설정된다.
이렇듯 기존과 비교했을 때 공유 사물함은 대여/반납 과정에서 발생할 수 있는 조건과 경우의 수가 많아져 이를 단순히 조건에 따라 예외처리를 하고 나니 코드가 굉장히 지저분해졌다… 때문에 코드를 작성한 본인도 알아보기 힘들고 추후 수정사항이 생긴다면 로직 자체를 뜯어고쳐야하는 문제도 발생할 위험이 있다.
이런 문제를 개선하기 위해 DFA(Deterministic Finite Automata)
를 활용하여 대여/반납 과정에서 발생할 수 있는 상황에 따라 사물함의 상태를 정의하였다.
사물함의 상태는, 현재 사물함에 상태와 발생한 동작(대여 or 반납)에 따라 다음 상태로 전이된다.
아래는 상태 전이도와 사물함의 상태에 대한 상세 설명이다.
사물함 상태 종류
AVAILABLE
Default 상태이며, 자유롭게 대여가 가능한 상태이다.
SET_EXPIRE_FULL
처음으로 풀방이 되어 사물함을 이용중인 유저의 대여 만료 기한이 설정된 상태이다.
SET_EXPIRE_AVAILABLE
로 상태가 전이된다.SET_EXPIRE_AVAILABLE
만료시간은 설정됐으나, 잔여 자리가 있어 대여가 가능한 상태이다. 이 상태에서 대여를 하면 기존 해당 사물함을 이용하고 있는 유저의 대여 만료시간을 똑같이 할당받는다.
SET_EXPIRE_FULL
로 상태가 전이된다.AVAILABLE
로 상태가 전이된다.EXPIRED
매일 오전 12시에 연체자 처리 루틴
이 실행된다. 이 때 연체라고 판단된 유저가 사용하고 있는 사물함의 상태는 EXPIRED
로 전이된다.
AVAILABLE
로 상태가 전이된다.BANNED
연체자 처리 루틴에서 연체 이후 15일 째가 되는 유저가 사용하고 있는 사물함의 상태는 BANNED
로 전이된다. 이 상태의 의미는 장기 연체로 인해 강제 반납 처리되었음을 나타낸다.
AVAILABLE
로 변경시킨다.BROKEN
AVAILABLE
로 변경시킨다.