Karuselle
엄선한 중고 디자이너 패션을 위한 다국어 마켓플레이스: 성장하는 Laravel 코드베이스 위의 시맨틱 검색, 유연한 판매자 수수료, EU 세무 보고, 새로운 결제 수단.

과제
판매자가 많고 외부 판매 채널이 여럿인 다국어 패션 마켓플레이스가 노후한 코드베이스 위에서 계속 성장해야 했습니다. 더 똑똑한 검색, 공정하고 유연한 수수료, EU 세무 보고, 더 많은 결제 수단, 그리고 빠르고 안전하게 유지되는 스토어가 필요했습니다.
해결책
3년 동안 유일한 개발자로 일했습니다.
- 프레임워크 업그레이드: 2주 만에 모든 패키지와 함께 Laravel 5.8 → 6 → 7 → 8 → 9 → 10 → 11, PHP 7.4 → 8.x로 업그레이드하고 새 서버로 이전.
- 4개 언어 시맨틱 검색: 자체 호스팅 임베딩 서비스와 벡터 데이터베이스, 큐를 통한 증분 색인 동기화, 서킷 브레이커를 갖춘 일반 검색 폴백, 배포 없이 관리자 페이지에서 전환하는 스위치, 결정적인 색상·카테고리·소재 필터, 동의어와 진단 명령.
- 카탈로그와 스토어프런트: 필터 개수가 표시되는 서랍형 실시간 AJAX 필터, EU 및 국가별 사이즈 체계로의 사이즈 변환, 할인 및 판매자 필터, SEO 친화적인 URL, 카드·헤더·푸터·메가 메뉴 전면 재디자인, 끌어서 놓기로 관리하는 홈페이지 배너와 슬라이더.
- 가격 제안(Make an offer): 구매자가 가격을 제안하면 관리자가 게스트에게도 이메일로 역제안하며, 1인당 제한, 만료, 중복 클릭 방지를 지원합니다.
- 결제: 장바구니, 결제, 이메일, VAT 인보이스 전반에 적용한 Buyer Protection 수수료; 쿠폰, 국가별 배송; 3D Secure를 지원하는 Stripe, Apple Pay와 Google Pay, PayPal REST, 금액 검증을 갖춘 Paysera.
- 판매자와 정산: 자체 수수료와 인보이스가 있는 판매 채널, 한 주문 안에서 판매자별 별도 인보이스, 판매자 정산일, XML 형식의 EU DAC7 세무 보고서, 데이터베이스 잠금으로 발급하는 인보이스 번호, 그리고 단일 리졸버·채널별 요율·등록 기간 규칙·미리 보기·끌어서 정렬·변경 기록을 갖춘 Commission Rules 모듈.
- 피드와 마케팅: Google Merchant, Facebook, CSV 형식의 파트너 마켓플레이스, Mailchimp 이커머스 동기화, consent mode v2.
- SEO와 GEO: 상품, 이동 경로, FAQ 구조화 데이터, 실제로 존재하는 번역에만 적용하는 canonical과 hreflang, 패싯 페이지 noindex, AI 크롤러용 robots 규칙과 llms.txt, 매일 생성되는 사이트맵과 SEO 점검 명령.
- 언어: 저장 시 번역과 주간 동기화 명령을 갖춘 LT, EN, PL, RU.
- 관리와 운영: 워커 하트비트가 있는 큐·작업 패널, 백그라운드 내보내기, 입력한 텍스트를 지키는 세션 복구, 방치된 임시 상품 정리.
- 보안: 보안 검토를 통해 접근 제어와 파일 접근의 허점을 막고, 계정별·IP별 로그인 제한을 추가하고, 비밀번호 변경 시 세션을 종료하고, 업로드 가능한 파일 형식을 제한했습니다.
- 테스트: 0개에서 239개로 늘린 테스트 스위트와 프로덕션에서 실행되지 않도록 하는 안전장치.
결과
- 상품 50개의 수수료 계산: 데이터베이스 쿼리 101개에서 2개로.
- 제안 목록: 페이지당 쿼리 169 → 121; 제안 35개가 있는 상품: 92 → 64.
- 상품 썸네일: 개당 136 KB → 20 KB(카테고리 페이지당 60개); 상품 하나의 이미지 2.5 MB → 0.5 MB.
- 판매 내역의 판매자 수익에 실제로 청구된 금액이 표시됩니다. 과거 기록 대부분에 영향을 준 오류를 찾아 수정했습니다.
- 시맨틱 검색은 프로덕션에서 약 9,000개 상품을 다룹니다.