사고를 수습하고 나니, 정신이 좀 돌아왔습니다.
34화에서 이야기한 세 가지 사고. 7,525건 오매칭, 80% 데이터 삭제, 3일 무음 실패.
전부 고쳤어요. 원칙도 만들었고, 방어 코드도 넣었고.
한숨 돌리고, 앱을 열어봤습니다.
유가공품을 검색해봤어요.
치즈. 우유. 버터.
안 나왔습니다.
검색 결과 0건.
이상했어요. 치즈는 마트에서 파는 가공식품인데. 우유도 당연히 있어야 하는 거 아닌가?
104만 건의 제품이 들어있다고 자랑하던 데이터베이스에 치즈가 없었습니다.
찾아봤습니다.
식약처에서 데이터를 가져올 때, 저는 I1250이라는 API를 쓰고 있었어요. “식품위생법”에 따라 관리되는 일반식품 품목정보.
과자, 음료, 소스, 간편식 — 이런 것들이 전부 여기에 있었고, 104만 건이라는 숫자도 여기서 나온 거예요.
그런데 치즈는 “일반식품”이 아니었습니다.
축산물이에요. “축산물위생관리법”이라는 별도 법률로 관리됩니다. 그래서 API도 따로 있었어요.
I1310.
56만 건의 축산물 품목정보가 처음부터 거기에 있었습니다.
I1310을 연결했습니다.
치즈, 우유, 햄, 소시지, 버터. 56만 건이 쏟아져 들어왔어요.
이제 “우유”를 검색하면 나옵니다. “치즈”도, “소시지”도.
기뻤어요. 잠깐.
제품 상세 화면을 열어봤더니, 원재료 목록이 비어 있었습니다.
이름과 업체명만 있고, 뒤에는 빈 칸. 56만 건 전부요.
또?
같은 이유였습니다.
일반식품의 원재료는 C002라는 API에서 가져오고 있었어요. 그런데 C002는 일반식품만 커버합니다.
축산물의 원재료는, 역시 별도 API가 있었어요.
C006.
처음 보는 코드가 아니었습니다.
API 목록에 나란히 적혀 있었어요. C002 — 식품등의 품목보고(원재료) C003 — 건강기능식품 품목보고(원재료) C006 — 축산물 품목보고(원재료)
세 줄이 나란히 있었는데, 1년 넘게 첫 번째 줄만 보고 있었습니다.
왜 몰랐을까.
처음에 API를 찾을 때, “원재료”를 검색했어요. C002가 나왔고, 연결하니까 데이터가 쏟아졌습니다.
과자를 검색하면 원재료가 나오고, 음료를 검색하면 원재료가 나오고, 간편식을 검색해도 나오고.
“된다”는 경험이 쌓이니까, “안 되는 것”은 눈에 안 들어왔어요.
축산물 56만 건의 원재료가 비어 있다는 건 어떤 에러도 만들지 않았습니다. 화면에 “원재료 정보 없음”이라고 뜰 뿐이에요.
없는 게 에러는 아니니까요. 없는 걸 당연하게 받아들이고 있었습니다.
C006 API를 신청했습니다.
승인은 즉시 나왔어요. 공개 API라서, 신청만 하면 바로 쓸 수 있었습니다.
연결해보니 — C002와 구조가 완전히 같았어요. 필드 이름도 같고, 응답 형태도 같고.
기존에 만들어둔 코드를 복사해서 이름만 C006으로 바꿨더니 바로 돌아갔습니다.
558,504건의 원재료가 들어왔어요.
56만 건의 빈 칸이 채워지기 시작했습니다.
덤이 있었습니다.
C003이라는 API도 있었어요. 건강기능식품의 원재료.
이것도 같은 구조. 43,000건이 추가로 들어왔습니다.
7개월간 하나만 보고 있던 곳에서 눈을 돌리니, 나란히 서 있는 두 개가 더 있었습니다.
채워진 데이터가 전부 완벽한 건 아니었어요.
축산물의 원재료는 “돼지항정살”, “소꾸리살”, “한우채끝” 같은 부위 이름이 대부분이었는데, 우리 성분 사전에는 이런 이름이 없었거든요.
일반식품은 “정제수”, “밀가루”, “설탕” 같은 표준 이름이라 사전에 다 있었는데, 축산물 부위명은 아예 새로운 세계였어요.
매칭률 50.3%. 일반식품 99.3%에 비하면 절반.
하지만 이건 “못 채우는 빈 칸”이 아니라 “알게 된 빈 칸”이었습니다.
뭘 모르는지 모르는 것과 뭘 모르는지 아는 것은 전혀 다릅니다.
이번 주를 돌아봤습니다.
33화에서 핸드폰에 우유가 검색되는 걸 보고 기뻤습니다. 34화에서 세 가지 사고가 터지고 복구했습니다. 그리고 오늘, 1년간 몰랐던 56만 건의 빈 칸을 발견했습니다.
패턴이 보여요.
완성이라고 생각한 순간마다, 몰랐던 것이 나타납니다.
검색이 되면 매칭이 틀렸다는 걸 알게 되고, 매칭을 고치면 서버가 부족하다는 걸 알게 되고, 서버를 고치면 빈 칸이 있었다는 걸 알게 됩니다.
이건 끝나지 않는 거구나.
프롤로그에서 AI에게 물어봤습니다.
“이런 앱을 만들고 싶은데… 제가 할 수 있을까요?”
“물론이죠.”
시즌 1의 마지막 화에서 이렇게 썼어요. 그 “물론이죠”에는 이런 뜻이 있었다고.
‘할 수 있습니다. 하지만 쉽지는 않을 겁니다.’
시즌 2를 마치면서 하나 더 알게 됐어요.
쉽지 않을 뿐 아니라, 끝나지도 않습니다.
167만 제품, 837만 매칭, 99.3% 정확도. 숫자로 보면 꽤 그럴듯해 보여요.
하지만 그 숫자 뒤에는 7,525건의 조용한 거짓말이 숨어 있었고, 80%가 사라진 새벽이 있었고, 56만 건의 빈 칸이 1년간 보이지 않았습니다.
완벽은 없어요. 있는 건 “어제보다 덜 틀린 오늘”뿐입니다.
아직 첫 사용자를 찾지 못했습니다. 다운로드 수는 0이에요. 배포를 하지 않았거든요.
그래도 오늘은 이것만으로 충분합니다.
호빵 뒷면을 뒤집어보던 날에서 시작해서, 핸드폰에서 우유가 검색되는 날까지. 그리고 56만 개의 빈 칸을 발견한 오늘까지.
처음에 AI가 “물론이죠”라고 했을 때, 저는 그게 응원인 줄 알았습니다. 지금은 압니다. 그건 응원이 아니라 사실이었어요.
할 수 있었습니다. 쉽지 않았고, 끝나지도 않았을 뿐.
시즌 2는 여기까지입니다.
시즌 1이 “만들 수 있을까?”였다면, 시즌 2는 “만들긴 했는데, 이게 되는 건가?”였어요.
대답은 — 아직 모릅니다. 그건 첫 사용자가 알려줄 거예요.
다음에 다시 이야기를 이어갈 때는, 누군가의 핸드폰에서 첵잇이 돌아가고 있기를 바랍니다.
읽어주셔서 감사합니다. 호빵 뒷면에서, 여기까지.