피드로 돌아가기
One Nullable Timestamp, Four Account States: Deriving User Status in Laravel
Dev.toDev.to
Backend

중복 상태 컬럼 제거를 통한 Single Source of Truth 확보 및 상태 파생 모델 설계

One Nullable Timestamp, Four Account States: Deriving User Status in Laravel

Nasrul Hazim Bin Mohamad2026년 6월 12일6intermediate

Context

사용자 상태 관리를 위해 status enum 컬럼을 도입할 경우 email_verified_at, deleted_at 등 기존 타임스탬프와 데이터 불일치(Data Drift)가 발생하는 구조적 한계 존재. 여러 컬럼에 분산된 상태 정보가 중복 저장됨에 따라 유지보수 비용이 증가하고 데이터 무결성 보장이 어려워지는 문제 발생.

Technical Solution

  • 상태 저장이 아닌 파생(Derivation) 방식으로 전환하여 데이터 불일치 가능성 원천 차단
  • 유일한 신규 상태인 suspended_at을 Nullable Timestamp로 설계하여 상태 여부와 발생 시점을 동시 확보
  • match(true) 구문을 활용한 우선순위 기반 상태 결정 로직으로 DELETED > SUSPENDED > UNVERIFIED > ACTIVE 순의 명시적 Precedence 정의
  • String-backed Enum에 Presentation 로직(색상, 라벨)을 캡슐화하여 UI 레이어의 조건문 제거
  • 상태 파생(Labeling)과 상태 강제(Enforcement)를 분리하여 Middleware를 통한 세션 무효화 및 강제 로그아웃 처리
  • Pest 테스트 코드를 통한 상태 결정 우선순위 및 세션으로깅 검증으로 회귀 방지 체계 구축

1. 파생 가능한 상태 정보를 별도 컬럼으로 중복 저장하고 있지 않은지 검토

2. 상태 결정 로직에 우선순위가 필요한 경우 match 구문이나 전략 패턴을 통한 명시적 순서 정의

3. Boolean 타입보다 Nullable Timestamp를 사용하여 메타데이터(발생 시점) 확보 고려

4. 상태 변경 시 단순히 리다이렉트하는 것이 아니라 세션 무효화(Invalidate) 및 토큰 재생성을 통한 보안 강화 적용

원문 읽기