레드데이즈 상품 리스트 파서 구현
2020년 04월 11일

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

엑셀 파서 ver 1

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

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

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

엑셀 파서 ver2

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

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

예를 들어 위 케이스의 경우

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

문제는 엑셀

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

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

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

엑셀 파서 ver3

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

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

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