← 운영 블로그

6화: 제품 100만 개를 담을 그릇

회차: 6화

5화에서 열한 개의 API를 연결하는 이야기를 했습니다. 데이터를 받아오는 것까지는 됐어요.

그런데 받아온 데이터를 어디에 담죠?

컴퓨터에 파일로 저장할 수도 있겠지만, 100만 개의 제품 정보를 파일에 넣어두면 “새우깡”을 찾으려고 할 때 100만 개를 전부 뒤져야 합니다. 그건 너무 느려요.

그래서 데이터베이스라는 것이 필요합니다.


데이터베이스. 이 단어는 많이 들어보셨을 거예요. 그런데 이게 정확히 뭔지 설명하라고 하면 좀 막막할 수 있습니다.

저도 그랬거든요.

쉽게 말하면, 데이터베이스는 ‘정리 규칙이 있는 서랍장’ 같은 것입니다.

서류를 생각해보세요. A4 용지 100만 장을 그냥 박스에 넣어두면 아무것도 찾을 수 없습니다. 그런데 서랍장을 만들어서, “제품 서류는 여기, 원재료 서류는 저기, 영양성분 서류는 이 칸” 이렇게 나눠 넣으면 찾을 수 있겠죠.

거기에 색인까지 붙이면 더 빠릅니다. “ㅅ”으로 시작하는 제품은 세 번째 서랍. 이런 식으로요.

데이터베이스가 하는 일이 바로 이겁니다. 데이터를 규칙에 맞게 저장하고, 필요할 때 빠르게 찾을 수 있게 해주는 것.


AI에게 물어봤습니다. “이 프로젝트에는 어떤 데이터베이스가 좋을까요?”

추천받은 것은 PostgreSQL이라는 것이었습니다. 이름이 좀 어렵게 생겼는데, 보통 ‘포스트그레스’라고 줄여서 부릅니다.

왜 이걸 골랐냐면요. 검색 기능이 내장되어 있어서, “새우” 하면 “새우깡”, “새우칩”, “새우맛 과자” 같은 것들을 빠르게 찾을 수 있고, 데이터가 100만 건이 넘어도 안정적으로 동작한다고 했거든요.

저는 그 설명을 듣고 “좋습니다, 그걸로 하죠”라고 했습니다. 솔직히 다른 데이터베이스와 뭐가 다른지까지는 잘 몰랐어요. 하지만 AI가 근거를 설명해줬고, 그 논리가 납득됐으니까요.


데이터베이스를 정했으니, 다음은 구조를 만들어야 했습니다. 어떤 서랍을 몇 개 만들고, 각 서랍에 뭘 넣을지를 정하는 것이요.

이걸 ‘테이블 설계’라고 합니다.

제품 정보를 담는 테이블이 필요하고, 원재료 사전을 담는 테이블이 필요하고, “이 제품에 이 원재료가 들어갔다”는 연결 정보를 담는 테이블이 필요하고, 영양성분 정보를 담는 테이블이 필요합니다.

총 열아홉 개의 테이블을 만들었습니다.

이게 많은 건지 적은 건지 저도 잘 모르겠지만, 각각의 테이블이 하나의 역할을 담당하고, 서로 연결되어 있는 구조입니다.

예를 들어 이렇습니다.

‘새우깡’이라는 제품이 있으면, 제품 테이블에 새우깡의 기본 정보가 들어가고, 원재료 테이블에 밀가루, 새우, 식물성유지 같은 표준 원재료 정보가 들어가고, 매칭 테이블에 “새우깡에는 밀가루가 들어갔다, 새우가 들어갔다”라는 연결 정보가 들어갑니다.

이렇게 나눠놓는 이유가 있어요. ‘밀가루’라는 원재료 정보를 한 곳에만 저장하면, 밀가루가 들어간 모든 제품에 대해 같은 정보를 공유할 수 있거든요. 제품마다 밀가루 설명을 따로 저장할 필요가 없는 거죠.


설계에서 특히 신경 쓴 것이 몇 가지 있었습니다.

첫째, 원본을 보존하는 것.

API에서 받아온 데이터의 원래 모습을 그대로 저장해두기로 했습니다. 나중에 “원래 데이터가 어떻게 생겼더라?”라고 확인하고 싶을 때가 반드시 올 것 같았거든요.

실제로 이 판단은 나중에 큰 도움이 됐습니다. (그 이야기는 12화에서 하겠습니다.)

둘째, 출처를 기록하는 것.

모든 데이터에 “이건 어느 API에서, 언제 가져온 것인지”를 함께 저장했습니다. 나중에 데이터가 이상할 때 “이게 어디서 온 거지?” 하고 추적할 수 있도록요.

셋째, 삭제하지 않는 것.

데이터를 지울 일이 있으면, 실제로 삭제하는 대신 “이건 더 이상 쓰지 않는 것”이라는 표시만 해두기로 했습니다. 한번 지운 건 되돌리기 어려우니까요.


이렇게 해서 그릇이 준비됐습니다.

제품 104만 건. 원재료 사전 4만 3천 건. 영양성분 28만 건.

이 데이터들이 각각의 테이블에 담겼습니다.

그런데 데이터를 담는 것과, 그 데이터를 ‘쓸 수 있게 만드는 것’은 또 다른 이야기입니다.

지금 상태에서 “새우깡에 뭐가 들어갔나요?”라고 물으면, 데이터베이스는 이렇게 답합니다.

새우(인도산, 베트남산), 밀가루(밀:미국산, 호주산), 팜유(말레이시아산), 전분(옥수수:미국산, 중국산), 설탕, 정제소금…

이건 API에서 받아온 원문 그대로예요. 한 덩어리의 긴 문자열입니다.

이걸 ‘새우’, ‘밀가루’, ‘팜유’, ‘전분’, ‘설탕’, ‘정제소금’으로 하나하나 분리해내는 작업이 필요했습니다.

그런데 그 작업을 하기 전에, 한 가지 중요한 발견이 있었습니다.

이 원재료 데이터가 생각보다 충분하지 않다는 것. 그리고 그 문제를 해결할 단서를 뜻밖의 곳에서 찾았다는 것.

다음 화에서 그 이야기를 하겠습니다.