Skip to content
isdnetworks
Go back

게이트만으로 안 되는 결정

(수정됨)

하위 상품의 파일명만 인코딩이 다르게 저장돼 있었다. 상위는 정상이고 하위만 다르니 경로가 다른 것으로 보였다.

Table of contents

Open Table of contents

배경 — 찾아낸 조건 분기

새 $uploader가 언제 세팅되는지를 보니 DB::transactionLevel()이 0일 때만이었다. 그러면 트랜잭션 안에서 부르는 하위 처리에서는 $uploader가 null이 된다.

assignImages()는 $uploader가 있으면 새 경로를 쓰고 없으면 옛 경로로 떨어지는 구조였다. 하위가 트랜잭션 안에서 처리되므로 업로더가 없고 옛 경로를 타서 파일명 처리가 다르다는 설명이 깔끔하게 완성됐다.

검증 — 호출부가 뒤집은 것

보고하기 전에 하나만 더 확인했다. 상위가 하위를 부를 때 무엇을 넘기는지였다.

새 업로더가 켜져 있으면 images를 []로 채워서 넘기고 있었다. images가 []이면 옛 경로 함수를 불러도 아무 일도 하지 않는다. 업로더가 비어 있는 것은 맞지만 처리할 이미지가 없으므로 옛 경로를 타지 않았다.

원인 — 철회한 이론

내 설명이 틀렸다. 게이트에 걸리는 것은 맞지만 넘기는 것이 없어서 아무 일도 일어나지 않는 상태였다.

그러면 하위 미디어는 어디서 생기는지를 다시 찾았다. afterCommit에서 상위 미디어를 복사하는 copyMediaFromParent() 별도 경로가 있었고 파일명 처리 차이는 거기서 봐야 했다. 게이트를 찾은 것과 그 경로를 타는 것은 다르다.

교훈 — 멈추게 만드는 느낌

내가 왜 거기서 멈췄는지도 생각해 봤다. 조건이 있고 하위는 그 조건에 안 맞으며 다른 경로로 간다는 논리가 맞아떨어지면 설명이 완성된 느낌이 든다.

그런데 다른 경로로 간다는 것과 그 경로가 무언가를 한다는 것은 다르다. 그래서 게이트를 찾으면 어느 분기로 가는지와 그 분기에 무엇이 넘어오는지와 그것으로 무엇을 하는지 셋을 차례로 확인하기로 했다. 첫 번째만 보면 나머지 둘이 비어 있을 수 있다.

주의 — 남은 미래 위험

이론은 틀렸지만 알게 된 것은 유효했다. 지금은 호출부가 빈 배열을 넘겨서 안전하다는 것이 확인된 상태다.

문제는 트랜잭션 안에서 images를 채워 부르는 신규 경로가 추가되는 경우다. $uploader가 null이므로 옛 경로로 떨어지는데 오류가 나지 않고 조용히 그렇게 된다. 두 가지 방법이 있었는데 지금 그 분기에 예외를 던지도록 고치는 것과 조건을 기록에만 남기는 것이다. 뒤쪽을 골랐다. 이유는 지금 그 분기를 타는 호출이 없어 고치면 이번 조사 범위를 넘어서다. 대신 신규 경로가 그 조건을 모르고 추가될 위험이 남는 것을 감수했다.

틀린 이론을 세웠다가 철회한 사실도 함께 남겼다. 지우고 맞는 것만 쓰면 다음 사람이 같은 이론을 다시 세우므로 이렇게 보이지만 아니라는 기록이 유용하다.

정리


Share this post on:

Previous Post
없는 것을 만들어 내던 조회
Next Post
수집원마다 렌더링 방식을 잰다