웹 운영 · iOS 공개
우리모하냥
AI 링크 보관함 · 공간 채팅
2026.08 — 현재
개인 후속 개발 · 웹·네이티브 연동·AI 분석·배포
공유한 링크를 AI가 제목·요약·태그로 정리하고, 1–50명이 같은 보관함에서 다시 찾고 대화하는 앱입니다. 팀 커플 앱에서 출발해 개인 프로젝트로 제품과 구현을 확장했습니다.
Next.jsTypeScriptKotlinSwiftUISpring BootMySQLOpenAI APIAWS Lightsail
설계와 해결 과정
외부 AI를 기다리는 동안에도 링크는 먼저 저장
- 문제
- 저장 요청이 AI 분석을 기다리면 외부 서비스의 지연·실패가 링크 보관까지 막습니다. 분석 중 사용자가 내용을 보완하면 이전 결과가 뒤늦게 도착할 수도 있습니다.
- 구현
- 링크와 분석 대기 상태를 DB에 저장한 뒤 작업자가 선점합니다. 외부 API는 DB 트랜잭션 밖에서 호출하고, 완료 시 선점 토큰과 내용 버전이 모두 현재 값과 일치할 때만 결과를 반영합니다. 재시도 횟수와 다음 실행 시각도 DB에 남깁니다.
- 결과
- 링크 저장과 분석 완료를 분리했습니다. 사용자가 내용을 고친 뒤 도착한 오래된 결과는 반영하지 않고, 재시작 뒤에도 저장된 작업 상태에서 처리를 이어갑니다.
응답 형식과 원문 근거를 따로 검사
- 문제
- 제목·요약이 JSON 형식에 맞더라도 다른 게시물의 검색 결과를 원문으로 받아들이면 잘못된 링크를 설명하게 됩니다.
- 구현
- 모델이 써 낸 URL 대신 실제 API 인용과 검색 출처를 모읍니다. 원문과 같은 게시물·영상·장소인지 식별하고, 내용을 확인하지 못하면 NEEDS_CONTENT로 남겨 사용자에게 본문 보완을 받습니다.
- 결과
- 읽지 못한 링크를 성공한 요약처럼 표시하지 않습니다. 출처의 동일성 검사이며, 생성된 요약의 모든 사실을 보증하는 것은 아닙니다.
웹뷰 응답의 수명을 요청 단위로 관리
- 문제
- 카메라 등 네이티브 기능은 웹 요청과 응답 시점이 다르고 Android·iOS의 전송 방식도 다릅니다.
- 구현
- 공통 브리지에서 요청 ID별 Promise와 타이머를 보관합니다. 응답 스키마를 검사해 해당 요청에 전달하고, 완료·시간 초과·전송 실패 때 대기 항목을 정리합니다. 이미 종료된 요청의 응답은 무시합니다.
- 결과
- 플랫폼별 전송 차이를 공통 API 안으로 모았습니다. 호스트 부재·표준 오류·여러 클라이언트 공존을 계약 테스트로 확인했습니다.
웹·API·MySQL·Redis를 서울 Lightsail에 배포하고, Mac mini에 DB 암호화 백업을 구성했습니다.