Skip to content
isdnetworks
Go back

다시 하려면 무엇이 0이어야 하나

가져오기 기능을 고치고 같은 데이터를 여러 번 넣으면서 결과를 봐야 했다. 두 번째 시도에서 이미 있다는 메시지가 나와서 무엇을 기준으로 중복이라고 하는지부터 찾았다.

Table of contents

Open Table of contents

무엇이 0이어야 하는가

검사 코드는 상위 상품과 공급처 두 컬럼의 조합으로 개수를 세고 있었다. 그 개수가 0이어야 다시 가져올 수 있다는 뜻이다.

반복 테스트의 조건은 이렇게 코드 안에 적혀 있었다. 무엇을 지워야 하는지는 삭제 쪽이 아니라 검사 쪽을 읽어야 나온다.

소프트 삭제로 부족한 이유

처음에는 삭제 표식만 세우는 방식으로 지웠는데 여전히 같은 메시지가 나왔다. 중복 검사 쿼리에 삭제 조건이 없었고 프레임워크의 자동 필터도 이 경로에서는 걸리지 않았다.

검사가 표식을 안 보면 표식만으로는 개수가 줄지 않는다. 그래서 실제로 행을 지우는 쪽으로 가야 했다.

참조의 역순

하나를 지우려면 연결된 것을 먼저 지워야 하므로 참조 관계를 그렸다. 미디어와 옵션과 재고와 옵션그룹과 분류 연결과 브랜드 연결과 본문이 상품에 매달려 있었다.

삭제는 잎에서 뿌리로 가는 참조의 역순이다. 순서를 뒤집으면 참조 무결성에 걸려 중간에 멈추고 반쯤 지워진 상태가 남는다.

공유되는 자원의 참조 수

본문이 특이했는데 여러 상품이 같은 본문을 참조할 수 있는 구조였다. 그래서 그 본문을 가리키는 상품 수를 먼저 세고 하나일 때만 함께 지웠다.

확인하지 않고 지우면 멀쩡한 다른 상품의 본문이 사라진다. 공유되는 자원은 지우는 쪽이 아니라 남는 쪽을 먼저 세야 한다.

명령 성공과 실제 삭제는 다르다

데이터베이스만 지우면 저장소에 파일이 남으므로 해당 경로도 접두사 단위로 지웠다. 접두사가 정확한지 먼저 확인했는데 잘못된 값으로 지우면 남의 것까지 사라지기 때문이다.

지운 뒤에는 같은 조건으로 다시 세어 0인지 확인했다. 조건이 안 맞아 아무것도 안 지워졌을 수도 있고 다른 경로로 다시 생겼을 수도 있으므로 명령의 성공을 결과로 삼지 않았다.

이 과정을 반복해야 해서 스크립트로 만들되 지우기 전에 대상 목록을 먼저 출력하게 했다. 실제로 한 번 멈췄는데 조건이 넓어서 다른 상품까지 잡혀 있었다.

정리


Share this post on:

Previous Post
이름만으로 판정하지 않은 파일
Next Post
검색이 만든 목록과 요구사항의 거리