피드로 돌아가기
Dev.toBackend
원문 읽기
Laravel Eloquent increment() 사용 시 전체 데이터가 업데이트되는 치명적 결함 분석
What I Found Inside Eloquent's increment()
AI 요약
Context
Laravel의 firstOrNew()와 increment() 메서드를 함께 사용할 때 발생하는 예상치 못한 쿼리 동작 발견. 신규 레코드 생성 시 WHERE 조건이 누락된 UPDATE 문이 실행되어 테이블 전체 데이터가 수정되는 문제 발생.
Technical Solution
- Eloquent의 increment() 내부에서 호출되는 incrementOrDecrement() 메서드의 동작 방식 분석
- 모델의 exists 플래그 값에 따라 쿼리 생성 경로가 결정되는 조건부 로직 확인
- exists가 false인 경우 primary key 기반의 WHERE 절을 생략하고 전체 테이블을 대상으로 UPDATE를 수행하는 구조
- firstOrNew()가 새 인스턴스를 반환할 때 exists가 false로 설정되어 unscoped 쿼리가 실행되는 메커니즘 파악
- solve 방법으로 increment() 호출 전 save()를 통해 모델을 DB에 영속화하여 exists 상태를 true로 변경하는 전략 적용
- 또는 즉시 DB 레코드를 생성하는 firstOrCreate()를 사용하여 항상 유효한 ID를 확보하는 설계 채택
Key Takeaway
Eloquent 내부의 많은 메서드가 exists 플래그에 의존하여 동작하므로 모델의 영속성 상태가 쿼리 범위에 결정적인 영향을 미치는 설계 원칙 이해 필요.
실천 포인트
firstOrNew() 사용 후 increment()를 호출하기 전, 반드시 모델의 exists 상태를 확인하거나 firstOrCreate()를 사용하여 쿼리 범위 유실을 방지할 것