CS처리에 효율적인 주문번호 만들기 (주문번호 알고리즘)

Dochis·2021년 10월 14일
15
post-thumbnail

" 그렇게 말하면 도와줄 수 없어, 무슨말인지 알지?? "
주문번호를 대충 만들면 CS담당자가 고객을 도와줄 수 없어요!

🙋‍♀️ 주문번호? 왜 필요한데?

일반적으로, 주문서별로 고유한 아이디가 필요하다면 DBMS에서 지원하는 Autoincrement 기능을 이용해서 순번을 사용하면 됩니다

주문번호가 필요한 이유는 대체로, 고객문의를 효율적으로 처리하기 위한 목적이 큽니다.

일반적인 고객문의 처리절차?
1. 주문번호를 묻는다
2. 주문서를 조회한다
3. 주문서에 있는 이름, 연락처 등의 정보로 고객 본인인지를 확인한다
3-1. 주문번호가 잘못되었다면 주문번호를 다시 확인하거나 고객의 개인정보를(전화번호 등) 이용해 주문서 조회를 시도한다.
4. 주문서를 찾았다면 주문의 내용을 확인하고 고객의 문의를 대응한다

위처럼, 주문번호를 잘못불러준 경우 처리가 굉장히 어렵고 주문번호를 재확인하는데에 많은 시간이 소요되게 됩니다.

이 경우 주문번호를 사용하는것 보단, 그냥 고객의 개인정보를 사용해 주문을 조회하는것이 더 효과적일 수 있습니다

하지만 고객의 개인정보로는 여러개의 주문 중 어떤 주문에 대한 문의인지를 다시 확인해야 하는 번거로움이 있이 때문에 주문번호를 효율적으로 설계하는것은 매우 중요합니다

주문번호를 효율적으로 설계했을 경우 얻는 이점을 살펴보자면

더 빠른 고객문의 처리 !

  • 주문번호만으로 언제 주문했는지, 어떤 종류의 상품을 주문했는지 파악이 가능하다면 더 빠른 고객문의를 처리할 수 있습니다

고객의 실수를 방지 !

  • 예를 들어 주문번호가 '222 25'번인 상황에서 실수로 2를 한번 덜 말해서 '222 5'라고 말하는 고객의 실수를 상황을 가정해볼 수 있습니다
  • 단순 순번의 경우 응대담당자는 주문번호의 길이가 들쭉날쭉하기 때문에 고객이 한글자를 빼먹었는지 알 방법이 없습니다
  • 이 경우 응대 담당자는 고객의 정보를 확인하고 주문을 2번 조회하는데에 상당한 시간을 낭비할 수 있습니다

🙄 효율적인 주문번호는?

  • 주문에 대한 대략적인 정보를 담고있어야 해 (업무효율성 향상)
  • 길이가 고정되어있어야 해 (고객실수를 방지)
  • 길이가 최대한 짧으면 좋아
  • 물론, 주문별로 고유한 값이어야 해

❌ 필요 없다고 생각되는 부분

쉽게 유추할 수 없어야 하지 않을까?
주문번호를 쉽게 유추하기 어렵게 하기위해 길이가 긴 주문번호를 사용할 필요는 없습니다
주문번호는 주문서를 빠르게 조회하고 업무효율을 향상하기 위한 목적으로만 활용해야 하고, 고객정보 이중 확인을 통해 개인정보를 보호해야 합니다

😏 다른 회사는 어떻게 할까?

  • 야ㅇㅇ Y210420BKC1N
    Y로 시작하는 12글자 길이의 주문번호
  • 쿠ㅇ 4000111111111
    숫자로만 구성 된 13글자의 주문번호
  • 네ㅇㅇ페ㅇ 20210420111111111
    숫자로만 구성 된 17글자의 주문번호
  • Gㅇㅇ 3111111111
    숫자로만 구성 된 10글자의 주문번호

😀 만들어보자

1. 주문번호에 어떤 내용을 담을까?

서비스의 목적과 주된 고객문의 내용에 따라 주문번호에 담는 내용이 달라질 수 있지만 일반적으로 주문날짜를 담고 필요할 경우 아래와 같은 정보를 담을 수있습니다

  • 상품 분류 코드
  • 한번에 한가지 분류의 상품만 한번에 구매할 수 있는 서비에 사용하기 유리
  • 혜택 정보 (프로모션 혜택을 받았는지? 특가 상품에 대한 주문인지? 복합인지?)
  • 환불 절차 코드 (내부 규정 상 환불 위약금 등의 절차가 다른 경우 코드화)
  • 위탁 상품 유무 코드 (직접 판매하는 상품이 아닌경우 해당 유무를 쉽게 알 수 있도록)
  • 등등

또한 주문번호를 잘못말할 때를 대비해 주문번호의 첫글자와 마지막 숫자를 더한 값을 주문코드 마지막에 추가하는 등의 checksum을 넣기도 합니다

다만, 주문번호의 길이는 가능한 짧은것이 좋기 때문에 최소한의 필요한 정보만을 1글자 정도의 코드내에 표현하는것이 좋습니다

2. 주문번호의 길이?

주문번호에 어떤 정보를 담을지 결정되었다면 주문번호의 길이를 정해야합니다
이는 주문의 빈도가 얼마나 자주, 많이 발생되는지에 따라 결정됩니다

예를들어 숫자로만 이루어진 12글자의 주문번호(YYMMDD + 6글자 랜덤숫자)의 경우 0부터 9까지의 숫자 6개로 경우의 수 백만개를 구현 할 수 있으므로, 이 숫자의 약 10%인 하루 10만개 내외의 주문이 발생되는 서비스에 적합하다고 볼 수 있습니다

주문이 폭증하는 상황 등을 고려하여 경우의 수가 얼마나 되는지, 또 어느정도의 가용성을 확보할지를 고려할 수 있습니다

2-1. 길이에 대한 예시

no규칙길이경우의 수Note
▼ 숫자로만 구성
1연월일(YYMMDD) + 랜덤숫자 3자리
예 : 201011111
9자리하루당 1,000개🟢 적당길이
2연월일(YYMMDD) + 랜덤숫자 4자리
예 : 2010111111
10자리하루당 10,000개🟢 적당길이
3연월일(YYMMDD) + 랜덤숫자 5자리
예 : 20101111111
11자리하루당 100,000개🟢 적당길이
4연월일(YYMMDD) + 랜덤숫자 6자리
예 : 201011111111
12자리하루당 1,000,000개🟡 조금 긴 길이
5연월일(YYMMDD) + 랜덤숫자 7자리
예 : 2010111111111
13자리하루당 10,000,000개🔴 긴 길이
6연월일(YYMMDD) + 랜덤숫자 8자리
예 : 20101111111111
14자리하루당 100,000,000개🔴 긴 길이
7연월일(YYMMDD) + 랜덤숫자 9자리
예 : 201011111111111
15자리하루당 1,000,000,000개🔴 긴 길이
▼ 햇갈릴 수 있는 문자를 제외한 영어+숫자로 구성
8연월일(YYMMDD) + '규칙1'영문자 3자리
예 : 201011A1B
9자리하루당 27,000개🟢 적당길이
9연월일(YYMMDD) + '규칙1'영문자 4자리
예 : 201011A1B2
10자리하루당 810,000개🟢 적당길이
10연월일(YYMMDD) + '규칙1'영문자 5자리
예 : 201011A1B2C
11자리하루당 24,300,000개🟢 적당길이
11연월일(YYMMDD) + '규칙1'영문자 6자리
예 : 201011A1B2C3
12자리하루당 729,000,000개🟡 조금 긴 길이
12연월일(YYMMDD) + '규칙1'영문자 7자리
예 : 201011A1B2C3D
13자리하루당 21,870,000,000개🔴 긴 길이
13연월일(YYMMDD) + '규칙1'영문자 8자리
예 : 201011A1B2C3D
13자리하루당 656,100,000,000개🔴 긴 길이
14연월일(YYMMDD) + '규칙1'영문자 9자리
예 : 201011A1B2C3D
13자리하루당 19,683,000,000,000개🔴 긴 길이
▼ 영어+숫자로 구성
15연월일(YYMMDD) + 모든 영문자 3자리
예 : 201011A1B
9자리하루당 46,656개🟢 적당길이
16연월일(YYMMDD) + 모든 영문자 4자리
예 : 201011A1B2
10자리하루당 1,679,616개🟢 적당길이
17연월일(YYMMDD) + 모든 영문자 5자리
예 : 201011A1B2C
11자리하루당 60,466,176개🟢 적당길이
18연월일(YYMMDD) + 모든 영문자 6자리
예 : 201011A1B2C3
12자리하루당 2,176,782,336개🟡 조금 긴 길이
19연월일(YYMMDD) + 모든 영문자 7자리
예 : 201011A1B2C3D
13자리하루당 78,364,164,096개🔴 긴 길이
20연월일(YYMMDD) + 모든 영문자 8자리
예 : 201011A1B2C3D4
14자리하루당 2,821,109,907,456개🔴 긴 길이
21연월일(YYMMDD) + 모든 영문자 9자리
예 : 201011A1B2C3D4E
15자리하루당 101,559,956,668,416개🔴 긴 길이

주) 숫자로만 구성 : 0~9까지의 숫자 10개
주) 규칙1: 햇갈릴 수 있는 문자 제외 : 숫자 0, 알파벳 o, i, j, u, v를 제외한 30개의 문자
주) 영어+숫자로 구성 : 모든 대문자와 모든 숫자 36개의 문자
주) 경우의 수 계산에는 한번 뽑은 문자를 다시 뽑을 수 있음이 고려되었음

👨 마치며

필자의 경우 햇갈릴 수 있는 영문자를 제외한 30개의 문자 조합으로

주문 날짜가 중요한 서비스의 경우
날짜(YYMMDD/6자리)+상품분류코드(1자리)+랜덤문자열 형식의 11~13글자 길이 주문번호를 주로 사용하며,

주문번호와날짜가 중요하지 않은 서비스의 경우
날짜부분의 길이를 축소하여 (YYMM/4자리)+상품분류코드(1자리)+랜덤문자열 형식의 11글자 내외의 길이의 주문번호를 많이 사용합니다

하지만 주문번호는 사용 목적에 따라 다양한 형식이 있을 수 있습니다

2023년 05월 28일 추가 코맨트
가장 최근 진행 한 프로젝트는 조금 다르게 해보았습니다
YYMM(4자리)+분류(1자리)+규칙1(4자리)+업무절차 코드(3자리) 를 적용하였습니다
랜덤문자 4자리 만으로 분류별 하루 약 81만개의 주문을 처리할 수 있어 충분하기 때문입니다
이 프로젝트의 경우 업무절차 코드는 매우 세분화 되었는데,
환불규정 코드 + 공급사가 분류코드 + 구매한 플랫폼이 어딘지에 대한 코드로 사용합니다
이 글이 많은 분들께 도움되었으면 합니다

🆕 수정사항

이 글은 2021년 5월 필자의 개인 경험에 따라 작성되었으나,
경우의 수 계산의 오류가 확인되어 2023년 5월 28일자로 수정되었습니다.

이전 잘못된 정보를 기재하여 혼란을 드려 죄송합니다

오류에 대해 제보해 주신 댓글 작성자님께도 감사의 인사를 올립니다.

5개의 댓글

comment-user-thumbnail
2023년 2월 2일

글 잘 읽었습니다!
궁금한 내용이 있어 문의 드립니다.

"예를들어 숫자로만 이루어진 12글자의 주문번호(YYMMDD + 6글자 랜덤숫자)의 경우 0부터 9까지의 숫자 6개로 경우의 수 약 5천개를 구현 할 수 있으므로, "

0부터 9까지의 숫자 6개로 경우의 수 결과가 약 5천개로 계산하는 방법이 어떻게 되는지 알 수 있을까요?

1개의 답글