앱인토스 미니앱 5 – 경조사 봉투장부
앱인토스 미니앱 제작기 다섯 번째는 경조사 봉투장부입니다. 축의금이나 부의금을 누구에게 얼마 보냈고 얼마 받았는지 적어 두는 앱이에요.
“저번에 그 친구 결혼식 때 얼마 했더라” 하는 순간이 누구에게나 있잖아요. 이 앱은 그때 꺼내 보는 장부입니다. 매일 쓰는 앱이 아니라는 점을 기준으로 삼았고, 이 글은 거기서 나온 결정들을 적은 기록입니다.
경조사 봉투장부는 어떤 앱인토스 미니앱인가



화면은 하단 탭 기준으로 홈, 장부, 내 기록 참고 세 개입니다. 홈에서는 보낸 금액과 받은 금액 합계를 나눠서 보여주고, 장부에서는 이름이나 관계, 행사로 기록을 찾습니다. 내 기록 참고는 사람과 행사를 고르면 그 사람에게 내가 보냈던 기록만 추려 주는 화면이에요.
위 화면의 이름과 금액은 시연용으로 넣은 예시입니다.
다시 찾는 때는 ‘다음 경조사’
앞에서 다룬 물 마시기나 카드값 페이스는 매일 열 이유를 만드는 게 과제였습니다. 이 앱은 사정이 달라요. 경조사는 한 달에 한 번 있을 수도 있고 반년 동안 없을 수도 있으니까요.
매일 쓰는 앱
- 연속 기록, 매일 알림이 어울린다
- 어제와 오늘을 이어 주는 게 중요
행사 때 쓰는 앱
- 다시 찾는 단위가 하루가 아니라 다음 경조사
- 그때 필요한 걸 바로 찾게 해 주는 게 중요
그래서 이 앱에는 매일 출석을 세는 기능도 정기 알림도 넣지 않았습니다. 정해진 주기가 없는 일에 알림을 보내면 쓸모없는 알림이 되기 쉽거든요. 대신 기록이 쌓이는 만큼 올라가는 장부 등급을 두고, 오랜만에 열었을 때 첫 화면에서 바로 검색하고 바로 기록할 수 있게 하는 데 힘을 썼습니다.
앱인토스 미니앱 2 – 카드값 페이스사적인 기록이라서 넣지 않은 것
누구에게 얼마를 보냈는지는 꽤 민감한 정보입니다. 그래서 몇 가지는 넣지 않았어요.
공유 기능이 없습니다. 다른 앱에서는 결과를 카드로 만들어 공유하게 하는 경우가 많지만, 관계와 금액이 담긴 기록을 공유할 거리로 만들고 싶지 않았습니다.
이름을 꼭 실명으로 적지 않아도 됩니다. 입력란에 “김민수 대리, 사촌형” 같은 예시를 넣어서 별칭으로 써도 된다는 걸 알려 주고, 검색도 별칭으로 되게 했어요.
기록은 기기 안에만 저장하고 서버로 보내지 않습니다.
읽기에 실패한 것과 기록이 없는 것은 다르다
돈 기록을 다루는 앱에서 제일 피하고 싶은 장면은, 기록이 멀쩡히 있는데 앱이 빈 장부를 보여주는 겁니다. 그래서 저장된 기록을 읽은 결과를 세 가지로 나눴습니다.
export function readLedgerEntries(storage: StorageLike, key: string): LedgerReadResult {
let raw: string | null;
try {
raw = storage.getItem(key);
} catch {
return { status: 'unavailable' };
}
if (raw === null) return { status: 'ready', entries: [] };
try {
const parsed: unknown = JSON.parse(raw);
if (!Array.isArray(parsed) || !parsed.every(isLedgerEntry)) return { status: 'corrupt' };
return { status: 'ready', entries: parsed };
} catch {
return { status: 'corrupt' };
}
}세 가지 상태를 따로 다룬다
저장된 게 아예 없으면 빈 장부가 맞습니다. 하지만 저장소를 못 읽었거나 내용이 깨져 있을 때는 빈 장부로 바꿔 보여주지 않아요. 빈 장부로 보이면 사용자가 새로 기록을 시작하고, 그 순간 원래 기록을 덮어쓸 수 있기 때문입니다. 항목 하나하나의 모양까지 확인하는 것도 같은 이유예요.
저장이 됐을 때만 ‘저장했어요’
저장 쪽도 같은 생각으로 짰습니다. 저장 함수는 성공했는지를 참과 거짓으로 돌려줍니다.
export function writeLedgerEntries(storage: StorageLike, key: string, entries: LedgerEntry[]): boolean {
try {
storage.setItem(key, JSON.stringify(entries));
return true;
} catch {
return false;
}
}화면에서는 이 값이 참일 때만 “기록을 저장했어요”를 띄웁니다. 저장하지 못했을 때는 입력한 내용을 그대로 둔 채 다시 시도하라고 알려줘요. 기기 저장 공간이 꽉 찼을 때 저장된 줄 알고 넘어가는 일이 없게 하려는 겁니다.
전면 광고도 이 순서를 따릅니다. 앱을 열고 처음 저장할 때는 나오지 않고, 그다음 저장부터 저장 완료를 먼저 보여준 뒤에 안내를 거쳐서만 나올 수 있어요. 기록이 남았는지 확인하는 순간을 광고가 가리면 안 된다고 봤습니다.
내가 보낸 기록만 추려 보기
“그 사람한테 얼마 했더라”에 답하는 화면이 내 기록 참고입니다. 사람과 행사를 고르면 이 한 줄이 기록을 추려요.
const records = entries.filter(e => e.type === 'given' && e.name === name && e.event === event).sort((a,b) => b.date.localeCompare(a.date));내가 보낸 기록 가운데 그 사람, 그 행사에 해당하는 것만 골라 최근 날짜부터 보여줍니다. 받은 금액은 여기에 섞지 않고, 내가 보냈던 기록만 깔끔하게 보이게 했어요.
다음에 할 일
이 앱은 기능을 늘리기보다 지금 있는 흐름을 매끄럽게 하는 쪽으로 다듬으려고 합니다. 오랜만에 연 사람이 첫 화면에서 망설이지 않는지, 사람들이 실제로 어떤 말로 검색하는지를 보고 문구를 맞춰 가는 일이에요.
프로젝트를 어떤 식으로 진행하는지는 프로젝트 진행 방식에, 매일 열 이유를 만든 앱 이야기는 카드값 페이스 글에 있습니다.
경조사 봉투장부 자주 묻는 질문
경조사 봉투장부는 어떤 앱인가요?
결혼식, 장례식, 돌잔치 같은 경조사 때 주고받은 금액을 이름이나 별칭으로 기록해 두고, 다음 경조사 때 예전에 얼마를 보냈는지 찾아보는 앱입니다.
기록은 어디에 저장되나요?
기기 안에만 저장합니다. 기록을 서버로 보내지 않습니다.
알림이나 공유 기능은 왜 없나요?
경조사는 정해진 주기가 없어서 정기 알림을 두지 않았고, 사적인 관계와 금액이 담긴 기록이라 공유 기능도 넣지 않았습니다.
이 글은 앱인토스 미니앱 「경조사 봉투장부」의 기록입니다. 앱인토스는 토스 앱 안에서 미니앱을 서비스하는 플랫폼이고, 공식 안내는 앱인토스 개발자센터에 있습니다.
이 글은 직접 만들고 운영하며 남긴 기록입니다. 적힌 수치는 작성 시점의 제 계정 기준이며, 같은 결과나 수익을 보장하지 않습니다.

One Comment