물류 관련해서 서비스를 개발하다 보면
택배 운송장을 자체 출력하도록 구현해야 하는 경우가 있다.
CJ대한통운, 한진택배 등 택배사별로
RESTful API를 호출하는 방식으로 운송장 번호를 반환해 주거나
특정 대역의 운송장 번호 범위를 제공해 주고(DB TO DB 방식일 경우)
개발하는 쪽에서 해당 대역의 운송장 번호를 직접 테이블에 저장하고 사용하도록 협의 하기도 한다.
생각해 보면 간단하고 쉬운 문제다.
운송장 번호를 제공받고 해당 운송장 번호를 운송장에 출력해서
택배배송을 맏기면 해당 운송장 번호로 상품의 트래킹이 가능하니까..
그러나, DB TO DB 방식에서 특정 대역의 운송장 번호 범위를 제공받은 경우에는
운송장 번호를 주문별로 고유하게 채번해서 사용해야 하는데
이중화 서버에 서버별 멀티 쓰레드 환경에서는 이것이 쉽지 않다.
Java 기준으로 운송장 번호를 채번하는 메소드에 synchronized를 설정해도
단일 서버, 단일 쓰레드로 운영할 경우에만 작동하고
이중화 & 멀티 쓰레드 환경에서는 작동하기 않기 때문에
다른 주문에 동일한 운송장 번호가 채번되어 버리는 전산사고와 같은 일도 생겨버린다.
이런 일이 발생하면 아마 택배사 전산팀으로부터 연락을 받게 될 것이다.
운송장 번호가 이상하다고...
하지만 API 방식으로 운송장 번호를 반환해 주는 택배사의 경우에는
단지 운송장 번호 채번 API를 호출해서 반환된 운송장 번호를 사용하기만 하면 되기 때문에
고유한 운송장 번호 채번에 대한 고민은 없다.
하지만 API 방식의 경우에는 아무래도 속도에 대한 고민이 있을 수 밖에 없다.
실제로 택배사에 따라서 복수개의 주문에 대한 운송장 번호를 채번해주는 기능을 제공하지 않는 경우가 있다.
글을 작성하는 현 시점기준으로 CJ대한통운의 경우에는 단건 기준으로만 제공을 하고 (정책상 그렇다고 한다.)
한진택배의 경우에는 100건 단위로 제공을 한다.
한번에 많은 수의 주문에 대해서 운송장 번호를 채번하는 방식으로
API를 호출하는데 소요되는 시간을 줄여줄 수는 있지만 어차피 API는 호출해야 하니
호출하는데 소요되는 시간을 줄여줄 수는 없기 때문에
결국, API 방식으로 운송장 번호를 채번하는 경우 주문이 많으면 속도가 문제가 될 수 있다.
이 경우에는 시스템 사용시간이 적은 저녁에 배치방식으로 운송장 번호를 미리 채번해 두고
익일 업무가 시작되면 해당 운송장 번호를 사용하는 방식으로 속도에 대한 이슈를 극복할 수는(?) 있다.
다시 그러나.. 이 경우에는 또 "고유한" 운송장 번호 채번에 대한 문제가 남는다.
결국 DB TO DB 방식에서 운송장 번호의 대역을 제공받은 경우에는
고유한 운송장 번호 채번에 대한 고민이 남고(동시에 같은 운송장 번호를 채번하면 안된다.)
API 방식으로 운송장 번호를 채번하면 고유한 운송장 번호 채번에 대한 고민은 없지만
주문이 많아지면 속도에 대한 고민이 있고
이 속도를 극복하려면 배치 방식으로 운송장 번호를 채번해 두고
익일 해당 운송장 번호를 순서대로 사용할 수는 있지만
이 경우에는 다시 고유한 운송장 번호 채번에 대한 고민이 남는 것이다.
어찌해야 할까...
다중화 서버 & 멀티 쓰레드 환경에서도 고유한 운송장 번호를 채번해야 하는데
필자가 생각했던 것은 오라클에서 제공하는 시퀀스와 운송장 번호를 저장해서 사용하는 방식이다.
오라클 시퀀스는 NO CYCLE 이어야 할 것이고
테이블에는 아래와 같이 오라클 시퀀스 번호와 운송장 번호를 저장해둔다.
시퀀스 | 운송장 번호 |
0000001 | 2023-1216-1001 |
0000002 | 2023-1216-1002 |
0000003 | 2023-1216-1003 |
0000004 | 2023-1216-1004 |
오라클 시퀀스는 예를 들면 아래와 같이 정의해야 할 것이다.
CREATE SEQUENCE SEQ_INVOICE
INCREMENT BY 1
START WITH 1
MINVALUE 1
MAXVALUE 9999999
NOCYCLE;
즉, 테이블의 시퀀스 컬럼에는 오라클 시퀀스를 미리 저장해두고
운송장 번호를 채번해야 할때마다 SEQ_INVOICE.NEXTVAL 처럼 시퀀스 번호를 채번하고
해당 시퀀스 번호에 대한 운송장 번호를 가져와서 사용하는 것이다.
그러니까 검증된 오라클 시퀀스를 사용해서 고유한 번호를 채번하고
해당 고유한 번호에 연결된 운송장 번호를 사용하는 것이다.
이렇게 구현하면 주문에 고유한 운송장 번호를 채번하는데 대한 고민은 해결할 수가 있을 것이다.
물론, 주문이 많지 않은 경우에는 API 방식으로 매번 운송장 번호를 채번해도 전혀문제는 없을 것이다.
택배사에 따라서는 다건의 주문에 대해서 한번에 운송장 번호를 반환해 주는 경우도 있으니 말이다.
하지만 주문이 많아지고 속도에 대한 고민이 생긴다면 충분히 고민해야 할 문제임은 틀림없다.
'IT기술 연구소' 카테고리의 다른 글
Anaconda, Jupyter Notebook을 이용한 Yolo 객체 인식 (0) | 2025.04.12 |
---|---|
Visual Studio Code, Python을 이용한 Yolo 객체 인식 (0) | 2025.04.12 |
java.net.SocketTimeoutException: Read timed out (Jsoup) (0) | 2024.07.09 |
챗GPT로 초등학생 아이의 수학 문제를 풀어보았다. (0) | 2023.12.16 |