업그레이드 경로 (필수)
- 업그레이드 전 버전: 7.0.0-alpha.14 이하 (영향 범위)
- 업그레이드 후(목표) 버전: 7.0.0-alpha.15 이상
- 실행한 명령: 해당 없음 (업그레이드 코드 분석)
- 실행 계정/권한: 해당 없음
참고: 본 이슈는 실제 업그레이드 실패를 재현한 것이 아니라 Upgrade_7_0_0_alpha_15 구현을 검토하는 과정에서 확인한 잠재적인 문제입니다.
증상
Upgrade_7_0_0_alpha_15는 uuid IS NULL인 사용자에게 UUID를 백필한 뒤 users.uuid 컬럼을 NOT NULL로 변경합니다.
현재 구현 흐름은 다음과 같습니다.
WHERE uuid IS NULL
chunk(100)으로 대상 조회
- 각 행을 즉시 UPDATE하여 UUID 저장
- UUID 백필 완료 후
NOT NULL 제약 적용
조회 조건(uuid IS NULL)에 포함되는 컬럼을 반복 처리 중 직접 변경하고 있기 때문에, chunk()가 OFFSET 기반 페이지네이션을 사용하는 경우 일부 레코드를 건너뛸 가능성이 있습니다.
예를 들어 NULL UUID가 다음과 같이 존재한다고 가정하면,
첫 번째 chunk 처리 후에는
만 남게 되고,
다음 OFFSET 조회 시
부터 조회되어
구간이 처리되지 않을 가능성이 있습니다.
이 경우
- 일부 사용자의 UUID가 NULL로 남을 수 있고,
- 이후
users.uuid 컬럼의 NOT NULL 변경이 실패할 가능성도 있습니다.
실제 운영 환경에서 재현한 사례는 아니며, 코드 흐름을 검토하는 과정에서 발견한 잠재적인 문제입니다.
추가로 확인한 사항입니다.
User 모델의 creating Hook은 거치지 않습니다.
UniqueIdService도 사용하지 않습니다.
- 기존 UUID는 덮어쓰지 않고
NULL인 사용자만 처리합니다.
- Query Builder를 이용하여 직접 UPDATE를 수행합니다.
실제로 chunk()가 이 코드에서 OFFSET 기반으로 동작하여 위와 같은 현상이 발생하는지는 확인하지 못했습니다. 코드 흐름상 검토가 필요하다고 판단하여 이슈를 남깁니다.
조회 조건이 반복 처리 중 변경되는 경우에 적합한 순회 방식인지 검토가 필요해 보이며, 필요하다면 chunkById()와 같은 방식도 검토 대상이 될 수 있을 것 같습니다.
확장·커스텀 자산 상태 (필수)
- _bundled 아래 커스텀 확장 없음
- public/.htaccess 및 public/storage 커스텀 없음
- 본 이슈는 코드 분석 기반으로, 확인 대상인 커스텀 자산은 없습니다.
환경 정보
- PHP 버전: 해당 없음 (코드 분석)
- 웹서버·실행 방식: 해당 없음
- DB: 해당 없음
- OS: 해당 없음
로그·스크린샷
로그는 없습니다.
관련 코드는 upgrades/Upgrade_7_0_0_alpha_15.php의 UUID 백필 처리입니다.
혹시 제가 chunk()의 동작이나 해당 구현을 잘못 해석한 부분이 있다면 알려주시면 다시 확인해 보겠습니다.
업그레이드 경로 (필수)
증상
Upgrade_7_0_0_alpha_15는uuid IS NULL인 사용자에게 UUID를 백필한 뒤users.uuid컬럼을NOT NULL로 변경합니다.현재 구현 흐름은 다음과 같습니다.
WHERE uuid IS NULLchunk(100)으로 대상 조회NOT NULL제약 적용조회 조건(
uuid IS NULL)에 포함되는 컬럼을 반복 처리 중 직접 변경하고 있기 때문에,chunk()가 OFFSET 기반 페이지네이션을 사용하는 경우 일부 레코드를 건너뛸 가능성이 있습니다.예를 들어 NULL UUID가 다음과 같이 존재한다고 가정하면,
첫 번째 chunk 처리 후에는
만 남게 되고,
다음 OFFSET 조회 시
부터 조회되어
구간이 처리되지 않을 가능성이 있습니다.
이 경우
users.uuid컬럼의NOT NULL변경이 실패할 가능성도 있습니다.실제 운영 환경에서 재현한 사례는 아니며, 코드 흐름을 검토하는 과정에서 발견한 잠재적인 문제입니다.
추가로 확인한 사항입니다.
User모델의creatingHook은 거치지 않습니다.UniqueIdService도 사용하지 않습니다.NULL인 사용자만 처리합니다.실제로
chunk()가 이 코드에서 OFFSET 기반으로 동작하여 위와 같은 현상이 발생하는지는 확인하지 못했습니다. 코드 흐름상 검토가 필요하다고 판단하여 이슈를 남깁니다.조회 조건이 반복 처리 중 변경되는 경우에 적합한 순회 방식인지 검토가 필요해 보이며, 필요하다면
chunkById()와 같은 방식도 검토 대상이 될 수 있을 것 같습니다.확장·커스텀 자산 상태 (필수)
환경 정보
로그·스크린샷
로그는 없습니다.
관련 코드는
upgrades/Upgrade_7_0_0_alpha_15.php의 UUID 백필 처리입니다.혹시 제가
chunk()의 동작이나 해당 구현을 잘못 해석한 부분이 있다면 알려주시면 다시 확인해 보겠습니다.