마젠토의 주문 상태 state vs status 비교 및 차이점

마젠토 개발을 하다보면 주문관련 데이터베이스 테이블에(sales_flat_order) 주문의 상태를 나타내는 statestatus 필드를 발견할수 있습니다.
단어 자체로만 봤을떄 영어로도 이 두개의 의미는 별반 차이가 없구요 처음 접하거나 차이점을 잘 모르는 사람들에게 혼란만 가중시킬 뿐입니다.
하지만 같은 의미를 가진 이 두가지는 엄연히 용도가 다릅니다.

state vs status


state은 마젠토 데이터베이스 내에서 주문상태를 나타내는 attribute이구요, new, processing, complete, holded, closed, canceled, payment_review, pending_review 등등이 있습니다.
status는 state을 기반으로 관리자가 직접 설정할수 있는 attribute입니다.
관리자 모드 > System > Order Statuses로 가면 주문 status 리스트를 볼수있는데 status는 얼마든지 관리자가 원하는 단어/문구로 바꿀수 있으며 하나의 state을 여러개의 status로 나누어 관리할수도 있습니다.
쉽게말해 state은 마젠토 데이터베이스에서만 사용되는 attribute이고 status는 관리자가 설정하는 attribute 입니다.

하나의 state이 두가지 다른 status로 사용되는 예


마젠토에는 기본적으로 “payment_review”라는 state과 status가 있습니다.
“payment_review”는 아직 결제가 되지 않은 상태이고 단순히 손님의 지불방법을 리뷰하는 단계이며, 예를 들어 운영팀은 주문의 지불방법이 “수표”인 경우에 한해서 이 status를 사용합니다.
이것과 별개로 관리자는 사이트의 보안과 신뢰도를 높이기 위해 주문에 사용된 크레딧카드의 명의와 배송받는 사람의 정보가 연관성이 전혀 없어보일때 주문을 잠깐 홀드시키고 지불한 손님과 연락을 취해서 직접 확인해 보는 단계로 “suspected_fraud”(부정주문 의심)라는 status를 새롭게 만들고자 합니다.
새로운 status를 만든 관리자는 어차피 주문이 결제되지않은 상태이고 지불방법을 리뷰하는 상태이므로 “payment_review”라는 state과 연결시켜 놓습니다.
결국, 마젠토 내에서는 payment_review(status)나 suspected_fraud(status)나 똑같은 payment_review(state)이지만, 이렇게 다른 종류의 status를 만들어 놓으면 운영팀이 어떠한 행동을 취해야 하는지를 알수 있도록 도와줍니다.

sales_order_status_state 데이터베이스 테이블


각각의 state과 status의 연결상태를 데이터베이스에서 확인하려면 sales_order_status_state 테이블을 참고하면 알기 쉽구요, 아래는 제가 캡쳐한 데이터베이스 테이블의(Enterprise 1.14.2 기준) 내용입니다.

mysql> SELECT * FROM sales_order_status_state;
+-----------------+-----------------+------------+
| status          | state           | is_default |
+-----------------+-----------------+------------+
| canceled        | canceled        |          1 |
| closed          | closed          |          1 |
| complete        | complete        |          1 |
| fraud           | payment_review  |          0 |
| holded          | holded          |          1 |
| payment_review  | payment_review  |          1 |
| pending         | new             |          1 |
| pending_ogone   | pending_payment |          0 |
| pending_payment | pending_payment |          1 |
| processed_ogone | processing      |          0 |
| processing      | processing      |          1 |
+-----------------+-----------------+------------+
11 rows in set (0.00 sec)