--- kind: CASE slug: records-disappeared-without-a-trace title: 매퍼가 null 을 돌려주고 호출부가 걸러 내, 기록이 조용히 사라졌다 topic: failure-drawn-as-absence topicName: 실패를 없음으로 그린다 project: TechLog status: 게시 전 lastVerifiedOn: 2026-09-04 sourceRevision: tech-log@2026-09-02 source: - final/document.md#§10.6 --- # 매퍼가 null 을 돌려주고 호출부가 걸러 내, 기록이 조용히 사라졌다 프로젝트 기록 목록에서 Open Question 이 보이지 않았다. 이 목록은 탐색의 지식 목록과 응답 모양이 다른데 그쪽 매퍼를 쓰고 있었다. 그 매퍼는 두 종류가 아니면 `null` 을 돌려주고 호출부가 걸러 내므로, 질문과 개념은 오류도 빈 줄도 남기지 않고 사라진다. ## 관계 - **화면은 못 읽은 것을 없다고 말하지 않는다** 같은 부류를 다루는 규칙이다. - **개념을 하나 더하자 열세 곳이 그것을 조용히 삼켰다** 이 매퍼가 그 열세 곳 중 하나다. - **합성 루트에 테스트가 없어 공개 사이트 전체가 오류 화면이었다** 스텁 때문에 매핑이 검사되지 않던 다른 사건이다. ## 문제 프로젝트 화면의 기록 목록에 CASE 와 REFERENCE 만 나왔다. 같은 프로젝트에 게시된 질문과 개념이 목록에 없었다. 오류는 없었다. 목록이 한 줄 짧아질 뿐이라 눈으로는 알아채기 어렵다. ## 결론 프로젝트 기록 목록은 탐색의 지식 목록과 응답 모양이 다른데 지식 목록의 매퍼를 그대로 쓰고 있었다. 그 매퍼는 CASE 나 REFERENCE 가 아니면 `null` 을 돌려준다. 호출부가 `filter` 로 걸러 내므로 그 항목은 목록에서 없어진다. 증상 : 목록이 한 줄 짧아진다 오류 : 없음 빈 줄 : 없음 응답 모양에 맞는 매퍼를 쓰고 모든 종류를 싣게 고쳤다. 요약과 주제와 게시일도 실었다. ## 검증 환경 tech-log-frontend : 77125d1 tech-log-backend : f0407d9 — 목록이 요약·주제·게시일을 싣게 함 tech-log-design-package : 76a7ccb 확인 방식 : 프로젝트에 종류별로 기록을 게시하고 목록에 전부 나오는지 확인 ## 재현 조건 1. 한 프로젝트에 CASE·REFERENCE·QUESTION·CONCEPT 을 각각 하나씩 게시한다 2. 프로젝트 화면의 기록 목록을 연다 3. 네 종류가 다 나오는지 센다 ## 본문 ## null 을 돌려주고 걸러 내면 흔적이 없다 매퍼가 아는 종류가 아니면 빈 값을 돌려주고, 호출부는 그 목록에서 빈 값을 걸러 낸다. 이 조합에서는 오류가 나지 않고 빈 줄도 생기지 않는다. 목록의 길이만 줄어든다. | 무엇이 남나 | 있음 | |---|---| | 오류 로그 | x | | 화면의 빈 줄 | x | | 목록 길이의 변화 | o | 목록에 몇 개가 있어야 하는지 아는 사람만 알아챌 수 있다. 공개 화면에서는 그것을 아는 사람이 작성자뿐이고, 작성자는 그 목록을 자기 기록의 전부로 읽는다. ## 응답 모양이 다른 목록에 다른 매퍼를 썼다 프로젝트 기록 목록과 탐색의 지식 목록은 응답 모양이 다르다. | | 프로젝트 기록 목록 | 탐색의 지식 목록 | |---|---|---| | 무엇을 실었나 | 관계 항목 그대로 | 요약·주제·게시일까지 | | 아는 종류 | (매퍼를 빌림) | CASE · REFERENCE | 모양이 다른데 매퍼를 공유하면서 종류 판정까지 그쪽 것을 따랐다. 지식 목록의 매퍼는 CASE 와 REFERENCE 만 다루면 되는 화면을 위해 만들어졌으므로, 질문과 개념을 받으면 빈 값을 돌려준다. ## 왜 매퍼가 종류를 판정해야 하나 편집 화면이 고르는 유형 다섯은 하나의 애그리거트가 아니다. 각 유형이 자기 애그리거트와 테이블을 갖고, 문서 세 종류(Case·Reference·Concept)만 한 테이블을 공유한다. 그래서 한 목록에 여러 종류가 섞이면 항목마다 어디서 온 것인지를 판정해야 한다. 그 판정을 다른 화면의 매퍼에서 빌려 오면 그 화면이 다루던 종류만 통과한다. ## 두 가지를 함께 고쳐야 했다 응답 모양에 맞는 매퍼를 쓰고 모든 종류를 싣게 했다. 그것만으로는 줄이 「제목만 있고 가운뎃점만 남은」 모양이었다. 목록 항목이 관계 항목을 그대로 싣던 구조라 요약도 주제도 게시일도 담을 칸이 응답에 없었기 때문이다. 계약에 그 칸들을 더하고 백엔드가 그것을 채우게 한 뒤에야 줄이 완성됐다. ## 확인하지 못한 것 빈 값을 돌려주고 호출부가 거르는 매퍼가 다른 목록에도 남아 있는지는 세지 않았다.