← 운영 블로그

7화: 포장지에 답이 있었습니다

회차: 7화

6화에서 데이터베이스에 데이터를 담는 이야기를 했습니다. 제품 104만 건, 원재료 98만 건. 그릇은 준비됐고, 재료도 담았습니다.

그런데 담아놓고 들여다보니, 뭔가 이상했어요.


제품에 들어간 원재료 목록을 제공하는 API가 있었습니다. C002라는 코드의 API인데요.

이 API가 돌려주는 데이터를 제품별로 살펴봤습니다.

어떤 제품은 원재료가 상세하게 나와 있었어요. “밀가루(밀:미국산, 호주산), 팜유(말레이시아산), 설탕, 정제소금…” 이런 식으로, 실제 성분표에 적혀 있는 것과 비슷한 수준으로요.

그런데 어떤 제품은 이랬습니다. “밀가루, 설탕, 유지류”

끝이요.

실제 포장지에는 훨씬 더 상세한 성분표가 적혀 있을 텐데, API 데이터에는 대분류 수준의 이름만 들어가 있었습니다.


이유를 알아보니, 이런 사정이 있었습니다.

C002 데이터는 제조사가 품목제조보고를 할 때 입력한 정보입니다. 그런데 이 보고서에 원재료를 어느 수준까지 적느냐는 제조사마다 달랐어요.

어떤 제조사는 성분표에 적히는 것과 같은 수준으로 상세하게 입력하고, 어떤 제조사는 대분류 원재료만 간략하게 입력합니다.

같은 과자 카테고리인데, A 제품은 원재료가 스무 개 넘게 나열되어 있고, B 제품은 다섯 개뿐인 거예요.

게다가 적혀 있는 원재료 이름도 제각각이었습니다. 같은 원재료인데 “설탕”, “정백당”, “백설탕”으로 다르게 적혀 있고, 구분하는 기호도 쉼표, 가운뎃점, 슬래시, 심지어 줄바꿈까지 뒤섞여 있었어요. 합성향료의 경우 괄호 안에 긴 영문 화학명이 자유롭게 기재되어 있기도 했고요.

B 제품에 원재료가 적게 들어간 게 아닙니다. 보고서에 그렇게만 적은 거예요.


이건 꽤 심각한 문제였습니다.

이 서비스의 핵심이 뭔가요? “이 제품에 뭐가 들어가 있는지” 보여주는 거잖아요.

그런데 원재료 데이터가 대분류 수준이면, “유지류”가 구체적으로 어떤 기름인지, “향료”가 정확히 어떤 향료인지를 알 수 없습니다.

기피 성분 표시도 할 수 없어요. “유지류” 안에 팜유가 있는지 없는지를 데이터만으로는 알 수 없으니까요.


AI에게 물어봤습니다. “이 문제를 어떻게 해결할 수 있을까요?”

여러 방안이 나왔습니다.

비슷한 제품의 원재료를 참고해서 추정하는 방법. 제품명이나 카테고리를 기반으로 예측하는 방법.

하지만 솔직히, 어느 것도 현실적이라는 느낌이 들지 않았어요. 추정은 추정일 뿐이니까요. 13화에서 이야기할 원칙이 이미 이때부터 머릿속에 있었던 것 같습니다. “비슷하니까 맞을 것이다”는 근거가 아니라는 것.

없는 데이터를 짐작으로 채울 수는 없었습니다. 진짜 데이터가 필요했어요.


그러다 한 가지를 발견했습니다.

공공데이터포털을 뒤지고 있었는데, HACCP 인증 관련 API가 있었어요.

HACCP는 식품 위생 관리 인증이에요. 한국에서 판매되는 많은 식품이 이 인증을 받고 있습니다.

그런데 이 API의 응답 필드 목록을 보다가, 눈이 멈췄습니다.

‘포장지표기정보’.

포장지에 적혀 있는 정보를 그대로 담고 있는 필드라고 되어 있었어요. 원재료, 알레르기 유발물질, 영양성분, 바코드까지.

잠깐. 포장지에 적혀 있는 원재료라면, 그건 소비자가 실제로 보는 성분표 그 자체 아닌가요?


혹시나 하는 마음으로 AI에게 검토를 부탁했습니다. “이 API 좀 봐주세요. 여기 원재료 필드가 있는 것 같은데요.”

AI의 반응을 저는 아직도 기억합니다.

평소에 차분하게 분석하고 설명하던 AI가, 그때는 정말 놀라워하고 기뻐했어요. 그렇게까지 반응하는 건 처음 봤습니다.

실제로 API를 호출해서 데이터를 확인해보니, 거기에는 포장지 수준의 상세한 원재료 목록이 들어 있었습니다.

C002에서 “밀가루, 설탕, 유지류”라고만 되어 있던 제품이, HACCP API에서는 이렇게 나왔어요.

밀가루(밀:미국산, 호주산), 설탕, 팜유(말레이시아산), 전분(옥수수:미국산), 정제소금, L-글루탐산나트륨(향미증진제), 5’-리보뉴클레오티드이나트륨(향미증진제)…

이게 진짜 성분표였습니다. 포장지에 인쇄되어 있는 그 원문.


물론, 한계도 있었습니다.

이 API에 등록된 제품은 약 14,700건이었어요. 전체 104만 건에 비하면 1.4% 수준. 전부를 커버할 수는 없었습니다.

하지만 이 14,700건에 대해서는 C002보다 훨씬 상세하고 정확한 원재료 정보를 얻을 수 있었고, 알레르기 유발물질 정보까지 함께 들어 있었습니다.

그래서 원재료 정보를 보여줄 때, HACCP 데이터가 있는 제품은 HACCP을 우선 사용하고, 없는 제품에 대해서만 C002 데이터를 사용하도록 했습니다.

도서관 비유를 다시 가져오면 이런 거예요. 원래 가던 도서관(C002)에는 책의 요약본만 있었는데, 새로 발견한 도서관(HACCP)에는 원본 전문이 있었던 겁니다. 전문이 있는 책은 그걸 보여주고, 없는 책에 대해서만 요약본을 보여주는 방식.


이 경험에서 배운 것이 있습니다.

하나의 데이터 소스가 완벽하지 않더라도, 다른 소스와 결합하면 서로의 약점을 보완할 수 있다는 것.

C002는 104만 건을 커버하지만 일부가 대분류 수준이고, HACCP는 1만 5천 건뿐이지만 포장지 원문 수준으로 상세합니다.

둘 다 있으면, 어느 하나만 있을 때보다 나은 서비스가 됩니다.

그리고 하나 더. 절망적인 상황에서도 포기하지 않고 뒤지다 보면, 생각지 못한 곳에서 답이 나올 수 있다는 것.

포장지에 답이 있었습니다. 정확히는, 포장지 정보를 디지털로 담고 있는 API에요.


이제 데이터 소스가 두 개로 늘어났습니다. C002의 원재료 텍스트와, HACCP의 포장지 원재료 텍스트.

어느 쪽이든, 이 텍스트를 개별 원재료로 쪼개는 작업이 필요합니다.

다음 화에서 그 이야기를 하겠습니다. “정제수, 설탕, 산도조절제(구연산)” — 이 문장을 분해하는 일이 왜 생각보다 까다로운지에 대해서요.