마그ento 2 카트 가격 규칙, 대규모 복잡 프로모션 최적화

발행: (2026년 6월 17일 PM 06:02 GMT+9)
12 분 소요
원문: Dev.to

Source: Dev.to

카트 가격 규칙은 Magento의 가장 강력한 마케팅 기능 중 하나이며, 주의하지 않으면 스토어 성능을 급격히 저하시키는 가장 빠른 방법입니다.
활성 규칙이 수백 개고, 수백만 개의 쿠폰 코드가 있거나 여러 제품 속성을 아우르는 복잡한 조건을 갖춘 경우, 카트 업데이트 시마다 비싼 규칙 검증 사이클이 실행되어 원활한 결제가 느려지는 혼잡한 상황이 발생합니다.

이 가이드에서는 카트 가격 규칙이 느려지는 이유와 그 영향을 측정하는 방법, 그리고 규칙 설계 및 인덱싱부터 캐시와 데이터베이스 최적화까지 어떻게 해결할 수 있는지 단계별로 안내하겠습니다.

고객이 카트에 항목을 추가, 제거하거나 업데이트할 때마다 Magento는 모든 활성 카트 가격 규칙을 다시 검증합니다. 아래에서 그 내부 과정을 확인해 보겠습니다:

  • 활성 규칙 모두 로드 — Magento는 salesrule 및 관련 테이블에서 모든 활성 규칙을 가져옵니다
  • 조건 평가 — 각 규칙의 조건은 현재 견적(quote)에 대해 실행되며, 이는 제품 데이터, 고객 그룹 데이터, 그리고 경우에 따라 주소/카테고리 데이터도 로드됩니다
  • 쿠폰 코드 확인 — 쿠폰이 존재하면 salesrule_coupon 테이블에서 검증합니다
  • 무료 배송 및 할인 계산 — 각 견적 항목에 적용되는 금액을 재계산합니다
  • 결과 캐시 — 하지만 카트가 변경될 때마다 캐시가 무효화됩니다

성능 영향은 다음과 같은 요소와 지수적으로 증가합니다:

  • 활성 규칙 수
  • 규칙당 조건 복잡도
  • 카트에 있는 항목 수
  • 유통 중인 쿠폰 코드 수

최적화 전 기본값 측정하기

최적화하기 전에는 기본값을 측정하세요. 가장 빠른 방법은 프로파일링 플러그인을 사용해 salesrule 검증 시간을 확인하는 것입니다:

// app/Code/Vendor/Module/Plugin/TimingPlugin.php
public function aroundProcess(
    \Magento\SalesRule\Model\Validator $subject,
    callable $proceed,
    $address
) {
    $start = microtime(true);
    $result = $proceed($address);
    $elapsed = (microtime(true) - $start) * 1000;
    if ($elapsed > 200) {
        // Log slow rules — identify which rule IDs trigger long runs
        Mage::log("SalesRule validation took {$elapsed}ms", Zend_Log::WARN);
    }
    return $result;
}

MySQL의 느린 쿼리 로그도 확인할 수 있습니다:

-- Enable slow query logging temporarily
SET GLOBAL slow_query_log = 1;
SET GLOBAL long_query_time = 1; -- 1 second

데이터를 수집한 후 다음을 살펴보세요:

  • salesrule_coupon 쿼리가 500ms 초과 실행되는 경우
  • 카트 업데이트 시 연속적으로 여러 규칙 조건이 평가되는 경우
  • salesrule_customer_group, salesrule_website, salesrule_label 쿼리 횟수가 많고 높은 경우

규칙 설계 베스트 프랙티스

1. 중복 대신 규칙 결합

가장 큰 실수는 제품, 카테고리, 혹은 고객 세그먼트별로 하나씩 규칙을 만드는 것입니다. 500개의 규칙이 500개 제품에 존재하면, 카트가 바뀔 때마다 Magento는 모두 평가합니다.

대신: 와일드카드 조건을 사용하거나 SQL 수준의 조건으로 규칙을 결합합니다.

  • ❌ 나쁨: SKU 별 하나씩 규칙 (500개 규칙)
  • ✅ 좋음: “SKU가 PROMO-로 시작하는” + 카테고리 조건을 포함한 하나의 규칙 (1개 규칙)

과연 제품별 규칙이 필요하면 카탈로그 가격 규칙이나 계층적 할인 방식을 고려해 보세요. 이 방법들은 인덱싱 시점에 평가되며, 결제 시점이 아닙니다.

각 조건은 JOIN 또는 서브쿼리를 평가 SQL에 추가합니다. 10개 조건을 가진 규칙은 10개 이상의 JOIN을 포함하는 쿼리를 생성할 수 있습니다.

조건 유형별 우선순위 (가장 저렴한 순에서 비싼 순까지):

  • 고객 그룹 — 단일 인덱스 컬럼 조회 (가장 저렴함)
  • 웹사이트 — 동일하게 인декс된 외래키(FK)
  • 총액/소계 — 간단한 숫자 비교
  • 항목 수 — COUNT 쿼리, 상대적으로 저렴함
  • SKU — 배열 조건을 사용하면 비용이 많이 들 수 있음
  • 카테고리 — EAV 카테고리 경로 조회가 필요함
  • 속성 조건 — EAV 조인이 포함될 수 있어 매우 비쌈
  • 서브셀렉션 조건 — 가장 비싸며, 중첩된 쿼리

규칙 설계 원칙: 가장 저렴한 조건을 먼저 배치하고 가능한 한 적게 사용하세요. “고객 그룹 = 도매” + “소계 > €100”만 있는 규칙은 밀리초 안에 평가됩니다. 8개의 속성 조건과 카테고리 서브셀렉션이 포함된 규칙은 수 초가 걸릴 수 있습니다.

“모든 조건이 TRUE일 때”(대신 “하나도 TRUE면”)는 전체 카트 반복을 유발합니다. 50개 이상의 항목을 가진 카트의 경우 빠르게 누적됩니다.

필요한 경우 per-item 조건은 SKU나 카테고리 경로와 같은 인덱스 속성에 두고, 규칙당 총 5개 이하로 제한하세요.

몇 천 개 쿠폰을 생성하는 것은 괜찮지만, 대량 이메일 캠페인으로 수백만 개가 발생할 경우 신중한 계획이 필요합니다.

salesrule_coupon 테이블에 저장된 모든 생성 코드를 사용합니다. 고객이 쿠폰 코드를 입력하면 Magento는 다음과 같은 쿼리로 검색합니다:

SELECT * FROM salesrule_coupon 
WHERE code = :code AND (expiration_date IS NULL OR expiration_date >= :now)

적절한 인덱스가 없으면 이 쿼리는 전체 테이블을 스캔합니다. 반드시 다음 인덱스를 확보하세요:

-- 기존 인덱스 확인
SHOW INDEX FROM salesrule_coupon;

-- 필수: 코드와 rule_id 복합 인덱스
ALTER TABLE salesrule_coupon ADD INDEX IDX_SR_COUPON_CODE_RULE (code(32), rule_id);

-- 자주 사용되는 expiration_date에 대해
ALTER TABLE salesrule_coupon ADD INDEX IDX_SR_COUPON_EXPIRATION (expiration_date);

개별 코드를 생성하는 대신 쿠폰 접두사를 사용하세요. Magento는 관리 패널에서 기본적으로 쿠폰 코드 접두를 지원합니다.

예시: SUMMER-00001부터 SUMMER-100000까지 개별 코드를 생성하는 대신, 쿠폰 접두사 SUMMER-을 사용한 하나의 규칙을 만들고 Magento가 패턴을 검증하도록 하세요. 이렇게 하면 millions rows의 salesrule_coupon 테이블이 하나만 남게 됩니다.

전체 규칙 검증을 매 GET 카트 페이지 로드 시 실행하는 것을 방지합니다. 오직 카트가 실제로 바뀔 때만 실행됩니다.

카트 가격 규칙은 동적 콘텐츠이며 FPC(Fast Page Cache)에 캐시될 수 없습니다. 하지만 ESI(Edge Side Includes) 또는 Varnish 홀 패칭을 사용해 카트 가격 규칙 출력을 격리할 수 있습니다:

# In varnish.vcl — only if your theme supports it
sub vcl_recv {
    if (req.url ~ "^/checkout/cart/") {
        # Don't cache the cart page — rules are dynamic
        return (pass);
    }
}

대신, 카트 계산에 마이크로서비스 접근법을 사용한다면(예: Vue Storefront 또는 PWA), 가격 규칙 계산을 독립적으로 처리할 수 있는 전용 서비스로 이동할 수 있습니다.

실제 Magento 가게가 적용한 최적화 결과

OptimizationBeforeAfter
Rule conditions per rule8-123-4
Active rules34042 (combined)
Coupon codes2.1M14K (prefix pattern)
Cart validation time (10 items)2.3s280ms
Checkout page load4.1s1.2s

가장 큰 승리? 개별 제품 규칙 300개 이상을 카테고리 기반 3개 규칙으로 결합하고, 쿠폰 접미사 대신 프리픽스로 전환한 것입니다.

빠른 실행 계획

  • 감사 — 활성 규칙 수를 확인하고 프로파일링 플러그인으로 검증 시간을 측정
  • 결합 — 유사한 조건을 가진 규칙을 병합하고, 가능한 경우 카탈로그 가격 규칙을 사용
  • 简化 — 조건 복잡도 감소, 가장 저렴한 유형부터 사용
  • 인덱스 — salesrule_coupon 인덱스를 확인하고 누락된 복합 인덱스가 있으면 추가
  • 프리픽스 — 대량 생성 대신 쿠폰 코드 프리픽스 사용
  • 정리 — 만료된 쿠폰과 사용되지 않은 쿠폰을 정기적으로 정리
  • 캐시 — 카트 페이지 뷰에 대한 trigger_recollect 최소화
  • 모니터링 — salesrule_product_attribute 테이블 크기를 주시

카트 가격 규칙은 반드시 성능 악몽이 될 필요는 없습니다. 규칙을 신중하게 설계하고, 인덱스를 올바르게 맞추며, 정기적으로 정리하면 수백 개의 프로모션을 실행해도 결제 속도에 영향을 주지 않습니다.

0 조회
Back to Blog

관련 글

더 보기 »