generated from ttipo/project-base
feat: 메일 14단계 — 자체 검색 색인 · 조건 검색 · 강조 · 대화 묶기 #18
Reference in New Issue
Block a user
Delete Branch "feat/mail-search-index"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
무엇을 · 왜
메일 14단계 — 엔진 검색(낱말 단위라 조사 · 부분 일치에 약하다)을 대신할 자체 검색 색인과, 11-05 확정한 디자인(캔버스 v52 · 디자인 README 14단계 절)대로 조건 검색 · 맞은 곳 강조 · 대화 묶기를 더한다.
mail_search_messages·mail_search_states)과 글자 두 개 묶음(GIN). 실시간 소식 · 5분 맞추기 · 검색 바로 전 맞추기로 따라가고, 지난 메일은 밤 창(KST 22:0002:45 · 05:0007:30)에 최신부터 천천히 채운다. 로그인한 사내 직원만 색인하고, 메일 글 · 제목 · 검색어는 로그에 남기지 않는다(개발 DB 쿼리 로그도 끈다).shared_buffers256MB(d57e6bf, 색인이 메모리에 있어야 빠르다). 마이그레이션 넷은 배포 때 저절로 돈다.9bfa53c— 충돌 없음). 이 PR 머리가 합친 모습 그대로라 빨리 감기로 합칠 수 있다.합치는 것은 배포가 아니다 — 운영 서버 B 에는 전환 뒤 안정화(11월 셋째 주 무렵)가 끝나면 따로 올린다(db 메모리와 함께).
확인 방법
9ba4bc1·438dac8에 고친 것), 10명 흉내 데이터로 쿼리 계획 · 속도(e2e 가 EXPLAIN 으로 찾기 GIN 하나만 쓰는지 본다).영향 범위
체크리스트
BusinessException/error.code분기)npm run sync:error-codes실행 후 생성 파일까지 커밋 (바꾸지 않음)*.example값은 placeholder)🤖 Generated with Claude Code
14단계 3차다. 같은 대화(답장 · 전달로 이어진 메일)를 읽기 화면에 보이고, 목록을 대화로 묶어 볼 수 있게 한다. 색인이 준비된 직원은 우리 대화 키로, 채우는 중인 직원은 엔진의 스레드로 묶는다(응답의 basis — 첫 쪽에서 정하고 커서가 잇는다). - 대화 키: 색인 쓰기 때 넣은 메일의 부모 · 자식(References · In-Reply-To) 가운데 말머리 (회신 · 답장 · 전달 포함)를 뗀 제목이 같은 것을 가장 작은 키로 합친다. 늦게 온 원본도 잇고, 다시 넣어도 키는 풀리지 않는다. 색인 판 4 - GET /api/messages/{id}/conversation — 오래된 차례, 휴지통 · 스팸메일함에만 든 메일과 발송 중인 내부 초안은 빼고 지금 메일은 늘 넣는다 - GET /api/conversations?mailboxId= — 그 메일함의 대화 한 줄씩(참여자 10명 · 통 수 · messageIds 최신 500 · pendingSendIds). 직원 주소 btree 로 먼저 좁힌다(10명 흉내 큰 메일함 첫 쪽 81ms) - 설정 groupByConversation(처음 끔) — 서버는 저장만 하고 묶을지는 화면이 정한다 - 마이그레이션 AddMailSearchSender — 참여자는 따로 둔 첫 보낸 사람 칸에서만 읽는다 리뷰 반영: 엔진 방식에 개수 · 시간 상한(같은 대화 한 요청 1,000통 · 묶은 목록 스레드마다 500 · 한 요청 2,000 · 15초, 요약 속성은 내보낼 메일만), Mailbox/get 장애는 503, 꾸민 커서는 엔진 · DB 보다 먼저 400, 같은 대화 한 문장, 이름 안의 <주소>로 참여자를 꾸미지 못하게, 로그 추적 ID. 검색 표본 표 머리 주석(frontend 로 옮겼다)도 함께 고친다. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>- 분할 보기에서 대화 줄을 고르면 도구 줄이 두 줄로 넘치던 것, 목록 머리의 안 읽은 수가 1440 에서도 늘 잘리던 것 - 묶은 줄에 한 일의 알림은 "{메일함}에 있는 메일 N통을 …"(줄의 통 수는 대화 전체라서), 되돌리기 알림은 되돌린 메일함을 말한다 - 같은 대화 칸: 펼친 줄의 첨부 수 안내, 우리 원문 인용 머리부터 뺀 미리 보기, 보내기를 기다리는 메일은 줄 끝에 - 검색 준비 중 · 결과 없음 · 하루짜리 기간 · 내 이름 조건의 글, 예약 시각의 띄어쓰기, 이름 맞추기(대화로 묶기 · 내용에 든 말 · 표 머리 참여자) - 다른 탭 · PC 에서 바꾼 설정을 탭으로 돌아올 때 다시 받는다(60초 지났을 때) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>- 대화로 묶은 휴지통에서 줄을 골라 영구 삭제하면 확인 창 · 알림을 "휴지통에 있는 메일 N통을 …"으로 쓴다 — 줄의 통 수는 대화 전체라서 (옮기기 알림 "{메일함}에 있는 메일 N통을 …"과 같은 결) - 값을 끼워 넣는 글의 띄어 쓴 조사를 붙인다(9단계 "@도메인에서", 11단계 "25MB를" · "2GB까지" · "20MB가"), 공개 내려받기 화면의 신고 주소는 끝 글자로 조사를 고른다 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>