식품 앱을 쓰는 분이라면 한 번쯤 해보셨을 겁니다. 마트에서 과자를 집어 들고, 바코드를 스캔하고, 성분 정보를 확인하는 것.
프랑스의 그 유명한 식품 앱이 그렇게 작동하죠. 찍으면 나옵니다. 당연하다는 듯이.
저도 당연하다고 생각했어요. 바코드를 읽으면 제품 정보가 나오는 건, 식품 앱의 숨쉬기 같은 거라고요.
그런데 숨을 쉬려면 공기가 있어야 합니다.
바코드 스캔이 작동하려면 데이터가 필요합니다. “이 바코드 번호는 이 제품이다”라는 연결 정보요.
편의점에 비유하면 이렇습니다. 편의점 문은 열려 있고, 과자가 3만 개 진열되어 있는데, 각 과자를 집어 들려면 열쇠가 하나씩 필요한 겁니다. 열쇠 없이는 포장지를 읽을 수 없어요.
정부에서 무료로 제공하는 바코드 데이터가 있었습니다. API라는 창구를 통해 받을 수 있는 건데, 열어보니 약 5만 6천 건이 들어 있었어요.
5만 6천이면 꽤 많아 보이죠. 그런데 우리 데이터베이스에 있는 제품 160만 건과 대조해보니, 실제로 연결되는 건 약 1만 개였습니다.
커버리지 0.62%.
100개 제품 중 바코드로 찾을 수 있는 건 1개도 안 되는 셈이에요.
왜 이렇게 적을까, 들여다봤습니다.
이 데이터가 마지막으로 업데이트된 게 2018년이었어요. 8년 전입니다.
마트에 가보면 아시겠지만, 편의점 과자만 해도 매달 신제품이 나옵니다. 8년이면 진열대가 몇 번이나 바뀌었을 시기인데, 바코드 데이터는 그때 그 자리에 멈춰 있었습니다.
도서관에서 2018년판 전화번호부를 들고 지금 전화를 걸려는 느낌이었어요.
그래서 유료 데이터를 찾아봤습니다. 코리안넷이라는 곳에서 관리하는 표준 데이터베이스가 있었어요.
메일을 보냈습니다. 회신이 왔습니다.
건당 1,100원.
“건당”이라는 말이 처음에는 와닿지 않았어요. 제품 하나의 바코드 정보를 받는 데 1,100원이라는 뜻이었습니다.
편의점 열쇠 비유로 돌아가면, 열쇠 하나에 1,100원입니다.
우리가 필요한 카테고리가 네 가지 — 과자, 유제품, 조미료, 영유아 식품. 이 네 카테고리에 해당하는 제품이 약 3만 4천 건이었어요.
34,035건 곱하기 1,100원.
3,744만원.
견적서를 계산기로 두드려보고, 잠깐 멈췄습니다.
3,744만원이면 네 가지 카테고리만의 가격이에요. 전체 식품을 다 하면 어떻게 될지는 물어보지도 않았습니다.
게다가 등록 연도별 필터링이 안 된다고 했어요. 이미 가지고 있는 5만 6천 건과 겹치는 것도 다시 사야 할 수 있다는 뜻이었습니다.
수익이 한 푼도 없는 프로젝트에서, 3,744만원을 바코드 데이터에 쓴다.
현명한 판단이 아니라는 건 알 수 있었습니다.
보류했습니다. 보류라고 쓰고, 무기한이라고 읽었어요.
대신 다른 길을 골랐습니다.
사용자가 바코드를 스캔했는데 제품이 안 나오면, “이 바코드를 제보해 주세요”라고 안내하는 방식이에요.
완벽하지 않습니다. 처음 쓰는 사람에게 “당신이 데이터를 채워주세요”라고 하는 건 좀 민망한 일이기도 하고요.
그래도 0.62%에서 시작하더라도, 사용자와 함께 채워가는 구조가 3,744만원을 쓰고 시작하는 것보다는 맞다고 생각했습니다.
데이터가 없으면 사는 것만이 답은 아닙니다. 함께 만드는 길도 있습니다. 다만, 느립니다.
이쯤에서 하나 더 이야기할 게 있어요. 바코드보다 훨씬 당혹스러운 발견이었습니다.
우리 데이터베이스에는 축산물이 56만 건 있었습니다. 소시지, 햄, 냉동 치킨, 그런 것들이요.
그런데 이 56만 건의 원재료 정보가 0건이었어요. 소시지 안에 뭐가 들어있는지, 데이터가 아예 없었습니다.
이상했습니다. 일반 식품은 원재료 정보가 잘 들어오는데, 축산물만 텅 비어 있었거든요.
추적해보니, 원인은 단순했습니다. 원재료 데이터를 가져오는 API가 일반식품만 다루고 있었어요. 축산물은 별도의 API가 따로 있었습니다.
그리고 그 API는 — 처음부터 거기에 있었습니다.
책장을 1년 넘게 쓰면서, 뒷면에 문이 하나 더 있다는 걸 모르고 있었던 겁니다.
API 목록을 다시 훑어봤을 때, 축산물 원재료 API의 필드 구조가 일반식품과 완전히 같았어요. 이름만 다르고 내용물은 똑같은 서랍이 하나 더 있었던 거예요.
신청했더니 바로 승인이 났습니다. 적재를 시작했습니다. 56만 건의 빈칸이 채워지기 시작했어요.
덤으로 건강기능식품용 API도 발견했습니다. 같은 구조, 같은 필드, 같은 방식. 세쌍둥이처럼 나란히 앉아 있었는데, 둘은 1년 넘게 눈에 안 들어왔던 겁니다.
3,744만원짜리 바코드 데이터는 아직 사지 못했습니다. 하지만 0원짜리 API는 처음부터 거기 있었는데 1년간 못 봤어요.
비싼 것이 항상 급한 것은 아니고, 가까이 있는 것이 항상 눈에 보이는 것도 아닙니다.
돈이 없어서 못 가는 길이 있고, 눈이 안 떠져서 못 보는 길이 있습니다. 둘 다 결국은, 한 발짝 물러서서 다시 보면 풀립니다.
다음 화에서는, 성분표를 “읽을 수 있게” 만드는 이야기를 할게요. “폴리소르베이트60”이라는 이름을 처음 봤을 때의 당혹감부터요.