STUDY/TIL
[TIL] 241205 - 대규모 AI 시스템 설계 프로젝트 1일차
7alswn
2024. 12. 5. 17:43
Do - List
- 코드카타
- 2차 프로젝트(대규모 AI 시스템 설계 프로젝트) 발제
- 요구사항 숙지
- 와이어프레임 구성
- DB 설계 - 테이블 명세서, ERD 작성
* 가중치 기반 로드 밸런싱 관련 유광열 튜터님 블로그
https://velog.io/@jaybon/gateway-loadbalance-custom-with-eureka
스프링부트 gateway 서버 로드밸런싱 커스텀 (with eureka)
스프링부트 MSA 구성 중 gateway 서버에서 서비스 중 일부 서비스의 로드밸런싱을 커스텀하려고 한다.기본 로드밸런싱은 RoundRobin 방식으로 분배하게 되어 있고,eureka에 등록된 서비스는 user서비스
velog.io
대규모 AI 시스템 설계 프로젝트
- 주제: MSA 기반 국내 B2B 물류 관리 및 배송 시스템 개발 (스파르타 물류)
- 개요
- 스파르타 물류는 각 지역에 허브 센터를 가짐
- 각 허브 센터는 여러 업체의 상품을 보관함
- 업체 상품은 허브 → 허브 전달
- 상품 배송 요청이 들어오면 목적지 허브로 물품을 이동시켜 목적지에 배송
- 프로세스
- 시스템은 허브를 갖고 있으며, 이 허브는 해당 도 내의 모든 주문, 재고 관리, 물류 운영을 담당함
- 일산의 플라스틱 가공 업체(예시): 일산에 위치한 생산 업체
- 부산의 바구니 제작 업체(예시)가 플라스틱 업체에 연락해 1000개의 플라스틱 가공품을 주문함 → 플라스틱 업체는 스파르타 물류에 배송을 요청 (가공품이 허브에 저장되어있음)
- 시스템은 배송 요청 처리를 위해 경기도 허브 → 부산시 허브 가공품 이동 계획을 세움 → 허브 간 이동 경로에 따라 가공품이 안전하게 전달됨
- 부산시 허브에 가공품 도착 → 부산 허브 소속 배송 담당자가 가공품을 바구니 업체로 전달
- 요구사항
- 허브는 총 17개, 허브 간 이동 경로는 이미 모델링을 통해 매핑 되어 있음
- 배송 담당자: 허브 배송 담당자(허브 간 이동, 총 10명) / 업체 배송 담당자(목적지 허브→업체 이동, 각 10명)
- 모든 업체는 특정 허브에 소속됨. 생산 업체 / 수령 업체로 구분됨
- 모든 상품은 특정 업체와 특정 허브에 소속됨
- 주문 생성 시 관련 재고 감소, 주문 취소 시 해당 수량 복원, 주문 삭제는 is_delete 필드로 관리
- 배송+배송 경로 기록은 주문 생성 시 자동 생성, 관련 데이터는 is_delete 필드로 관리
- 모든 sns 메시지는 sns 엔티티에 저장, 로그인 한 모든 사용자 및 내부 시스템에서 메시지 발송 가능
- 사용자 엔티티가 모든 사용자 정보를 관리, 사용자 비활성화는 is_delete 필드로 관리
- 사용자 권한: 마스터, 허브 관리자, 배송 담당자, 업체 담당자
- is_delete 필드가 false인 데이터만 조회 및 검색에서 사용되도록 로직 구현
ERD
테이블 명세서
공통 사항
- 테이블 명명 규칙: 모든 테이블에 p_ 접두사 사용
- 논리적 삭제 관리: is_delete 필드를 추가
- (논의) PK bigint autoincrement 와 Unique UUID를 함께 선언하여 관리 (확장성)
- 분산 DB 고려
- 모든 테이블에 created_at, created_by, updated_at, updated_by, deleted_at, deleted_by 필드를 추가
공통 컬럼
컬럼명 |
타입 |
기타 |
is_deleted |
boolean |
default (false) |
created_at |
TIMESTAMP |
|
created_by |
TIMESTAMP |
|
updated_at |
TIMESTAMP |
|
updated_by |
TIMESTAMP |
|
deleted_at |
TIMESTAMP |
|
deleted_by |
TIMESTAMP |
|
허브 (p_hub)
💡위도 경도 함께 저장하고 최단 거리 경로 파악시 해당 데이터를 통해 계산할 것
컬럼명 |
타입 |
제약사항 |
기타 |
hub_id |
BIGINT |
PK |
|
hub_uuid |
VARCHAR(45) |
unique |
|
name |
VARCHAR(45) |
|
허브 이름 |
address |
VARCHAR(255) |
|
허브 주소 |
latitude |
DOUBLE(10, 6) |
|
위도 |
longitude |
DOUBLE(10, 6) |
|
경도 |
- 권한
|
생성 |
수정 |
삭제 |
조회 및 검색 |
마스터 관리자 |
O |
O |
O |
O |
허브 관리자 |
X |
X |
X |
O |
배송 담당자 |
X |
X |
X |
O |
업체 담당자 |
X |
X |
X |
O |
- 허브 리스트
- 서울특별시 센터 : 서울특별시 송파구 송파대로 55
- 경기 북부 센터 : 경기도 고양시 덕양구 권율대로 570
- 경기 남부 센터 : 경기도 이천시 덕평로 257-21
- 부산광역시 센터 : 부산 동구 중앙대로 206
- 대구광역시 센터 : 대구 북구 태평로 161
- 인천광역시 센터 : 인천 남동구 정각로 29
- 광주광역시 센터 : 광주 서구 내방로 111
- 대전광역시 센터 : 대전 서구 둔산로 100
- 울산광역시 센터 : 울산 남구 중앙로 201
- 세종특별자치시 센터 : 세종특별자치시 한누리대로 2130
- 강원특별자치도 센터 : 강원특별자치도 춘천시 중앙로 1
- 충청북도 센터 : 충북 청주시 상당구 상당로 82
- 충청남도 센터 : 충남 홍성군 홍북읍 충남대로 21
- 전북특별자치도 센터 : 전북특별자치도 전주시 완산구 효자로 225
- 전라남도 센터 : 전남 무안군 삼향읍 오룡길 1
- 경상북도 센터 : 경북 안동시 풍천면 도청대로 455
- 경상남도 센터 : 경남 창원시 의창구 중앙대로 300
상품 (p_product)
컬럼명 |
타입 |
제약사항 |
기타 |
product_id |
BIGINT |
PK |
|
product_uuid |
VARCHAR(45) |
unique |
|
hub_id |
BIGINT |
FK (논리적) |
소속 허브 |
company_id |
BIGINT |
FK (논리적) |
소속 업체 |
name |
VARCHAR(45) |
|
상품 명 |
quantity |
INTEGER |
|
상품 재고 |
- 권한
|
생성 |
수정 |
삭제 |
조회 및 검색 |
마스터 관리자 |
O |
O |
O |
O |
허브 관리자 |
O (담당 허브) |
O (담당 허브) |
O (담당 허브) |
O (담당 허브) |
배송 담당자 |
X |
X |
X |
O |
업체 담당자 |
O (본인 업체) |
O (본인 업체) |
X |
O |
주문 (p_order)
컬럼명 |
타입 |
제약사항 |
기타 |
order_id |
BIGINT |
PK |
|
order_uuid |
VARCHAR(45) |
unique |
|
supply_company_id |
BIGINT |
FK (논리적) |
생산 업체 |
consume_company_id |
BIGINT |
FK (논리적) |
수령 업체 |
product_id |
BIGINT |
FK (논리적) |
주문 상품 |
quantity |
INTEGER |
|
주문 상품 수량 |
request |
VARCHAR(100) |
|
요청 사항 |
status |
VARCHAR(45) |
|
created, fail, success |
- 권한
|
생성 |
수정 |
삭제 |
조회 및 검색 |
마스터 관리자 |
O |
O |
O |
O |
허브 관리자 |
O |
O (담당 허브) |
O (담당 허브) |
O (담당 허브) |
배송 담당자 |
O |
X |
X |
O (본인 주문) |
업체 담당자 |
O |
X |
X |
O (본인 주문) |
업체 (p_company)
컬럼명 |
타입 |
제약사항 |
기타 |
company_id |
BIGINT |
PK |
|
company_uuid |
VARCHAR(45) |
unique |
|
hub_id |
BIGINT |
FK (논리적) |
소속 허브 |
name |
VARCHAR(45) |
|
업체 명 |
type |
VARCHER(45) |
|
supplier, consumer |
address |
VARCHAR(255) |
|
업체 주소 |
- 권한
|
생성 |
수정 |
삭제 |
조회 및 검색 |
마스터 관리자 |
O |
O |
O |
O |
허브 관리자 |
O (담당 허브) |
O (담당 허브) |
O (담당 허브) |
O (담당 허브) |
배송 담당자 |
X |
X |
X |
O |
업체 담당자 |
X |
O (본인 업체) |
X |
O |
사용자 (p_user)
컬럼명 |
타입 |
제약사항 |
기타 |
user_id |
BIGINT |
PK |
|
user_uuid |
VARCHAR(45) |
unique |
|
username |
VARCHAR(255) |
|
|
password |
VARCHAR(255) |
|
|
role |
VARCHAR(45) |
|
master, hub, deliver, company |
- 권한
|
생성, 수정, 삭제 |
회원가입, 로그인 |
조회 및 검색 |
마스터 관리자 |
O |
O |
O |
허브 관리자 |
X |
O |
O (본인) |
배송 담당자 |
X |
O |
O (본인) |
업체 담당자 |
X |
O |
O (본인) |
배송 담당자 (p_delivery_person)
컬럼명 |
타입 |
제약사항 |
기타 |
delivery_person_id |
BIGINT |
PK |
|
delivery_person_uuid |
VARCHAR(45) |
unique |
|
user_id |
BIGINT |
FK (논리적) |
|
hub_id |
BIGINT |
FK (논리적) |
소속 허브 ID |
허브 배송 담당자 → 0 |
|
|
|
sns_id |
VARCHAR(45) |
|
|
type |
VARCHAR(45) |
|
허브 배송 / 업체 배송 |
sequence |
INTEGER |
|
배송 순번 |
- 권한
|
생성 |
수정 |
삭제 |
조회 및 검색 |
마스터 관리자 |
O |
O |
O |
O |
허브 관리자 |
O (담당 허브) |
O (담당 허브) |
O (담당 허브) |
O (담당 허브) |
배송 담당자 |
X |
X |
X |
O (본인 정보) |
업체 담당자 |
X |
X |
X |
X |
- 타입이 허브 배송 담당자일 경우, 소속 허브 ID를 어떻게 해야할지?
배송 (p_delivery)
컬럼명 |
타입 |
제약사항 |
기타 |
delivery_id |
BIGINT |
PK |
|
delivery_uuid |
VARCHAR(45) |
unique |
|
order_id |
BIGINT |
FK (논리적) |
주문 ID |
delivery_log_id |
BIGINT |
FK (논리적) |
배송 로그 ID |
origin_hub_id |
|
|
출발 허브 ID |
destination_hub_id |
|
|
목적지 허브 ID |
status |
VARCHAR(45) |
|
현재 상태 (허브 대기 중, 허브 이동 중, 목적지 허브 도착, 배송 중 등) |
delivery_address |
VARCHAR(255) |
|
배송지 주소 |
recipient_name |
VARCHAR(45) |
|
수령인 |
recipient_sns_id |
VARCHAR(45) |
|
수령인 SNS ID |
- 권한
|
생성 (주문 시 자동 생성) |
수정 |
삭제 |
조회 및 검색 |
마스터 관리자 |
O |
O |
O |
O |
허브 관리자 |
X |
O (담당 허브) |
O (담당 허브) |
O (담당 허브) |
배송 담당자 |
X |
O (본인 배송) |
X |
O (본인 배송) |
업체 담당자 |
X |
X |
X |
O |
배송 경로 기록 (p_delivery_log)
컬럼명 |
타입 |
제약사항 |
기타 |
delivery_log_id |
BIGINT |
PK |
|
delivery_log_uuid |
VARCHAR(45) |
unique |
|
delivery_id |
BIGINT |
FK (논리적) |
배송 ID |
origin_hub_id |
BIGINT |
FK (논리적) |
출발 허브 ID |
destination_hub_id |
BIGINT |
FK (논리적) |
목적지 허브 ID |
status |
VARCHAR(45) |
|
현재 상태 (허브 이동 대기 중, 허브 이동 중, 목적지 허브 도착, 배송 중 등) |
estimated_duration |
INTEGER |
|
예상 소요시간 (단위: 분) |
actual_duration |
INTEGER |
|
실제 소요시간 (단위: 분) |
actual_distance |
INTEGER |
|
실제 거리 (단위: km) |
허브 간 이동정보 (p_hub_route)
컬럼명 |
타입 |
제약사항 |
기타 |
hub_route_id |
BIGINT |
PK |
|
hub_route_uuid |
VARCHAR(45) |
unique |
|
origin_hub_id |
BIGINT |
FK (논리적) |
출발 허브 ID |
destination_hub_id |
BIGINT |
FK (논리적) |
도착 허브 ID |
actual_duration |
INTEGER |
|
소요시간 |
actual_distance |
DOUBLE(8,2) |
|
거리 |
- 권한
|
생성 (주문 시 자동 생성) |
수정 |
삭제 |
조회 및 검색 |
마스터 관리자 |
O |
O |
O |
O |
허브 관리자 |
X |
X |
X |
O |
배송 담당자 |
X |
X |
X |
O |
업체 담당자 |
X |
X |
X |
O |
AI (p_ai)
컬럼명 |
타입 |
제약사항 |
기타 |
ai_id |
BIGINT |
PK |
|
ai_uuid |
VARCHAR(45) |
unique |
|
question |
VARCHAR(255) |
|
질문 |
answer |
VARCHAR(255) |
|
답변 |
SNS (Slack) (p_sns)
컬럼명 |
타입 |
제약사항 |
기타 |
sns_id |
BIGINT |
PK |
|
sns_uuid |
VARCHAR(45) |
unique |
|
user_id |
BIGINT |
FK (논리적) |
수신자 ID |
message |
VARCHAR(255) |
|
내용 |
sent_at |
TIMESTAMP |
|
발송 시간 |
- 권한
|
생성(주문 시 자동 생성) |
수정 |
삭제 |
조회 및 검색 |
마스터 관리자 |
O |
O |
O |
O |
허브 관리자 |
O |
X |
X |
X |
배송 담당자 |
O |
X |
X |
X |
업체 담당자 |
O |
X |
X |
X |