Skip to content

TMS / EDI / EDI 322

EDI 322

1. 기본 정보

항목 내용
작성자 이샘미
최초 작성일 2025-12-29
최종 변경일 2025-12-29

2. 요약 및 산출물

요약

EDI 322를 전송하고, 전송된 목록과 개별 데이터를 조회할 수 있는 기능을 제공합니다.

주요 산출물

  • EDI 322 전송 API

    POST edi/322
    

  • EDI 322 목록 조회 API

    GET edi/322
    

  • EDI 322 개별 데이터 조회 API

    GET edi/322/{div}/{receiver}/{tss}
    


3. 타당성

EDI 322를 통해 컨테이너의 입출고 정보를 고객에게 전달함으로써, 고객은 정해진 데이터 구조에 따라 재고 상태를 확인할 수 있습니다.


4. 기술 설명

DynamoDB 설계

이름 설명 비고
pk div/receiverID로 구성 Partition Key
ts 데이터 생성 기준 Unix timestamp Local Sort Key, CategoryIndex의 Sort Key
created_by 데이터 생성 주체
created_date 데이터 생성 일시
div Division 정보
edi_info 생성된 EDI 정보
file_name SFTP로 전송한 파일명
category 고정 상수 CategoryIndex의 Partition Key
  • EDI 322을 전송하기 위해서는 transactionNumber가 필요하며, 이를 생성하기 위해 CategoryIndex가 설정되었습니다.

How to generate the transaction number

EDI 210, 214, 322를 고객에게 전달하기 위해 transactionNumber가 필요하며, 생성 규칙은 모두 동일합니다.
규칙은 다음과 같습니다:

  1. 날짜 접두사 생성
    Division을 기준으로 YYMMDD 형식의 날짜 접두사를 생성합니다.

  2. 시퀀스 번호 생성
    해당 날짜에 테이블에 존재하는 트랜잭션 수에 1을 더하고, 3자리 0 패딩을 적용합니다.

  3. 최종 결합
    날짜 접두사와 시퀀스 번호를 결합하여 최종 transactionNumber를 생성합니다.

EDI 322 전송 처리 흐름

  1. EDI 322 데이터 구성
    • Request 데이터를 기반으로 EDI 322 메시지를 구성합니다.
    • transactionNumber를 생성하여 데이터에 포함합니다.
  2. DynamoDB에 데이터 저장
    • 구성된 EDI 322 데이터를 DynamoDB에 기록합니다.
  3. JSON 파일 생성 및 전송
    • EDI 322 데이터를 JSON 파일 형태로 구성합니다.
    • 사전에 합의된 SFTP 서버 정보에 기반하여 JSON 파일을 전송합니다.

EDI 322 목록 조회를 위한 Query

DynamoDB의 EDI 322 데이터를 저장하는 테이블의 Partition Key는 div/receiverID로 구성되어 있습니다. 해당 PK의 경우 계속 누적되는 데이터이므로 DynamoDB의 특성에 맞춰 아래와 같이 구현되었습니다.

DynamoDB Query 결과 용량 제한

DynamoDB Query의 결과는 최대 1MB로 제한되며, 이 용량을 넘어서는 경우 자동으로 Pagination이 발생합니다.

EDI 322 목록 조회 일부
filtered_322 = []
last_key = None

while True:
    query_kwargs = {
        'KeyConditionExpression': (
            Key('pk').eq(f'{div_instance.seq}/{receiver}')
            & Key('ts').between(start_ns, end_ns)
        ),
        'ScanIndexForward': False,
    }

    if last_key:
        query_kwargs['ExclusiveStartKey'] = last_key

    response = dynamo_322.query(**query_kwargs)
    filtered_322.extend(response.get('Items', []))

    last_key = response.get('LastEvaluatedKey')
    if not last_key:
        break

5. 위험성 평가

-


🧩 추가 정보

-