개발에 앞서 설계한 실시간 채팅 이미지 전송 흐름을 정리해봤다. 기존에 람다와 SQS를 사용한 프로필 이미지의 비동기 리사이징 로직을 최대한 활용할 수 있는 방향으로 고민해봤다.

1. [Client → Server] Presigned URL 요청
2. [Server] S3 키(Key) 생성 및 티켓 발행
UUID를 이용해 고유한 Key(BaseName)을 만들고, S3에 저장될 경로(Key)를 결정한 뒤 업로드용 Presigned URL을 반환3. [Client → S3] 이미지 업로드 (Binary 전송)
4. [S3 → Lambda] 트리거 발동 (자동)
5. [Lambda → S3 / SQS] 이미지 리사이징 및 알림
6. [Client → Server] 채팅 이미지 전송 (/chat)
Key를 전송7. [Server → S3] 객체 존재 여부 확인 (HEAD)
Key에 해당하는 파일이 S3에 실제로 존재하는지 HeadObject로 검증합니다.8. [Server → DB] 원본 데이터 저장 및 상태 확정
Image 테이블)에 원본 이미지 정보를 저장9. [Server SQS Listener] 리사이징 완료 메시지 수신 (별도 쓰레드)
Key(baseName)의 원본이 있는지 탐색Image 테이블의 해당 레코드에 썸네일/AVIF 경로를 업데이트(Upsert)ImageSession 테이블에 임시 저장. ImageSession 들은 서버가 주기적으로 배치처리(ImageSession→ Image).10. [Server → Message Broker] 조회용 URL 생성 및 브로드캐스트
SimpleMessageBroker)에 전달.11. [Message Broker → All Clients] 실시간 렌더링
Client B)을 포함한 채팅방 내의 모든 사용자는 브로커로부터 메시지를 수신하고, 포함된 URL을 통해 이미지를 화면에 렌더링.