Oh My Baby
수유·기저귀·수면 기록을 가족이 함께 남기는 앱입니다. 서로 다른 휴대폰에서 기록하고, 집의 서버를 통해 같은 내용을 확인할 수 있도록 만들고 있습니다.
연결이 끊겨도 기록을 이어가도록
연결보다 기록을 먼저
서버에 연결되지 않아도 기록을 남길 수 있어야 합니다. 입력한 내용과 나중에 보낼 요청을 휴대폰에 함께 저장하고, 연결이 돌아오면 같은 요청을 다시 전달하도록 했습니다. 앱이 종료되거나 응답이 끊겨도 아직 보내지 못한 기록을 이어서 처리하는 것이 중요했습니다.
서로 다른 기기에서 같은 기록 보기
한 기기에서 수면을 시작하고 다른 기기에서 종료하는 상황까지 다룹니다. 서버가 확정한 기록과 아직 보내지 못한 변경을 구분하고, 두 기기가 수정한 내용이 충돌하면 이를 확인할 수 있도록 구성했습니다.
기록을 지우거나 고친 뒤에도 되돌아볼 수 있도록 수정 이력과 삭제 복원 흐름을 함께 만들었습니다.
설계와 구현
구성과 데이터 흐름
기록 입력 → 기기 저장·전송 대기 → API → 서버 기록·변경 이력 → 기기별 변경분 동기화
iOS와 Android는 각각 네이티브 UI와 로컬 저장소를 사용하고, Python API와 SQLite가 확정된 기록을 관리합니다. 기기 안에서도 서버에서 받은 복제본과 아직 확정되지 않은 변경을 구분해 화면에 반영합니다.
기록과 보낼 요청을 함께 저장하기
화면에 반영할 변경과 전송 대기함인 Outbox를 한 트랜잭션으로 저장합니다. 앱이 종료돼도 기록과 보낼 요청이 함께 남도록 하기 위해서입니다. 같은 기록에 미해결 작업이 있으면 다음 수정을 막고, 이전 작업을 먼저 처리하도록 했습니다.
응답이 사라져도 처리 여부를 찾기
재연결할 때는 저장한 요청 본문과 식별자를 그대로 보냅니다. 서버는 요청별 처리 결과를 남겨 같은 요청의 재실행을 막고, 앱은 변경 이력에 포함된 작업 식별자로 응답이 유실된 요청도 정리합니다. 변경분 적용과 동기화 커서 갱신을 함께 저장하며, 전체 데이터를 다시 받을 때도 전송 대기 중인 변경은 보존합니다.
마지막 값으로 덮어쓰지 않는 충돌 처리
클라이언트가 본 버전 이후의 수정 이력을 비교합니다. 시각·완료 여부·기록 내용처럼 나눈 항목이 겹치지 않으면 병합하고, 같은 항목을 바꿨다면 충돌로 돌려줍니다. 값이 바뀌었다가 원래 값으로 돌아온 경우도 이력으로 판단합니다. 이력을 보관하는 비용과 같은 항목 안에서는 자동 병합하지 않는 제약을 받아들인 선택입니다.
두 플랫폼에서 같은 요청 만들기
HTTP 경로·본문·멱등키·조건부 버전을 공용 테스트 데이터로 고정하고, iOS·Android·서버가 같은 계약을 지키는지 확인하는 테스트를 두었습니다. 대기 작업 보존, 오래된 변경분의 롤백, 응답 유실 후 복구도 다룹니다. 실제 기기의 장기 단절과 운영 서버의 백업·복원은 별도의 릴리스 검증 항목입니다.
지금까지와 다음 단계
서버와 iOS·Android 앱에 주요 기록, 동기화, 기기 관리 기능을 구현했습니다. 시뮬레이터와 에뮬레이터를 연결해 기기 간 기록 전달과 오프라인 복구를 확인했습니다.
현재는 실제 기기에서의 사용 흐름과 서버의 백업·복원을 검증하는 단계입니다.