레드데이즈 상품 리스트 파서 구현

#parsing#side-project

개발팀에서 해야할 일은 이태리 에이전시에서 받은 구매 가능 상품 리스트 엑셀 파일로부터 시스템 내 상품 업로드까지의 과정을 “최대한” 시스템화하여 업로드를 돕는 것입니다.

엑셀 파서 ver 1

초기 구현했던 업로드 프로세스는 리스트를 받으면 운영 팀에서 사내 시스템에 맞게 엑셀 파일을 재작성합니다. 그 후 이 양식 파일을 업로드하여 등록하는 방식입니다.

위와 같은 양식의 상품 입력을 전달받으면,

이렇게 정보를 정리하여 엑셀 파일에 기록하는 방식입니다.

엑셀 파서 ver 2

문제는 시간이었습니다. 서비스 특성상 무엇보다도 빠른 상품 등록 속도가 중요했지만 업로드용 엑셀 파일 작성에 시간이 너무 오래 걸렸습니다.

병목 지점은 해당 상품명에 해당하는 이미지 검색 및 수집(구글링), 가방 같이 사이즈가 명시되어 있지 않아 각 브랜드 별 사이트 조회 및 수동입력 등이 있었습니다. 결국 자동화할 수 있는 지점을 더욱 고민해본 결과, 엑셀 재작성 프로세스를 제거하고 현지에서 온 엑셀 파일을 직접 파싱해서 바로 시스템에 업로드하는 방안을 모색했습니다. 양식에 표기되어 있는 ‘상품코드+색상’으로 unique 한 기준 field를 잡고 최대한 파싱 및 추론으로 입력한 후 수작업이 필요한 부분들만 업로드 하는 방식이었습니다. 사이즈 등 공식 브랜드 웹사이트에 접근해야 하는 작업은 해당 브랜드 내 검색 url 링크 등을 제공, 가격 데이터는 그때의 환율을 계산해주는 간단한 기능을 최대한 추가하여 데이터 입력 속도를 ver 1에 비해 대폭 향상시켰습니다.

예를 들어 위 케이스의 경우

  • 올바른 양식인지, 어떤 양식인지 체크 - “Code:”, “Description:” 등의 입력되어 있는 셀 체크
  • 반복하며 특정 offset들만큼 이동한 값들을 체크하여 필드 값을 채워 상품의 array를 생성 및 저장
  • 자동화 불가능한 나머지 빈 필드들은 사람이 직접 입력

문제는 엑셀

여기까지 상황을 보면 문제점이 없어 보입니다. 일정한 Shape로 리스트가 전달된다면.

문제는 엑셀 양식이 매우 많고, 모양이 천차만별이라 새 양식 등장 시 매 케이스마다 개발 작업이 불가피하다는 점입니다. 기껏해야 몇 종류일 것으로 보아 타입으로 관리하면 될 것으로 예상했으나, 추후 ver 3 업데이트까지 약 40개 이상의 타입을 대응해야만 했습니다.

이러한 양식들을 자동으로 분류 추론해 각 방식으로 파싱해야만 했습니다. 또한 비슷한 양식이어도 특정 필드가 없다던가, 간격이 다르다던가, 이미지가 등장했다가 사라졌다가 등 일관적이지 못했습니다. 어느정도 대응 후에는 패턴이 유추될 것 같아 보이지만 그렇지 않고 매번 리스트가 올때마다 케이스별 대응이 반복되었습니다.

엑셀 파서 ver 3

거기에 그 무렵 프리오더라는 시스템이 도입되었습니다. 개발자 입장에서는 로직이 변한 점은 없었는데 문제는 속도였습니다. 리스트를 받은 직후 몇시간 내로 엑셀 파싱 → 상품코드 분석 → 중복상품 병합 → 추가 정보 입력 및 가격 산정 의 프로세스를 마칠 수 있어야 했습니다. 문제는 파싱이었습니다. 위에서 언급했다시피 어떤 양식이 올지 예상할 수 없었기 때문에 리스트가 오는대로 새 타입 구현을 할 수 있어야만 했습니다. 또한 리스트는 한국 기준 업무 시간이 아니라 새벽·주말을 가리지 않고 오기 때문에 어떤 개발자도 돌아가면서 이 작업이 가능토록 해야 했습니다.

기존의 방식은 어떤 양식인지 분류 → 양식에 따른 파싱 의 과정을 거쳤습니다. 이 파싱 프로세스를 리스트 이터레이팅 → 상품 필드 파싱 → 사이즈, 재고량 파싱 총 3단계로 분류하여 각 설정들을 조합해 만드는 조합식 설정을 각 리스트 파일마다 1:1로 붙일 수 있도록 설계했습니다.

플랫폼 전환 시기에 맞춰 typescript로 구현, 각 파싱 방식을 단계별 정의한 클래스를 상속받아 프로세스를 깔끔하게 구현하려 했습니다.

← 목록으로