작업 내용
대화방이 누가 종료했는지를 남긴다.
conversations 에 ended_by 컬럼 추가 (USER | AUTO_BATCH, 아직 종료 안 된 방은 NULL)
- 사용자 종료 경로와
ConversationService.endForAutoBatch 가 각각 자기 값을 남기도록 한다. 지금은 둘 다 같은 Conversation.end() 를 부르고 status 만 바꾼다.
- 백오피스 '대화방별 사용량' 응답에 실어 보내고, 표의
직접 종료 추정 을 직접 종료(확인된 사실)로 승격한다.
- 값이 없는 과거 방은 백필이 불가능하므로
알 수 없음 같은 별도 표시로 둔다. 직접 종료 로 넘기지 않는다.
작업이 필요한 이유
백오피스 표는 지금 "리마인더 기록이 없고 방이 종료돼 있다" 를 보고 사용자가 직접 종료했다고 되짚는다. 이 추측이 틀리는 경로가 네 가지 있다.
1. 배치와 알림 기록의 도입 시차 (영향이 가장 크다)
그 사이 약 2주치 방들은 배치가 자동 종료시켰는데도 알림 기록이 없다. status = ENDED + reminderNotification = null 이 그대로 성립해서, 지금 판정으로는 전부 "사용자가 직접 종료한 방" 으로 보인다.
2. 리마인더 루프가 중간에 끊긴 회차
UnfinishedConversationReminder 는 회원마다 따로 보내면서 예외를 삼키지 않는다. 중간 한 회원에서 터지면 뒤쪽 회원들의 기록이 통째로 빠지고, 그 방들은 30분 뒤 배치가 종료시킨다.
3. 기록 저장만 실패한 경우
NotificationLogRecorder 는 저장 실패를 runCatching 으로 삼키고 로그만 남긴다. 알림은 나갔는데 기록만 없는 방이 생길 수 있다.
4. 스케줄러가 돌지 않은 회차
배포나 재시작으로 04:30 을 건너뛰면 그 회차 기록이 통째로 없다.
네 경우 모두 근본 원인이 같다. Conversation 에 종료 주체가 없어서, DB 만 봐서는 사용자 종료와 배치 종료가 원리적으로 구분되지 않는다. 알림 기록의 부재를 근거로 삼는 한 이 추측은 계속 틀릴 수 있고, 표를 보는 사람은 그게 사실인지 추정인지 알 수 없다.
종료 주체를 남기면 위 네 구멍이 한 번에 닫힌다. 알림 기록이 빠졌든 배치가 안 돌았든 상관없어지기 때문이다.
참고
작업 내용
대화방이 누가 종료했는지를 남긴다.
conversations에ended_by컬럼 추가 (USER|AUTO_BATCH, 아직 종료 안 된 방은 NULL)ConversationService.endForAutoBatch가 각각 자기 값을 남기도록 한다. 지금은 둘 다 같은Conversation.end()를 부르고status만 바꾼다.직접 종료 추정을직접 종료(확인된 사실)로 승격한다.알 수 없음같은 별도 표시로 둔다.직접 종료로 넘기지 않는다.작업이 필요한 이유
백오피스 표는 지금 "리마인더 기록이 없고 방이 종료돼 있다" 를 보고 사용자가 직접 종료했다고 되짚는다. 이 추측이 틀리는 경로가 네 가지 있다.
1. 배치와 알림 기록의 도입 시차 (영향이 가장 크다)
notification_log테이블: [feat] 백오피스에서 새벽 알림 발송 여부 확인 #210, 2026-08-28그 사이 약 2주치 방들은 배치가 자동 종료시켰는데도 알림 기록이 없다.
status = ENDED+reminderNotification = null이 그대로 성립해서, 지금 판정으로는 전부 "사용자가 직접 종료한 방" 으로 보인다.2. 리마인더 루프가 중간에 끊긴 회차
UnfinishedConversationReminder는 회원마다 따로 보내면서 예외를 삼키지 않는다. 중간 한 회원에서 터지면 뒤쪽 회원들의 기록이 통째로 빠지고, 그 방들은 30분 뒤 배치가 종료시킨다.3. 기록 저장만 실패한 경우
NotificationLogRecorder는 저장 실패를runCatching으로 삼키고 로그만 남긴다. 알림은 나갔는데 기록만 없는 방이 생길 수 있다.4. 스케줄러가 돌지 않은 회차
배포나 재시작으로 04:30 을 건너뛰면 그 회차 기록이 통째로 없다.
네 경우 모두 근본 원인이 같다.
Conversation에 종료 주체가 없어서, DB 만 봐서는 사용자 종료와 배치 종료가 원리적으로 구분되지 않는다. 알림 기록의 부재를 근거로 삼는 한 이 추측은 계속 틀릴 수 있고, 표를 보는 사람은 그게 사실인지 추정인지 알 수 없다.종료 주체를 남기면 위 네 구멍이 한 번에 닫힌다. 알림 기록이 빠졌든 배치가 안 돌았든 상관없어지기 때문이다.
참고
직접 종료 추정으로 두어 추측임을 드러내는 선까지만 처리했다.직접 생성 추정역시 "카드는 있는데 배치 기록이 없다" 를 보고 되짚는 값이다. 이번 범위에 함께 넣을지는 작업 착수할 때 정한다.