기타 개발

1. 다나와는 카테고리와 옵션을 어떻게 구성했을까?

AUSTAR 2024. 7. 28. 22:03

 

1. 서론

 

컴퓨터 부품을 검색할때 주로 사용하는 다나와의 경우 트리 구조의 카테고리와 함께 다양한 상세검색 옵션을 제공하며 각 옵션을 선택했을 때 즉각적으로 상품 데이터를 반환한다.

 

 

 

다나와 고객센터에 있는 상품 등록에 대한 질의를 보면 다나와에 상품을 등록하고싶은 판매자는 직접 등록을 할 수 없고 다나와에서 이미 등록한 상품을 가격만 입력하여 등록한다고 한다.

그렇다면 상품, 카테고리, 상세옵션과 판매자에 대한 정보는 어떻게 구성이 되어있을까?

다나와는 외부로 상품 등록 방법이 제공되지 않기 때문에 어떻게 하면 유사한 서비스를 구성할 수 있는지 ERD를 그려보고 테스트 데이터를 입력하며 데이터 구조를 구상해보자.

 

 

다나와는 최대 4개 계층의 카테고리를 지원하며 3단계 카테고리부터 선택을 할 수 있다.

하지만 키워드 검색을 통해 검색을 할 경우, 더 상위 카테고리에 대한 선택이 가능하다.

 

 

가령 인텔9 같이 검색을 할 경우(인텔 이라고만 검색할 경우 인텔 카테고리를 타기 때문에 뒤에 9라고 붙였다) 카테고리나 상품 제목이 아닌 상품의 옵션에 동일 키워드가 있을 경우 빠른 검색을 지원한다.

하지만 여기에선 카테고리와 옵션에 대한 상품 검색 방법만을 구상해보자.

 

 

검색 옵션과 상품 페이지에서 상품 상세정보를 확인 하였을 때 확인할 수 있는 내용에서 크게 상단부분과 하단의 상세 옵션으로 구분을 한다고 했을 때

카테고리, 제조사, 옵션 그룹, 옵션, 옵션 상세, 상품, 상품 옵션이 존재하고 있음을 알 수 있다.

각 상품을 등록할 때마다 별도로 상품 옵션을 등록하는 것이 아닌 [옵션 그룹] 테이블에 [화명정보] 정보가 있고 그 하위 [옵션] 테이블에 [화면 크기]에 대한 값이 있으며 [옵션 상세] 테이블에 33.6cm(15.6인치) 라는 값이 있는 형식으로 볼 수 있다.

 

2. ERD

2.1. 논리 구조

 

간단히 테이블 논리 구조를 그려보면 다음과 같다.

툴은 IBM Data Studio를 사용하였다.

입점 업체에 대한 정보는 추후 추가하도록 하고 각 테이블을 보면 각 정보에 대한 삭제나 화면에 보일지에 대한 여부를 판단하는 컬럼값이 보이지 않을 것인데

다나와 같이 대형 쇼핑몰에서는 데이터 양이 많기 때문에 데이터를 select 하는데에 있어 제약 조건이 많을 수록 검색에 드는 옵티마이저의 cost가 높아지게 되므로 삭제나 사용하지 않는 상품이나 옵션에 대해서는 그 값을 별도로 저장하는 테이블을 놓고 삭제 혹은 보이지 않는 상품에 대해 저장용 테이블을 별도로 만들어 관리하는것이 좋다.

따라서 현재 구현되어있는 모든 테이블은 실제 사용을 위한 데이터만을 저장한다고 가정한다.

또 한 간혹 넘어가는 경우가 있는데, 사용여부와 상관 없이 대부분의 카테고리와 검색 옵션은 출력 순서를 관리자가 수정할 수 있도록 별도 컬럼으로 관리를 해야하며 index를 생성하는데에 있어 select 문의 order by 문에 사용하는 컬럼도 index를 타지 못할 경우 성능 저하를 일으킨다.

index 생성 할 때 where 문만이 아닌 group by, order by 도 풀스캔이 들어가지 않도록 신경 써야한다.

특히 index에 넣는 컬럼의 Sort Order 즉 순서를 설정 할 수 있으므로 해당 컬럼이 order by 에서 오름차순인지 내림차순인지를 판단하여 index를 생성하도록 한다.

추가로 index의 순서 또한 중요한 요소이며 where부터 order by로 끝나는 검색 조건에 맞춰 index 컬럼 순서를 정하도록 한다.

 

2.1.1. 카테고리 테이블

카테고리 테이블은 하나의 테이블에서 부모 카테고리 코드를 통해 상위의 테이블과 연결되도록 되어있다.

카테고리 그룹 테이블은 다나와의 경우 2번째 카테고리에서 그룹화된 카테고리 정보를 가지므로 카테고리 그룹 테이블을 사용하도록 추가하였다.

대부분의 구조는 카테고리를 중심으로 돌아간다.

 

index 목록

1. tbl_category_pCateogyrCode_index

설명 : 상위 카테고리가 하위 카테고리를 검색할 경우 사용하는 index이며 순서 출력까지 index가 걸리도록 하였다.

사용 컬럼 : 부모 카테고리 코드, 카테고리 출력 순서

2. tbl_category_level_orderBy_index

설명 : 특정 레벨의 카테고리와 카테고리 출력 순서에 대한 index이며 대표적으로 1차 카테고리를 호출할 때 사용된다.

사용 컬럼 : 카테고리 레벨, 카테고리 출력 순서

2.1.2. 옵션 그룹 테이블

옵션 그룹 테이블은 기본적으로 카테고리와 연결이 되어있다.

상품을 등록할 경우 가전제품을 등록하는데 가구에서 사용하는 옵션을 사용자가 볼 필요가 없고 잘못된 옵션을 선택하여 등록할 수 있는 문제가 있기 때문이다.

한가지 주의 할 점은 현재 다나와의 상세 검색 옵션을 확인할 경우, 옵션 그룹 테이블에서 사용하는 값을 사용하지 않고 상품 상세 정보를 확인할 경우에만 사용되고 있기 때문에 여기서 선택되어있는 카테고리 코드는 사실상 하위 상품 옵션 테이블에서만 사용된다.

 

index 목록

1. tbl_optionGroup_optionGroupOrderBy_index

설명 : 카테고리 코드와 옵션 그룹 출력 순서에 대한 index이며 특정 카테고리에 대한 옵션 그룹을 호출 할 경우 사용되는 index이다.

컬럼 : 카테고리 코드, 옵션 그룹 출력 순서

 

2.1.3. 옵션 테이블

옵션 그룹 테이블의 하위 테이블이며 다나와의 상세검색 옵션에서 우측 종류를 포관하는 정보를 저장하는 테이블이다.

검색 옵션 사용 여부 컬럼은 상세검색에서 사용하는 검색 옵션에 해당 옵션을 출력할지에 대한 값으로 상품 상세 정보 화면에서 보이는 상품 옵션과 상세검색에서 나타나는 옵션의 차이점이 있기 때문에 추가된 컬럼 이다.

 

index 목록

1. tbl_option_isSearch_optionOrderBy_index

설명 : 상세검색 옵션에 표출할 옵션일지 판단하는 검색 옵션 사용 여부 컬럼과 옵션 출력 순서를 사용하는 index이다.

컬럼 : 검색 옵션 사용 여부, 옵션 출력 순서

2.1.4. 옵션 상세 테이블

옵션 테이블의 하위 테이블이다. 상세검색에서 실질적으로 선택할 수 있는 옵션 정보를 저장하는 테이블이다.

옵션 테이블과 마찬가지로 검색 옵션에서 사용할 정보인지 판단하기위해 검색 옵션 사용 여부 컬럼이 추가되어있다.

 

index 목록

1. tbl_optionDetail_option_search_index

설명 : 상세검색에서 사용될 옵션 코드를 이용해 옵션 상세 테이블의 정보를 찾는 index이다.

컬럼 : 옵션 코드, 검색 옵션 사용 여부, 옵션 상세 출력 순서

2. tbl_optionDetail_optionCode_index

설명 : 상품 상세정보에서 사용될 옵션 코드를 이용해 옵션 상세 테이블의 정보를 찾는 index이다.

컬럼 : 옵션 코드

 

2.1.5. 제조사 테이블

제조사 또한 카테고리의 하위로 들어가게된다.

 

index 목록

1. tbl_maker_cate_orderBy_index

설명 : 상세검색 옵션에서 사용될 카테고리 코드와 제조사 출력 순서로 되어있는 index 이다.

컬럼 : 카테고리 코드, 제조사 출력 순서

 

2.1.6. 상품 테이블

상품 테이블에 연결된 카테고리 코드를 4개를 가지고 있는데 각 카테고리에 대한 별도 검색을 할 경우에 대해 최하위 카테고리 1개만 가지고 있는것에 비해 검색에 대한 복잡도가 줄어들기 때문이다. 따라서 각 카테고리에 대한 index들이 추가되어 있다.

상품 명에 대한 검색은 여기서 고려하지 않도록 한다.

 

index 목록

1. tbl_goods_makerCode_index

설명 : 제조사 코드에 대한 index

컬럼 : 제조사 코드

2. tbl_goods_cate1_index

설명 : 카테고리 코드1에 대한 index

컬럼 : 카테고리 코드1

3. tbl_goods_cate12_index

설명 : 카테고리 코드1, 카테고리 코드2에 대한 index

컬럼 : 카테고리 코드1, 카테고리 코드2

4. tbl_goods_cate123_index

설명 : 카테고리 코드1, 카테고리 코드2, 카테고리 코드3 에 대한 index

컬럼 : 카테고리 코드1, 카테고리 코드2, 카테고리 코드3

5. tbl_goods_cate1234_index

설명 : 카테고리 코드1, 카테고리 코드2, 카테고리 코드3, 카테고리 코드4 에 대한 index

컬럼 : 카테고리 코드1, 카테고리 코드2, 카테고리 코드3, 카테고리 코드4

 

2.1.7. 상품 옵션 테이블

상세검색 옵션에서 검색에 사용되며 상품 상세정보 화면에 출력되는 옵션 정보를 가지고 있는 테이블이다.

상세검색에 따른 검색의 핵심 테이블 이다.

 

index 목록

1. tbl_goodsOption_goodsCode_index

설명 : 상품 코드에 대한 index

컬럼 : 상품 코드

2. tbl_goodsOption_optionCode_optionDetailCode_index

설명 : 상세검색에서 검색을 할 때 사용될 index 이다.

컬럼 : 옵션 코드, 옵션 상세 코드

3. tbl_goodsOption_optionGroupCode_index

설명 : 상품 상세정보 화면에서 출력을 위해 group by할 때 사용할 index이다.

컬럼 : 옵션 그룹 코드

 

2.2. 물리 구조

 

 

테이블에 대한 물리 구조는 다음과 같다.

 

이제 해당 코드를 토대로 DDL을 만들어 MariaDB에 테이블을 생성한다.

 

이제 2번 째 글에서 더미 데이터를 입력한 후, 실행 계획을 비교하여 유사한 데이터 검색을 했을 때 cost 최적화를 해보도록 하자.