DATOR


입출고.In/Out.수량관리 데이터모델


데이터의 입력, 출력을 살펴 본다.

 

데이터 모델링을 하면서 가장 난해한 부분은 이벤트, 트랜잭션과 같은 테이블을 설계하는 일인것 같다.   마스터 데이터들은 집합의 개체가 구체적으로 정의되어 있고 고유의 특성을 표현하는 속성들도 구체적으로 알 수 있다.   데이터가 많이 발생하고 빈번한 트랜잭션을 관리하는 테이블들은  구조만을 갖고서는 도대체 어떻게 데이터를 관리하고 있는지 그 속내을 알아 채기가 쉽지 않다.

 

대부분 시스템에서는 입력과 출력,  Input과 Output에 대한 이벤트를 관리하는 테이블들이 하나씩은 있을 것이다.

대표적인 것들이 재고관리에서 사용하는 입출고관리,  영업시스템의 매입과 매출,  은행에서의 입금과 출금, 쇼핑몰에서의 마일리지 추가/사용 등등 많은 영역에서 IN / OUT에 대한 수량관리를 하고 있다.  그러나 수량 관리 방식은 참으로 다양하다.  사이트마다 관리 방식이 다름에도 불구하고 동일한 비즈니스를 처리하고 있는 것이 놀랍고 신비스럽다.

 

먼저 INPUT과 OUTPUT의 개념을 매우 단순화 시킨 시나리오를 바탕으로 데이터 흐름,  데이터 발생방법, 테이블설계를 하나씩 알아보도록 한다.

[ 그림1 : 입출고 Input Output 시나리오 ]

 1. 입출고 inout 시나리오.jpg

 

 그림1에는 사과 BOX에 사과가 투입되었다가 판매되고 남은 사과를 다른 BOX에 이동하는 것이 표현되어 있다.   [ 투입 >> 판매 >> 이동 ]   BOX는 수량관리가 이루어지는 지점, 위치, 창고, 계좌 등으로 비유 될 수 있다.  사과는 수량관리가 이루어지는 대상물로서 재료, 자재, 부품, 돈, 쿠폰, 마일리지, 상품 등이 될 수 있다.  

이벤트는 크게 6개가 발생된 시나리오를 만들어 보았다.  1) 처음 100개의 사과가 box 1에 투입되었다.  이 사과는 시간이 지남에 따라 box에서 판매되어 소비된다.  또한 남은 사과는 다른 box로 이동을 하게 된다.  이동은 위치 --> 위치로의 물류 이동과 흡사하다.   box와 사과 사이에 엄청난 변화가 발생되고 있는데 우리는 다음과 같은 비즈니스 적인 질문을 던질 수 있다.

  • 각 BOX에 남아 있는 재고 수량은 도대체 몇개 인가 ?
  • 어느 BOX에서 판매가 가장 많이 이루어 졌는가 ?
  • BOX들간의 물물 교류가 가장 왕성하게 발생한 연관 box 들의 쌍으 어떤 것이지 ?

위 질문을 위해 간단하게 정리한 수량변화 이벤트 그림을 보자

 

[ 그림2 : 입출고 도식화 ]

 

1. 입출고 inout 시나리오  요약.jpg

 

먼저 위 6개의 시나리오를 1개의 그림으로 요약해 보았다.  각 box에서 발생한 수량의 변화와 재고, 판매 수량을 살펴 보길 바래요..

 

2. 입출금도식화.jpg

위 시나리오를 단순한 그림으로 도식화 해 보았다.

각각의 BOX에는 사과가 들어 왔다 나갔다를 반복하고 있다.  들어오는 부분은 INPUT, 입고, FROM에 해당하고  나가는 부분은 OUTPUT, 출고, TO에 해당한다.  BOX는 내부적으로 사용,판매와 같은 이벤트가 발생한다.  이는 마치 수학에서의 함수 f(x)와 같다는 생각이 든다.

BOX에는 현재 몇개의 사과 재고가 남아 있냐는 것이 중요한 팩터이다.  또한 어느 BOX에서 판매가 가장 왕성하게 이루어졌나를 알아 볼 수도 있다.

100개 투입된 사과는 BOX3에 20개,   BOX4에 20개 남아 있다.    판매된 사과는 총 60개 이다.

 

입고 + 이전재고 = 판매 + 출고 + 재고  : 공식을 눈 여겨 보자.

이 공식은 BOX 관점에서의 수량을 관리하는 공식이다.  제품의 수불관리에서 이와 유사한 공식이 사용된다.

 

입고      > BOX에 투입되는 수량이다. 

이전재고 > 시점(이벤트) 별로 수량관리를 할때, 바로 직전의 재고수량이  다음 데이터의 이전재고수량이 된다.  무슨 의미인지 궁금하면 다음에 나오는 예시 데이터를 보면 알 수 있을 것이다. 

판매      > BOX에 있을때 사용되거나, 소모되거나, 판매된 수량이다.

출고      > 다른 BOX로 이동 되었을때는 출고가 된다.

재고      > 총투입수량 - 총사용수량에서 남은 수량이 된다.  즉 "잔여수량"이다.  다른 의미로는 "판매가능수량"이라고도 불린다.

 

데이터 발생 ~~

 

이제 시나리오를 바탕으로 데이터를 발생시켜 보자.  1개의 시나리오에는 숨겨진 여러개의 이벤트들이 있으니 유의해야 한다.  6개의 시나리오니까 6건의 발생 데이터가 있을까요 ?  우선 데이터를 발생시키는 방법에는 몇가지가 있는지 살펴 보자.

데이터 1) 사과관점의 from ~ to 방식으로 데이터를 1건씩 발생 시킬 수 있다.

   - 사과 100개가  box1에 투입되었다.

   - 사과   50개가 box1에서 box2로 이동 하였다.

   - 사과   30개가 box1에서 판매(소비) 되었다.

   - 사과   20개가 box2에서 box3로 이동였다.

 

데이터가 발생한 그 시점의 이벤트를 그대로 기술한 듯이 데이터를 발생하면 된다.  아주 직관적이다.  특징은 사과 관점에서 이벤트를 정의하고 있다것이다. 

 

[ 데이터 1 : 사과관점 from ~ to 입출고 1줄]

 5.데이터 1.jpg

 

예시 데이터를 오른쪽의 도식이미지와 함께 대칭시켜 보면 쉽게 이해 할 수 있을 것이다.   사과 관점에서 이벤트를 정의하였기 때문에 box관점에서는 from box와 to box 필드를 모두 보아야만 box이벤트가 어디에 있는지 알수 있다.   from --> f(x) --> to 라는 수식이 발생하는데, 여기서 f(x)는 시간이라고 볼수 있다.  함수처리를 위한 지연 시간이 없다고 간주한다.  마치 갑이 을에게 사과를 주는데 건네 주는 시간은 0.1초 정도 소요 될 것이다.  따라서 from일시 = to일시 = 이벤트일시 라고 보아도 무방할 것이다.

 

 

데이터 2) BOX관점의 from ~ to 방식으로 데이터를 2건씩 발생 시킬 수 있다.

   - box1에    사과가 100개 투입되었다.

   - box1에서 사과가  50개 출고되었다.  어디로?    box2로

   - box2로    사과가  50개 투입되었다.  어디에서? box1에서

   - box2에서 사과가  30개가 판매(소비) 되었다.

   - box2에서 사과가  20개 출고되었다.  어디로?    box3로

   - box3에서 사과가  20개 투입되었다.  어디에서? box2에서

 

첫번째 데이터 방법 보다는 조금 더 복잡해 보이는 이벤트 설명이다.  그러나 천천히 읽어 보면 아주 직관적이다.  특징은 box 관점에서 이벤트를 정의하고 있다는 것이다.

 

[ 데이터2 : box관점 이벤트 입출고 2줄]

 5.데이터 2.jpg

 

여기에서도  from --> f(x) --> to 라는 수식이 발생하는데 f(x) 함수 처리시간이 약간 있다는 느낌이 든다.  왜냐하면  들어왔다,  나갔다를  box 단위에서 바라보기 때문에  사과가 전달되는 시간이 오래걸렸을 것이라고 상상된다.  마치 from box와 to box는 매무 먼 거리에 위치해 있어서 전달(운송)하기 위해서 별도의 기구를 사용하였을 것이다.  그러니 이동에 걸린 시간이 있었을 것이고  from일시 = 이벤트일시, to일시 = 이벤트일시 이지만 from일시 <> to일시 이다.   따라서 소요일시 = to일시 - from일시 라는 공식도 발생할 거라는 것을 알 수 있다.

 

보통 input --> output 의 데이터는 위 2가지 방식으로 구현 될 수 있다.  비즈니스에 따라 적절한 방식을 선택하는 것이지  어느 방식이 옳고 틀리다를 논할 수는 없다.  그럼 다른 방식의 데이터 처리방법은 없을까? 를 고민해 본다.  위에서  입고 + 이전재고 = 판매 + 출고 + 재고라는 공식을 소개한 것을 눈여겨 보자.  이벤트마다 수량의 변화가 발생하였으면 5개의 정보는 어딘가에는 있을 것인데 해당 공식을 뒷받침해주는 데이터가 직관적으로 나타나지 않는다.  이 데이터는 어디에 숨어 있는 것일까 ?  이벤트가 발생할때마다 위 공식의 수량을 알고 싶다면 어떻게 구현해야 할까?  뭐 데이터를 지지고 볶으면 어떻게 든지  만들어 낼 수는 있을 것이다.

 

이제  또 다른 3 방식의 데이터 발생 방법을 생각해 보자

 

데이터3) BOX관점의 from ~ to 방식으로 데이터를 2건씩 발생 시킬 수 있다.  > 상세한 부가속성을 관리한다.

   - box1에    사과가 100개 투입되었다.                                  재고는 10개이다

   - box1에서 사과가  50개 출고되었다.  어디로?    box2로         총 100개에서 50개 출고되고 재고는 50개이다

   - box2로    사과가  50개 투입되었다.  어디에서? box1에서           50개가 투입되어서 재고는 50개이다

   - box2에서 사과가  30개가 판매(소비) 되었다.                       총  50개에서 30개가 판매되어서 재고는 20개이다.

   - box2에서 사과가  20개 출고되었다.  어디로?    box3로         총 20개에서 20개가 출고되어서 재고는 0개이다.

   - box3에서 사과가  20개 투입되었다.  어디에서? box2에서           20개가 투입되어서 재고는 20개이다.

 

세번째 데이터 방법은 두번째 방식고 동일하다.  다만  수량의 종류를 좀 더 상세하게 관리하고 있다.  하나의 이벤트에는 input와 output이 함께 공존한다.  이벤트수량 1개의 속성이 입고수량, 이전재고수량, 사용수량, 출고수량, 재고수량 5개로 관리되고 있다.  데이터 관리는 좀 복잡해 보이지만 이벤트 시점의 수량 변화를 직관적으로 알 수 있다는 장점이 있다.   일종의 계산용 추출속성을 관리하는 방식이다.

 

[ 데이터3 : box관점 이벤트 입출고 2줄 부가속성]

 5.데이터 3.jpg

 

세번재 방식을 응용하면 일별, 월별, 년별 재고수량을 쉽게 관리할 수도 있다.   물론 중간에 데이터가 뻑~이 나더라고 원인파악을 하거나 원상복귀 하는게 용이 하겠다.

 

그럼 마지막으로 위 세가지 방식을 데이터모델로 구성해 보자.  여기까지 개념과 데이터 발생규칙을 자세히 살펴 보았다면  아래 제시된 데이터 모델은 금방 이해 할 수 있을 것이다.   사과 개체집합은 생략되어 있다.  box에서 관리하는 물품이 여러개 라면 "상품" 테이블을 만들고 box수량이력에 해당 상품번호를 연결(관계)시키면 될 것이다.

 

[ 데이터 모델 ]

 6. 데이터모델 2.jpg

 

다시 한번 말하지만 이벤트, 이력, 트랜잭션, 변화와 같은 데이터 모델링시에는 비즈니스 규칙에 따른 데이터 발생규칙을 이해해야만 완성도 놓은 데이터 모델이 된다.  이런 모델에는 반드시 시나리오별 예시 데이터를 만들어 주어야 개발시 혼선을 줄일 수 있을 것이다.

 

다만 모델링 프로젝트에서 1인당 감당해야 할 분량이 무지막지하게 많아서  개념을 구상하고 예시 데이터를 만들고 데이터 모델에 데이터를 흘려 보면서 테이블을 만들수 있는 시간이 절대 적으로 부족하다는 것이 안타깝도다. !  그래도 포기하지 말고 순서대로 차근차근히 시도해 보는 것이 데이터를 사랑하는 사람의 본분일 것이라고 생각한다.

 

" 매일 매일 조금 씩 강해 지자 "  천 천 히 . . .

* 따뜻한 데이터 세상 만들기 - FROM 핫신 *
Tag :

Leave Comments