메신저·대화방·파일과 공지 확인
제품 개발 기록으로 · 알림 · 조직·권한 · 총무 공지 · 연차사용촉진
화면·SDK·API·저장 모델을 연결한 메신저 사용 설명입니다. 실행한 조작과 미확인 항목은 아래 검증 기록에서 구분합니다.
목적·진입·권한
동료와 개인·그룹 대화를 나누고, 팀 필수 대화방의 입장을 관리하며, 총무 공지와 공식 업무 안내를 읽는 기능입니다. 공지 확인, 메시지 읽음, 외부 전자서명 완료는 각각 다른 기록으로 저장됩니다.
| 진입 | 실제 조작 | 전제·결과 |
|---|---|---|
| 직원 앱 하단 메신저 | 탭을 누른 뒤 상단 대화 / 연락처 선택 | conversation:read가 없으면 하단 탭을 숨깁니다. 로그인 직후 배지 조회도 이 권한을 확인합니다 |
| 관리자·급여관리·총무·내부 결재·물품관리·팀장·경영 대시보드 | 오른쪽 아래 어두운 말풍선 버튼 클릭 | 공용 채팅 위젯이 열립니다. 다시 누르면 아래 화살표 버튼으로 접힙니다. 위젯 자체의 표시와 API 사용 권한은 별개입니다 |
| 푸시의 대화 알림 | 알림을 눌러 직원 앱 메신저 진입 | payload의 대화 ID를 현재 불러온 목록에서 찾아 엽니다. 목록에 없는 오래된 방으로의 직접 이동은 제한을 확인합니다 |
| 직원 앱 홈 공지 카드 | 공지 선택 | 메신저 공지 상세를 엽니다. 메신저 목록에 없으면 공지 목록을 한 번 다시 읽습니다 |
로그인한 조직의 활성 직원 연락처를 읽으며 자신은 선택 목록에서 제외합니다. 연락처 API는 직원 상세 조회 권한과 별개의 조직 공용 조회입니다. 대화 목록은 본인의 ACTIVE 멤버십과 leftAt이 없는 방을 대상으로 합니다. 직급 명칭이 곧 방장 권한은 아닙니다. 방장은 해당 대화방의 ConversationMember.role=owner인 사람입니다.
| 작업 | 서버 권한 및 추가 조건 |
|---|---|
| 대화·멤버 조회 | conversation:read, 해당 대화방 멤버 검사 |
| 개인·그룹 방 생성 | conversation:create; 개인 방은 본인 포함 정확히 2명 |
| 초대·이름 저장·퇴장 | conversation:update; 화면에서 선택한 방 및 멤버 조건 |
| 내보내기·방장 위임·해체·입장 승인 | conversation:update와 방장 확인; 필수 방·공식 안내에는 별도 제한 |
| 메시지·검색·실시간 구독 | message:read |
| 텍스트·파일 메시지 보내기 | message:create; 공식 안내 방은 전송 거부 |
| 읽음 기록 | message:update |
| 파일 업로드 / 다운로드 | storage:create / storage:read; 업로드 MIME 허용 목록, 다운로드 조직 경로 검사. 메시지 첨부({org}/messages/…)는 그 대화방의 현재 멤버만 올리고 받을 수 있습니다(옛 키는 첨부를 가진 메시지로 거슬러 확인) |
| 권한 미리보기(impersonation) 세션 | 위 권한과 무관하게 conversation.*·message.*(실시간 구독 포함)·메시지 첨부 URL·푸시 기기 등록을 전부 거절합니다. 화면(위젯·직원 앱)은 목록을 요청하지 않고 「권한 미리보기 중에는 메신저를 볼 수 없어요」 안내만 그리며, 직원 앱은 메신저 탭을 두지 않습니다 — 빈 목록이나 배지 0 도 「대화가 없다」는 정보라 보이지 않습니다 |
| 게시 공지 조회·확인 | generalAffairs:read; 게시 상태·조직 확인. 목록은 게시 대상 팀과 만료도 적용 |
이 표는 화면 사용 조건입니다. 보내기·검색·실시간 구독은 목록과 같은 기준(나간 멤버 leftAt 제외)으로 멤버를 검사하며, 승인 대기 상태의 차이는 유지보수 공백에 기록합니다. 불편 신고 캡처는 메신저 영역을 자동으로 가립니다(data-cs-mask). 권한 부여·팀 변경은 조직·권한, 직원 재직 상태는 인사 원장을 참고합니다.
지원 조작 목록
| 구간 | 제공 조작 | 저장하거나 보이는 결과 |
|---|---|---|
| 대화 목록 | 대화 검색, 방 열기, 공지 접기·더보기 | 현재 받은 방 목록 필터, 메시지·읽음 상태, 최대 50개 공지의 표시 범위 변경 |
| 연락처 | 이름·역할·팀 검색, 팀 접기, 전체 열기 / 전체 닫기, 개인 선택 → 연락처 프로필(1:1 채팅 · 공개 시 전화하기), 팀 단체 | 프로필 조회 후 개인 방 진입, 팀 연락처로 일반 그룹 생성·재사용; 접힌 팀 이름은 브라우저 로컬 저장 |
| 그룹 생성 | 그룹 대화, 직원 체크, 그룹 만들기, 그룹 이름, 취소 | 선택한 직원과 생성자가 참여하는 그룹 및 생성자의 방장 역할 |
| 대화 내용 | 여러 줄 입력, 보내기, PC의 Enter, 실패한 텍스트의 재전송, 이전 메시지 불러오기 | 메시지 행, 최근 미리보기, 상대 미확인 수; 과거 메시지 추가 조회 |
| 첨부 | 파일 첨부, 여러 파일 선택, 미리보기의 ×, 보내기, 이미지 확대·닫기, 파일명 클릭 | 저장소 파일과 메시지의 첨부 메타데이터; 이미지 미리보기 또는 다운로드 |
| 본문 검색 | 직원 앱 방 헤더 검색, 검색어, 검색, 결과 선택, 닫기 | 메시지 검색 결과와 원문 강조. 데스크톱 검색 입력 연결은 미완성 |
| 대화 설정 | 메뉴 아이콘, 그룹의 개인 표시명 저장, 초대하기, 멤버 내보내기 | 본인 전용 이름, 그룹 멤버 변경과 시스템 메시지 |
| 방장·퇴장 | 방장 위임, 대화방 나가기, 단톡방 해체, 확인·취소 | 역할 변경, 본인 퇴장 시각 또는 방 전체의 소프트 삭제 |
| 입장 승인 | 방장의 입장 승인 대기 → 승인 | 팀 신규 멤버의 PENDING → ACTIVE |
| 공지 | 제목, 첨부파일, 본문 끝까지 스크롤, 확인했어요 | NoticeAcknowledgment, 확인 시각, 미확인 배지 감소 |
| 공식 안내 | 제목·발신자·본문 조회, 서명하기 등 메시지에 지정된 버튼 | 연차사용촉진의 현재 서명 세션으로 이동. 일반 답장·파일 전송 없음 |
| 창·단계 이동 | 위젯 말풍선/아래 화살표, 뒤로, 설정·초대의 닫기, 이미지 배경·× | 창 접기 또는 한 단계 복귀. 방 삭제·메시지 삭제와 다릅니다 |
채널 구간은 서버에 채널 데이터가 있을 때 이름·최근 메시지·미확인 수를 표시하지만, 현재 행에 열기 핸들러가 없습니다. 이 화면에서 채널 생성·입장·메시지 보내기를 완료하는 절차는 확인되지 않았습니다. 메시지 수정·삭제·답글·반응·고정·개별 읽은 사람 목록·음성/영상 통화 버튼도 이 구현에는 없습니다.
목록과 연락처 사용
- 메신저 → 대화를 엽니다. 미확인 공지가 있을 때의 새로운 공지, 데이터가 있을 때의 채널, 메시지 구간이 나옵니다. 방에는 표시명·최근 메시지·시각·미확인 수가 표시됩니다.
- **대화 검색...**에 이름이나 내용을 입력합니다. 현재 내려받은 최대 50개 일반/필수/공식 방의 표시명, 멤버 성명, 마지막 메시지를 부분 검색합니다. 모든 과거 메시지를 찾는 입력은 아닙니다. 지우면 목록이 돌아옵니다.
- 방 행을 누릅니다. 최근 50개 메시지를 시간순으로 불러오고 아래쪽으로 이동하며, 화면의 미확인 수와 새 메시지 표시를 지웁니다. 이어
markRead가 자신의lastReadAt과unreadCount=0을 저장합니다. 읽음 요청 실패는 별도 오류를 띄우지 않아 다음 조회에서 수가 돌아올 수 있습니다. - 다른 사람을 찾으려면 연락처를 선택하고 **이름 또는 역할로 검색...**에 입력합니다. 실제 필터는 성명·역할·첫 팀·다른 소속 팀 이름까지 검사합니다. 검색 중에는 팀별 접기 대신 전체 일치 연락처를 표시합니다.
- 검색어가 없으면 팀 제목/화살표로 펼치거나 접습니다. 전체 열기 / 전체 닫기로 한 번에 바꿉니다. 소속이 없는 연락처는 미배정에 모입니다. 여러 팀에 속한 사람은 각 팀에 표시되며 선택 인원은 직원 ID로 중복 없이 계산합니다. 접힘 상태는
hereby:collapsedTeams에 저장하므로 같은 브라우저에서 재진입해도 유지될 수 있습니다.
필수 방은 읽음 여부와 관계없이 위에 놓입니다. 그 다음은 화면을 보고 있는 동안 새 메시지가 온 방, 미확인 메시지가 남은 방, 모두 읽은 방이며 같은 단계에서는 마지막 메시지 시각순입니다. 조회 API는 필수 방을 우선한 뒤 생성 시각으로 최대 50개를 가져오고 화면이 다시 정렬하므로, 전체 조직 대화를 최근 메시지순으로 모두 탐색하는 목록은 아닙니다.
연락처의 상태 점은 현재 로더가 모두 offline으로 넣습니다. 동료가 지금 접속했는지를 판정하는 실시간 재실 표시로 사용하지 않습니다. 연락처의 팀·역할 관계 응답도 실제 데이터로 재확인할 필요가 있습니다.

직원 앱 대화 목록의 하단 여백 비교입니다. 오른쪽 목록에서 필수 방·개인 방·하단 메신저 진입 위치를 찾을 수 있습니다. 조작 순서는 위 1~3번이며 메시지 발송·수신 결과를 보여 주는 이미지는 아닙니다.
개인·그룹·팀 대화 만들기
개인 대화
- 연락처에서 상대의 행을 누릅니다. 본인은 목록에 없습니다. 먼저 연락처 프로필이 열립니다 — 사진·이름과 소속(팀·역할)·직무·직군·직위·이메일 줄(빈 값은 줄째 생략, 서버
employee.contactProfile)이 보입니다. 병원이 조직 설정 메신저 연락처 공개에서 전화번호 공개를 켰고(settings.contactSharing.phone, 기본 꺼짐) 그 직원 번호가 있으면 전화번호 줄과 전화하기(tel:링크)가 함께 보입니다. 프로필을 불러오지 못해도 1:1 채팅은 쓸 수 있습니다. - 1:1 채팅을 누르면 화면은 먼저 현재 목록의 같은 상대 이름을 가진 개인 방을 찾고, 없으면
conversation.create(type=direct, memberIds=[상대])를 보냅니다. 서버는 본인을 더해 두 명을 확인하고 같은 두 사람의 기존 개인 방이 있으면 그 ID를 돌려줍니다. - 방이 열리면 내용을 입력하고 보내기를 누릅니다. 방 생성은 프로필의 1:1 채팅을 누른 시점이며 첫 메시지 발송을 기다리지 않습니다. 프로필만 보고 뒤로 가면 방을 만들지 않습니다. 뒤로 이동만 해도 이미 생성된 방을 삭제하지 않습니다.
기존 방을 선택한 흐름은 메시지를 다시 읽지만, 서버가 생성 요청에 기존 ID를 돌려주는 흐름은 화면을 빈 메시지 배열로 여는 코드가 있습니다. 내용이 없어 보이면 목록에서 해당 방을 다시 엽니다. 이름이 같은 직원은 이름 기준 재사용과 ID 기준 서버 재사용의 차이도 확인해야 합니다.
여러 사람의 그룹
- 그룹 대화를 누릅니다. 직원 앱은 헤더 오른쪽 새 대화 아이콘, 위젯은 탭 오른쪽의 그룹 대화 버튼입니다.
- 연락처 행 또는 체크박스로 본인을 제외한 두 명 이상을 선택합니다. 다시 누르면 해제됩니다. N명 선택이 바뀌고 두 명 미만이면 그룹 만들기가 비활성입니다.
- 그룹 만들기를 누른 뒤 그룹 이름을 입력하세요에 이름을 씁니다. 앞뒤 공백을 제거한 이름이 비어 있으면 생성 버튼은 비활성입니다. 별도의 제목 길이 제한은 이 화면과 생성 스키마에 없습니다.
- 그룹 만들기 또는 이름 입력 중 Enter를 누릅니다. 요청 중 **생성 중...**이며 중복 생성은 막습니다. 성공하면 그룹 선택을 끝내고 새 방으로 들어갑니다. 본인이 방장이 되고 선택한 직원은 일반 멤버로 저장됩니다.
- 이름 시트의 ×/배경 또는 뒤로는 이름 시트만 닫습니다. 선택 단계의 취소(위젯) 또는 헤더 뒤로(직원 앱)는 선택 모드를 종료합니다. 제출 실패는 오류 안내 후 이름과 선택을 유지해 다시 시도할 수 있습니다.
연락처 팀의 「단체」와 필수 방
- 연락처의 팀 제목 오른쪽 단체(도움말 팀 단체 메시지)를 누릅니다. 미배정에는 이 버튼이 없습니다.
- 현재 연락처에서 해당 팀에 속한 사람을 모아 팀 이름의 일반 그룹을 만듭니다. 이름이 유일한 팀은 같은 제목의 일반 그룹을 재사용하고, 동명 팀은 구성원 정보까지 대조해 방을 찾습니다. 구성원이 모두 바뀐 동명 팀은 새 방이 만들어질 수 있습니다. 새 방에는 본인도 추가됩니다.
- 이후 팀 인사가 바뀌어도 이 일반 그룹의 멤버를 자동 동기화하는 경로가 아닙니다. 필요한 사람은 초대로 추가합니다.
필수 표시 방은 조직의 팀장 지정/변경과 팀원 추가 훅이 관리합니다. ConversationType.TEAM은 호환 때문에 DB 값 department를 유지하며 실제 연결은 teamId입니다. 팀장 지정 시 방을 만들고 현재 활성 팀원과 팀장을 ACTIVE로 추가합니다. 팀장 변경 시 방장 역할을 다시 맞춥니다. 이후 팀원 추가는 PENDING 입장 요청과 방장 푸시를 만들며 입장 승인이 필요합니다. 팀 관리 성공과 방 생성·동기화 성공은 분리되어 있어 훅 실패로 채팅 반영만 지연될 수 있습니다.
나와의 대화
나와의 대화는 본인 하나만 있는 방입니다. 메모·파일·사진을 자기에게 보내 보관하고, 검색으로 다시 찾습니다. 들어가는 길은 두 가지입니다. 직원 앱 상단 프로필 아바타를 눌러 뜨는 내 프로필 시트의 「나에게 채팅」, 그리고 연락처 검색에서 내 이름을 찾아 누르기(「나」 표시)입니다. 연락처 목록에 별도의 내 프로필 줄은 두지 않습니다(상단 아바타가 그 자리입니다). 내 프로필 화면의 채팅 버튼은 「나에게 채팅」이 됩니다. 처음 누를 때 방이 만들어지며(직원당 하나), 대화 목록에서는 다른 방과 같이 마지막 메시지 순으로 놓입니다(상단 고정 없음). 알림은 가지 않고 나가기·초대·위임이 없습니다. 웹 관리자 채팅과 직원 앱이 같은 방을 봅니다.
직원 앱 상단 아바타의 내 프로필 시트에는 「나에게 채팅」 외에 「프로필 사진 변경」(더보기의 사진 고르기·자르기 흐름)과 「내 정보」가 있습니다. 더보기 탭은 하단 내비로 갑니다.
메시지·파일 보내기와 실패 후 확인
텍스트와 재전송
- 일반 대화방 아래 입력칸에 입력합니다. 입력칸은 여러 줄(textarea)이라 줄이 넘치면 위로 자라고 5줄(화면 설정 「크게」는 4줄)에서 멈춥니다. 앞뒤 공백을 제거한 내용이 비면 보내기는 비활성이고 전송 함수도 중단합니다. 직원 앱의 캡슐형 입력줄에서는 비활성인 보내기 버튼이 아예 숨고(첨부만 있어도 보낼 수 있으면 보임), 첨부는 왼쪽 **+**입니다. 텍스트 API의 본문 길이는 1–5,000자입니다.
- 보내기를 누릅니다. PC와 직원 앱 모두 Enter가 보내기, Shift+Enter가 줄바꿈입니다(
messenger-helpers.ts의shouldSendOnEnter). 한글 조합을 끝내는 Enter는 전송하지 않습니다. - 입력은 비워지고 내 말풍선에 **전송 중...**이 붙습니다. 서버는 메시지와 방의 마지막 메시지/시각을 저장하고 다른 멤버의 미확인 수를 증가시킨 뒤 실시간 이벤트·푸시를 요청합니다. 성공하면 전송 중 표시가 사라집니다. 이는 상대의 열람 완료 표시가 아닙니다.
- 실패하면
!와 재전송이 나타납니다. 내용을 확인하고 재전송을 누르면 같은 본문을 다시 요청합니다. 실패 상태는 이 화면의 임시 상태이므로 새로고침 후에는 서버에 저장된 메시지를 먼저 확인합니다. 일반 메시지에는 요청별 중복 방지 키가 없어 응답 유실 뒤 무조건 재전송하면 중복될 가능성이 있습니다.
첨부·미리보기·다운로드
- 파일 첨부(클립)를 누르고 여러 파일을 선택합니다. 파일 선택 창 취소는 첨부를 추가하지 않습니다. 개별 파일이 10 MiB 초과면 해당 파일의 용량 안내를 띄우고 건너뛰며 나머지는 추가합니다. UI에 파일 개수 제한·확장자 선택 필터는 없습니다.
- 이미지에는 작은 미리보기, 나머지에는 파일 아이콘과 이름이 나옵니다. 잘못 고른 파일은 각 미리보기의 **×**를 눌러 제외합니다. 선택 목록은 서버 업로드 전의 로컬 상태입니다.
- 필요하면 본문을 입력한 뒤 보내기를 누릅니다. 첨부가 있으면 Enter도 파일 전송으로 동작하며 전송 중 버튼을 막습니다. 모든 파일이 이미지 MIME이면 이미지 메시지, 하나라도 다르면 파일 메시지입니다. 본문이 비면 원본 파일명들을 본문으로 사용합니다.
- 저장소 업로드 URL을 받아 파일을 먼저 PUT한 후,
sendWithAttachments가 파일명·MIME·크기·저장 경로를 메시지의 JSON 첨부에 기록합니다. 파일 저장과 메시지 저장은 하나의 트랜잭션이 아닙니다. - 받은 이미지의 축소판을 누르면 확대합니다. 이미지 바깥이나 ×로 닫습니다. 일반 파일의 이름/다운로드 아이콘, 공지의 첨부파일 행은 원래 파일명으로 다운로드를 시도하며 브라우저 동작에 따라 새 탭으로 열릴 수 있습니다.
업로드 API는 JPEG·PNG·GIF·WebP·SVG, PDF, Word·Excel·PowerPoint, 허용된 HWP/HWPX MIME, TXT·CSV·ZIP MIME을 받습니다. 확장자가 같아도 브라우저가 MIME을 비우거나 허용되지 않은 값으로 주면 실패할 수 있습니다. 메신저는 업로드 호출에서 빈 MIME을 보정하지 않으므로, 메타데이터에 뒤늦게 넣는 application/octet-stream이 업로드 허용을 보장하지 않습니다. 파일명은 업로드 스키마에서 1–255자입니다.
파일 실패 복구는 텍스트와 다릅니다. 업로드 단계에서 실패하면 선택 파일이 남아 다시 시도할 수 있습니다. 업로드 후 메시지 저장 단계에서는 이미 선택 파일·본문을 비우고 임시 말풍선을 추가한 다음 실패할 수 있으며, 이 말풍선에는 텍스트의 재전송 상태가 없습니다. 방을 다시 열어 실제 저장 여부를 확인하고 없으면 파일을 다시 선택합니다. 이미 올라간 파일의 자동 정리나 파일 메시지 재전송 완료는 이번 범위에서 확인하지 않았습니다.
이 첨부는 팀 드라이브의 문서 생성·공유가 아닙니다. 다운로드는 공용 저장소 URL을 쓰며 드라이브 경로는 별도 API로 제한됩니다.
메시지 메뉴와 대화방 알림
| 조작 | 대상·시작 위치 | 입력·결과 | 취소·예외 |
|---|---|---|---|
| 답글 | 일반 메시지의 메뉴 → 답글 | 입력줄의 원문을 확인한 뒤 내용을 전송. 답글의 원문 인용을 누르면 원래 메시지로 이동 | 입력줄의 답글 취소는 연결만 제거. 이미 전송한 답글을 회수하지 않음 |
| 내 메시지 삭제 | 내가 보낸 메시지 메뉴 → 삭제 | 구현은 확인 대화상자 뒤 삭제를 요청하고 「삭제된 메시지입니다」로 표시 | 시스템·공식 업무 메시지, 전송 중·실패 상태는 대상 아님. 복원 UI 없음. 아래 실행 차이 참조 |
| 그룹·팀 대화 알림 | 대화 설정 → 알림 끄기/켜기 | 즉시 저장. 목록·안 읽은 수는 유지. 멘션·내 메시지 답글은 일반 방 음소거의 예외 | 개인·나와의 대화 제외. 전체 푸시/종류/방해 금지와 함께 판정 |
로컬 실행 차이: 이번 예제 환경에서는 삭제 메뉴를 누른 뒤 확인창 없이 삭제 표시로 바뀌었습니다. Messenger.ts는 askConfirm을 호출하지만 dialog.ts는 호스트가 없으면 true로 통과합니다. 실행 환경의 등록·번들 경로를 추가로 확인해야 하며 원인을 이 분기로 확정하지 않았습니다. 삭제 영상은 검수 완료 목록에서 제외했습니다. 입력·줄바꿈·전송과 그룹 알림 토글은 별도 실제 영상으로 확인했습니다.
조직에서 대화 잠금을 켠 경우의 기기 연결·첨부 복호화는 별도 조건입니다. 기기 연결 번호는 인증 자료이므로 영상·썸네일·전달 ZIP에 담지 않습니다. #1096의 설계 문서와 #1100의 저장 구조 추가만으로 실기기 대화 복구가 검증되었다고 판단하지 않습니다. #1121의 운영자 암호화 활성화는 한 번 켜면 끌 수 없는 설정이며 이번 예제 조직에서는 실행하지 않았습니다.
과거 메시지·본문 검색
- 대화방 상단의 검색을 누르고 메시지 검색어를 입력합니다. 직원 앱은 결과 목록으로 화면을 바꾸지 않고 대화 안에서 해당 메시지로 이동합니다.
- 하단 검색 줄의 이전 결과 / 다음 결과 버튼으로 일치 메시지를 하나씩 확인합니다. 내가 보낸 메시지만을 켜면 본인 메시지로 좁힙니다.
- 검색어를 지우거나 검색을 닫으면 대화 입력으로 돌아갑니다. 검색은 원문을 수정하지 않습니다. 결과가 없거나 불러오지 못했을 때에는 연결을 확인하고 다시 시도합니다.
- 평소 대화에서 이전 내용을 읽으려면 위로 스크롤합니다. 다시 접속하거나 앱을 앞으로 가져오면 누락 내용을 재조회하지만, 다른 기기·망 전환·여러 API 실행 환경을 포함한 전달 보장은 이번 로컬 촬영으로 확인하지 않았습니다.
근거: #1120·#1124, Messenger.ts, messenger-content.html, 직원 앱의 헤더 검색 연결. 검색·재접속은 코드 대조 범위이며 이번 영상은 입력과 방 알림 설정을 다룹니다.
멤버·입장 승인·개인 표시명
- 대화방 헤더의 메뉴 아이콘 대화 설정을 누릅니다. 직원 앱에서는 대화 위의 상세 페이지, 위젯에서는 오른쪽 드로어가 열립니다. 방장 배지, 현재 멤버, 권한에 따른 버튼을 확인합니다. 열기 실패는 오류 안내를 표시합니다.
- 일반 그룹의 **대화방 이름 (나에게만 보임)**을 바꾸고 저장을 누르면 본인 멤버십의
customName을 저장합니다. 앞뒤 공백을 제거하고 최대 50자이며 다른 멤버의 이름은 바뀌지 않습니다. 공백 저장은 해제용null을 보내지만 서버의undefined저장과 화면 갱신 때문에 원래 이름 복구는 검증 공백입니다. - 초대하기를 누릅니다. **이름으로 검색...**에 입력하고 행/체크박스로 사람을 고릅니다. 실제 필터는 이름·역할·팀도 검사합니다. 현재 활성 멤버는 제외하고, 한 명 이상 선택하면 **멤버 초대 (N)**가 활성화됩니다.
- **멤버 초대 (N)**를 누릅니다. 요청 중 **초대 중...**이며 성공하면 초대·설정을 닫고 목록과 메시지를 다시 읽습니다. 새로 초대한 이름이 시스템 메시지로 남습니다. 실패하면 오류 안내와 선택을 유지합니다. 제출 전 ×/배경(위젯) 또는 뒤로(직원 앱)는 저장 없이 초대 화면만 닫습니다.
- 개인 방에 사람을 초대하면 같은 방 ID를 유지한 채 일반 그룹으로 바뀝니다. 제목이 없으면 기존 멤버 이름으로 만들고 초대한 사람을 방장으로 설정합니다. 별도의 새 개인 방을 만드는 동작이 아닙니다.
- 방장은 멤버 오른쪽 내보내기를 눌러 대상 이름의 확인창에서 확인합니다. 취소는 저장하지 않습니다. 성공하면 대상의
leftAt과 내보내기 시스템 메시지가 저장되고 현재 멤버 목록에서 빠집니다. 자기 자신에게는 내보내기 버튼이 없습니다. - 방장에게 입장 승인 대기가 보이면 대상의 승인을 누르고 이름을 확인합니다. 서버는 방장·대기 상태를 확인하고
ACTIVE로 바꾼 뒤 입장 시스템 메시지를 남깁니다. 이미 처리된 요청은 오류이며 설정을 다시 열어 최신 상태를 확인합니다. 거절·가입 신청 작성 버튼은 현재 화면에 없습니다. 신규 팀원의 대기는 조직 관리의 팀원 추가가 만듭니다.
일반 초대 API는 신규 멤버를 기본 ACTIVE로 생성합니다. 팀 관리가 만든 승인 대기와 대화 설정의 직접 초대를 같은 승인 절차로 설명하면 안 됩니다. 이미 대기 중인 사람은 초대 후보에 남을 수 있지만 API가 기존 멤버를 건너뛰므로 승인으로 처리해야 합니다.
방장 위임·나가기·해체
| 상태 | 화면의 선택 | 저장 결과·제한 |
|---|---|---|
| 개인 방 멤버 | 대화방 나가기 → 확인 | 본인의 퇴장 시각과 시스템 메시지. 다른 사람의 방과 메시지는 유지. 나간 뒤 연락처에서 같은 사람을 다시 열면 같은 방에 다시 들어가며(퇴장 기록 해제, 안 읽은 수 0), 이미 나간 방에서 다시 나가기를 눌러도 오류 없이 목록에서만 빠집니다(2026-10, MED-908) |
| 나와의 대화 | 나가기 없음 | 멤버가 본인 하나뿐인 메모·파일 보관 방은 나가기·해체·초대·위임이 모두 막힙니다(2026-10, MED-903) |
| 일반 그룹의 일반 멤버 | 대화방 나가기 → 확인 | 본인이 목록에서 빠지고 대화 목록으로 복귀 |
| 일반 그룹 방장 | 방장 위임 또는 단톡방 해체 | 위임 후 일반 멤버로 나갈 수 있습니다. 위임 없는 단순 퇴장은 API가 차단 |
| 필수 방 방장 | 방장 위임, 대화방 나가기 | 나가기를 누르면 위임 안내만 보여 주고 설정에 머뭅니다. 자동으로 위임 선택창을 열지 않습니다 |
| 필수 방 일반 멤버 | 나가기·위임 버튼 없음 | 부서 필수 단톡방은 나갈 수 없습니다. 안내 |
| 공식 안내 방 | 공유 본문의 대화 설정·답장 없음 | 서버도 멤버 조작·퇴장·해체를 거부 |
- 일반 그룹이나 필수 방의 방장이 방장 위임을 누릅니다. 방장 이외의 활성 멤버를 표시합니다. 대상이 없으면 **위임할 수 있는 멤버가 없습니다.**입니다.
- 멤버를 누르고 대상 이름의 확인창에서 확인합니다. 본인은 일반 멤버, 대상은 방장으로 저장되고 시스템 메시지와 새 멤버 목록을 읽습니다. 취소/뒤로는 역할을 바꾸지 않습니다. 실패하면 기존 화면에서 다시 시도하거나 설정을 재진입합니다.
- 일반 그룹을 유지하고 자신만 나가려면 위임 성공 후 대화방 나가기를 누릅니다. 나간 후에는 이전 대화 내용을 볼 수 없습니다. 안내에 확인하면 대화 목록으로 돌아갑니다. 이 안내는 정상 목록/조회 경로의 동작이며 모든 API의 접근 차단을 검증한 문구는 아닙니다.
- 방을 없애려면 그룹 방장의 단톡방 해체를 누릅니다. 방장이 나가면 단톡방이 사라집니다 아래 확인을 누르면 방의
deletedAt과 모든 활성 멤버의leftAt이 기록됩니다. 모든 참여자의 정상 목록에서 사라지며 대화·메시지 행을 물리 삭제하지 않습니다. 취소 또는 배경 클릭은 설정으로 돌아갑니다.
필수 방은 위임 후에도 나갈 수 있다고 안내하지 않습니다. 과거 정책/주석은 위임 후 퇴장을 말하지만 현재 화면은 일반 멤버의 나가기 버튼을 숨기고 API도 필수 방의 일반 멤버 퇴장을 거부합니다. 필수 방 해체도 불가합니다. 또한 다음 팀장 변경 동기화가 방장을 팀장으로 다시 맞출 수 있어 대화방 위임을 조직의 팀장 변경과 동일하게 취급하지 않습니다.
퇴장한 사람을 다시 초대하는 코드가 있지만 leftAt을 undefined로 저장하는 경로가 있어 실제 DB의 NULL 복원은 확인하지 않았습니다. 정상 복귀가 보장된 절차로 쓰지 않으며, 재초대 후 본인의 목록·멤버·메시지를 다시 조회해야 합니다.
공지 읽기·확인과 공식 업무 안내
- 대화 → 새로운 공지에서 제목을 누릅니다. 이 구간에는 받은 최대 50개 중 아직 확인하지 않은 공지와 열어 보지 않은 정보 게시글만 나오고(
messengerListNotices), 확인하고 돌아오면 그 줄이 빠지며 남은 것이 없으면 구간 전체가 사라집니다. 기본 3개이며 더보기 / 더보기 닫기로 펼칩니다(접힌 상태에서 미확인이 있으면 「확인하지 않은 N개의 공지가 있습니다.」). 제목 옆 화살표는 구간을 접거나 펼칩니다. 이미 본 공지는 직원 앱 홈 「새로운 소식」의 더 보기(소식 전체)나 더보기 → 공지에서 다시 봅니다. 표시 토글만으로 확인 처리하지 않습니다. - 상세에서 제목, 본문, 중요도(참고·일반·중요·긴급), 분류, 게시 시각을 읽습니다. 목록에는 게시 중이고 만료되지 않았으며 전사 대상이거나 자신의 활성 소속 팀과 대상 팀이 겹치는 공지만 나옵니다.
- 첨부가 있으면 첨부파일의 파일명을 눌러 내려받습니다. 공지 본문은 텍스트로 표시하며 공지의 게시·수정·대상·만료 관리는 총무 공지에서 합니다.
- 확인 의무가 있는 공지는 본문 끝까지 스크롤해야 하단 확인했어요가 활성화됩니다. 한 화면에 다 보이는 짧은 공지는 열린 직후 높이를 재서 활성화합니다. 단순히 상세를 열었다고 확인되지는 않습니다.
- 확인했어요를 누르면 본인의 공지 확인 행과 시각을 저장하고 확인 완료로 바꾸며 미확인 배지를 줄입니다. 직원 홈에도 확인 이벤트를 전달합니다. 이미 확인한 공지는 확인 완료와 시각을 표시합니다. 사용자가 확인을 취소하는 버튼은 없습니다.
requiresAcknowledgment=false인 정보 게시글은 확인 버튼 대신 확인이 필요 없는 정보 게시글이에요를 표시하고 미확인 공지 수에서 제외합니다. 저장 실패는 현재 핸들러가 별도 오류를 표시하지 않으므로 완료 표시가 없으면 다시 시도하고 재진입해 확인합니다.
일반 메시지는 대화방을 열면 읽음 수를 지우지만 공지는 명시적 확인했어요가 필요합니다. 알림 목록의 읽음, 공지 확인, 관리자 측 확인 집계/대리 확인 또한 별도입니다. 공지 확인 API는 스크롤 여부를 저장하지 않으며, 끝까지 읽기 조건은 화면의 버튼 활성 조건입니다.
공식 안내 방에는 발송 시점의 제목과 발신자 이름·이메일을 보존한 업무 메시지가 나타납니다. 준비 중인 업무 메시지는 목록/검색에 노출하지 않고 게시 상태만 읽습니다. 연차사용촉진 메시지의 서명하기(또는 메시지에 지정된 라벨)를 누르면 promotionId와 signAttemptId로 현재 유효한 서명 세션을 요청한 뒤 해당 URL로 이동합니다. 정보가 빠지면 서명 요청 정보를 찾을 수 없어요., 유효한 요청이 아니면 **현재 서명할 수 있는 요청이 아니에요.**를 안내합니다. 화면을 읽은 것만으로 서명이 완료되지 않으며 이후 상태는 연차사용촉진에서 추적합니다.
공유 위젯은 공식 방의 검색·설정 버튼과 입력줄을 숨깁니다. 직원 앱 헤더는 대화 종류를 받지 않고 일반 방의 검색·설정 액션을 그리는 구조여서 공식 방에도 버튼이 보일 가능성이 있으며, 멤버 API는 이를 거부합니다. 실제 직원 앱 노출 상태는 새 런타임 검증이 필요합니다.
닫기·재진입·실시간 배지
- 직원 앱의 뒤로는 초대/방장 위임, 대화 설정, 대화 순으로 한 단계씩 닫습니다. 공지 상세에서 뒤로는 대화 목록으로 돌아갑니다. 왼쪽 가장자리에서 오른쪽으로 미는 제스처도 대화·공지 상세의 뒤로를 호출합니다. 그룹 선택 화면은 헤더 뒤로로 취소합니다.
- 대화에서 목록으로 나가면 메시지 구독과 화면의 메시지 배열을 비웁니다. 입력 중 본문과 선택 첨부는 이
goBack에서 비우지 않습니다. 다른 방에 들어가 전송하기 전에 받는 사람과 남은 입력을 다시 확인합니다. 새로고침 뒤에도 임시 작성물이 복구되는 서버 초안 기능은 없습니다. - 위젯을 접는 동작은
isOpen=false이며 방·본문을 지우지 않습니다. 같은 페이지에서 다시 열면 기존 상태를 유지할 수 있습니다. Escape는 공용 최상단 레이어 판정을 따르므로 위에 모달이 있으면 모달이 우선합니다. - 떠 있는 AI 패널과 채팅 위젯은 한쪽을 열 때 다른 쪽이 접힙니다. AI가 본문 옆 도크인 경우에는 함께 사용할 수 있습니다. AI 어시스턴트의 도크 배치와 연결됩니다.
- 직원 앱 하단 메신저 배지는 대화 미확인 수입니다. 초기에는 최대 200개 방에서 합산하고 대화 화면 로딩은 최대 50개 방에서 다시 합산합니다. 데스크톱 닫힌 말풍선 배지는 대화·채널·미확인 공지 합계이며 99 초과는 +99입니다. 같은 배지 정의로 비교하면 안 됩니다.
- 닫힌 위젯은 로그인 상태에서 60초마다 대화 목록과 공지 수를 조회합니다. 열린 위젯은 이 폴링을 생략하며 메시지 구독을 사용합니다. 직원 앱에는 연결 중... / 연결 끊김 — 재시도 중 표시와 재연결 경로가 있습니다. 푸시는 전송 요청이 성공해도 기기 등록·브라우저/OS 권한·외부 전송 결과에 따라 도착이 달라집니다.
- 방을 읽으면 서버가 같은 사용자의 다른 기기에 읽음 동기화 이벤트를 보냅니다. 새 메시지는 대화 미리보기와 미확인 수를 갱신하며 웹 알림은 알림 권한이 허용된 경우에만 생성합니다. 새 방 생성 직후·장시간 단절·여러 창에서의 수신 및 중복 집계는 이번 작업에서 검증하지 않았습니다.
- 공유 컴포넌트에
refresh함수와 당겨서 새로고침 자리 표시는 있지만initPullToRefresh는 빈 함수이고 직원 앱 등록도 직접 이 컴포넌트를 씁니다. 메신저를 아래로 당기면 새로고침된다는 사용 절차는 현행 코드에서 확인되지 않았습니다. 조회 실패 뒤 확실한 재진입은 페이지를 새로 불러오는 경로이며 임시 작성 상태가 사라질 수 있습니다.
화면·API·데이터 관계
| 책임 | 고정 기준 소스 |
|---|---|
| 전체 조작·상태·오류·검색·공지 | Messenger.ts, messenger-content.html, 표시명 매핑 |
| 직원 앱 진입·권한·헤더·배지 | nav-config.ts, app.ts, app-shell.html, main.ts, messenger-store.ts |
| 데스크톱 위젯·닫기·배지 | ChatWidget.ts, chat-widget.html |
| SDK와 대화 스키마 | ConversationService.ts, MessageService.ts, conversation.schema.ts, message.schema.ts |
| 대화 생성·초대·역할·퇴장 | conversation.router.ts, team-conversation.service.ts, team.router.ts |
| 본문 조회·저장·읽음·구독·푸시 | message.router.ts |
| 연락처 | EmployeeService.ts, employee.router.ts |
| 첨부 저장·다운로드 | StorageService.ts, storage.router.ts, storage.service.ts |
| 공지 조회·확인 | GeneralAffairsService.ts, general-affairs.router.ts |
| 저장 모델 | conversation.entity.ts, conversation-member.entity.ts, message.entity.ts, communication.enum.ts |
기존 문서와의 대조·검증 공백
| 기존 설명 | 기준 코드에서의 해석 |
|---|---|
| 메신저 정책: 부서 통합 후 재작성 필요 | 실제 방은 teamId로 연결되며 팀장 변경 때도 방장을 동기화합니다. 생성 시에만 연동된다는 옛 설명은 대체합니다 |
| 같은 정책: 첫 메시지 후 개인 방 생성, 개인 방에는 방장 개념 없음 | 연락처 클릭으로 생성 API를 부르며 생성자에게 DB 방장 역할을 줍니다. 개인 방 설정에서도 방장 배지·내보내기 조건이 작동할 수 있습니다 |
| 같은 정책: 필수 방장은 위임 후 퇴장 가능 | 현재 화면/API는 위임 후 일반 멤버가 된 사람도 필수 방에서 나갈 수 없게 합니다 |
| 같은 정책: 최근 메시지순 목록 | 필수 방 우선에 새 수신/미확인 단계 정렬이 추가되며 최초 조회 50개 한계가 있습니다 |
| 연차사용촉진 | 공식 방의 발신자 스냅샷·게시 상태·서명 액션과 연결됩니다. 과거 테스트 설명을 이번 Sign 실행 증거로 재사용하지 않습니다 |
| 알림 클릭 이동 | 알림 읽음과 대화/업무 목적지 이동을 분리합니다. 직원 앱 푸시의 방 ID 이동은 실제 목록 한계까지 함께 설명합니다 |
| 공제 반영 확인 문서의 메신저 권한 절 | 권한 없을 때 메신저 탭을 숨기는 동작은 nav-config.ts와 대조했습니다. 해당 이미지로 모든 역할의 사용 결과를 검증한 것은 아닙니다 |
| AI 도크·신고 버튼 | 채팅과 떠 있는 AI의 상호 접기·Escape 우선순위에 적용됩니다. 겹침 크기·브라우저 수치는 해당 측정 환경의 참고값입니다 |
| 대화 표면 부품화 | 말풍선·입력줄·패널의 정본은 공용 DS입니다. 옛 사각형 전송 버튼·파셜 색 사본을 현행 외형으로 사용하지 않습니다 |
| 닫기·스크롤 여백 | 위 과거 이미지는 직원 앱 대화 목록 하단 여백을 설명합니다. 위젯·채팅 입력줄에 같은 여백을 일괄 적용한다는 설명은 아닙니다 |
현재 코드에서 확인했으나 운영 결과를 추가로 확인해야 하는 항목은 다음과 같습니다.
- 완결되지 않은 조작: 데스크톱 본문 검색 입력, 채널 열기, 메신저 당겨서 새로고침. 화면/주석이 있다는 이유로 지원 완료로 분류하지 않았습니다.
- 상태·데이터 차이: 개인 방 재사용의 이름 비교와 빈 메시지 초기화, 개인 방에서 그룹 전환 시 기존 방장 역할 정리, 새 방 생성 직후 실시간 구독, 멤버 재초대와 개인 이름 지우기의 NULL 저장 결과, 연락처 응답의 팀·역할 관계 복원, 대기자가 포함될 수 있는 대화 인원 수를 실제 DB와 화면으로 대조해야 합니다.
- 접근 조건 차이: 대화 목록은 활성/미퇴장 멤버를 제한하고 메시지 목록은
leftAt을 검사하지만, 메시지 보내기·검색·구독은 같은 상태 필터를 모두 적용하지 않습니다. 여러 대화 관리 API의 조직 조건도 일관되지 않습니다. 따라서 퇴장·추방·승인 대기·타 조직 요청에 대한 접근 차단을 이 문서의 검증 완료 항목으로 두지 않습니다. - 조회·배지 차이: 대화 목록 50개, 직원 배지 초기 합산 200개, 공지 목록 50개, 공지 수 전용 API가 서로 다른 범위를 읽습니다. 검색·푸시 목적지가 그 목록 밖일 때의 복구와 다중 구독에 의한 미확인 중복 증가도 런타임 증거가 필요합니다.
- 전송·확인 공백: 텍스트 응답 유실 후 중복 재전송, 파일 일부 업로드/후속 저장 실패, 빈 MIME, 다른 기기 읽음 동기화, 공지 확인 저장 실패, 공식 안내 헤더와 실제 Sign 복귀를 새 실행으로 확인하지 않았습니다.
이번 문서는 위 동작을 소스에서 추적하고 상대 문서·고정 소스 경로·ASCII 앵커를 검사하는 범위입니다. 동작별 새 캡처/짧은 녹화가 없는 구간은 개인·그룹 생성, 초대·승인·위임·해체, 파일 실패·재시도, 검색 점프, 공지 확인, 공식 서명 이동입니다. 제품 동작을 바꾸지는 않았으며 빌드·서비스 실행 결과는 기능 마스터의 전체 검증 기록과 구분합니다.
팀·검색 결과 전체 선택
직원 메신저 가이드에 개인 대화, 그룹 생성, 기존 방 초대의 차이와 선택·취소·결과를 정리했습니다. 관리자 웹의 공용 채팅 패널도 같은 선택 규칙을 씁니다.
| 조작 | 대상·결과 |
|---|---|
| 일반 연락처의 이름 선택 | 개인 대화를 엽니다. 팀 체크박스는 그룹 선택 모드에서만 나타납니다. |
| 팀 체크박스 | 현재 표시된 해당 팀 인원입니다. 일부 선택에서 누르면 전체 선택, 전원 선택에서 누르면 해제합니다. |
| 전체 선택 | 현재 후보 전체이며 검색 중에는 검색 결과만입니다. 다른 팀에서 고른 사람을 무조건 지우는 기능은 아닙니다. |
| 겸직자 선택 | 여러 팀에 보이더라도 동일 직원을 한 번만 선택합니다. |
| 초대하기 | 이미 참여한 사람을 제외합니다. 개인 방에 초대하면 그룹으로 바뀝니다. |
PR #792의 employee.contacts는 관계 기본 키와 팀 ID·이름을 전달하고, messenger-helpers.ts의 groupContactsByTeam, selectionState, toggleSelection이 팀 묶기와 선택을 처리합니다. 이름만을 팀 식별자로 쓰거나 첫 소속만 표시하는 설명을 제거했습니다. 실제 생성·초대는 다른 사용자에게 영향을 주므로 이번 문서 검토에서는 실행하지 않았습니다. 새 영상도 대기 중입니다.
웹 브라우저의 미읽음 표시
PR #767은 새 메시지의 브라우저 탭 제목·아이콘 표시와 채팅 버튼 움직임을 추가합니다. 웹의 표시와 직원 앱 하단 미읽음 배지, 운영체제 푸시 알림은 서로 다른 경로입니다. 알림 표시를 보는 것만으로 메시지를 읽음 처리하거나 방에 답장을 보내지 않습니다. 실제 다른 예제 계정의 전송·수신·읽음 전후 영상은 아직 없습니다.
대화 잠금과 기기 복구
대화 잠금은 조직에서 활성화했을 때 나타납니다. 직원 가이드에 처음 설정·다른 기기 연결·취소 절차를 덧붙였습니다. 2026-10-15 부터 복구 코드는 없고(사용자가 복구 수단을 직접 보관하지 않음), 상대 키가 바뀌어도 안전 번호 확인 없이 자동으로 받아들입니다. 조직 설정은 운영자 전용이며 한 번 켜면 끌 수 없습니다. 기기 연결 코드는 인증 자료이므로 촬영 대상에서 제외합니다.
이 주의 병합에는 설계·저장 구조뿐 아니라 키 설정·기기 연결(#1101/#1102), 대화 키 갱신(#1103), 본문·첨부 암호화(#1104/#1106), 기기 내 검색·알림 표시 선택(#1105), 신뢰 확인(#1112), 웹·네이티브 알림(#1113/#1114) 구현도 포함됩니다. #1134는 설정창 설명 잘림, #1135는 설정 완료 시 브라우저 저장 실패를 수정했습니다. 복구 요청·감사 이력(#1108)과 평문 대화 전환·조직 삭제 후 보관 정리(#1107)도 별도 운영 경로입니다.
대화방 음소거 영상은 대화 잠금을 켜지 않은 예제 조직에서 촬영했습니다. 위 암호화 기능의 실제 두 기기 연결·검색·첨부 복원·푸시 수신·운영 복구를 확인한 증거로 사용하지 않습니다. 원본은 packages/components/html/messenger-content.html, packages/components/src/components/Messenger.ts, packages/sdk/src/chat-crypto/를 함께 확인합니다. 남은 검증은 이번 주 원장에 유지합니다.
연락처·읽음 상태와 기기 연결 보완
연락처는 팀 조건을 선택하고 팀을 펼쳐 직원을 고릅니다. 검색 글자를 비우면 검색 화면과 팀 목록 상태를 확인하며 최근 대화·나와의 대화는 연락처 전체 목록과 구분합니다. 그룹 메시지의 주황색 안 읽은 사람 수를 누르면 읽은 사람 / 안 읽은 사람 목록에서 참여자를 확인하고 닫습니다. 1:1의 읽음은 본인이 보낸 메시지를 상대가 대화방에서 읽은 경우에 표시합니다. 읽음 확인은 업무 승인이나 공지 확인을 대신하지 않습니다. 직원 메신저 가이드에 연결합니다.
잠금 조직은 새 기기 요청을 어느 화면에서든 기존 기기로 확인할 수 있습니다. 기기 정보와 요청을 확인하고 승인·거절하며 확인창을 표시할 수 없으면 승인을 진행하지 않습니다. 운영자 복구 요청은 대화방 선택과 범위 미리보기를 확인한 뒤 진행합니다. 기기 키가 없으면 대화 헤더 아래의 안내에서 연결을 진행하며 대화 목록이 보인다는 이유만으로 본문 복호화가 완료된 것으로 보지 않습니다.
주말에는 새 참여자 키 전달, 뒤늦은 기기의 이전 대화 키, 추방·재입장 인원 수, 잠긴 대화의 미리보기·실시간 수신, 목록 재조회 실패 시 기존 목록 유지가 함께 바뀌었습니다. 연락처·읽음 UI와 이 복구 경로는 별도입니다. 개인정보 없는 두 기기와 잠금 조직으로 키 가져오기·첨부·검색·재접속까지 재검증해야 하며 이번 일반 웹 촬영으로 통과 처리하지 않습니다.
관련 PR: #1139, #1140, #1151, #1152, #1169, #1175. 전체 포함 목록은 주말 보강 기록에서 확인합니다.
대화 목록의 메뉴와 최종 키 설정 절차
PC에서는 대화 줄을 오른쪽 클릭하고 휴대폰에서는 길게 눌러 메뉴를 엽니다. 대화 종류에 따라 읽음 처리·알림 끄기/켜기·나가기 등이 표시됩니다. 알림을 꺼도 대화 내용은 남고 다시 켤 수 있습니다. 개인 대화도 알림을 끌 수 있으며 나와의 대화는 이 메뉴의 대상이 아닙니다. 나가기는 알림 끄기와 다른 작업이므로 확인 안내를 읽고 선택합니다.
PC 입력창은 Enter로 전송하고 Shift+Enter로 줄을 바꿉니다. 휴대폰 Enter는 줄바꿈이며 전송 버튼으로 보냅니다. 목록 미리보기는 본문 글자를 표시하고, 상대 프로필 사진이나 이름에서는 사용할 수 있는 연락처 메뉴를 엽니다. 읽음·푸시 알림·다른 기기의 표시 시점은 서로 구분해 확인합니다.
대화 잠금의 첫 설정은 키 만들기입니다. 새 기기는 기존 기기 연결 승인 또는 새로 시작을 사용합니다. 복구 코드를 입력하거나 안전번호를 확인하는 이전 절차는 PR #1248에서 제거됐으므로 더 이상 안내하지 않습니다. 새로 시작할 때는 기존 대화에 미치는 영향을 안내문에서 확인하고, 취소하면 시작하지 않습니다. 로그인용 패스키나 2단계 인증 복구 코드를 대화 복구 코드로 사용하지 않습니다.
PR #1182·#1188·#1189·#1190·#1214·#1218·#1219·#1220·#1223·#1242·#1243·#1244·#1248의 최종 상태를 대조했습니다. 예제 그룹 목록의 오른쪽 클릭·알림 끄기·켜기·대화 재진입을 실제 촬영했습니다. 잠금 조직의 두 기기 연결, 이전 메시지 접근, 설치 앱 푸시는 별도 확인이 남습니다.