image 12

Occupy Item 개발 설계 문서

1. 개요

Occupy Item 기능은 Client에서 특정 Item(Lot, Product, Mask, CST 등)을 작업 중일 때 다른 사용자가 동시에 동일 Item에 대해 작업하는 것을 방지하기 위한 Lock(점유) 기능임.

  • 협의적(좁은) 의미: 특정 화면(ForceSampling, CompleteForceSampling)에서 Lot 단위로 락킹
  • 광의적(넓은) 의미: 여러 화면에서 Item 단위(LOT, PRODUCT, MASK, CST 등)로 락킹

2. 요구사항 정리

2.1 비즈니스 로직

  1. 사용자A 가 Item을 조회(작업) 시점에 Occupy 레코드를 DB에 Insert 혹은 Update(종료된 Expired상태면 갱신).
  2. 다른 사용자B는 동일 Item에 대해 ExpireTime 이전까지 접근 불가.
  3. 사용자A가 창 종료 시(OK버튼 클릭 혹은 실제 창 닫힘) 점유 해제(Free).
  4. ExpireTime 경과 시 자동 Expired 간주, 업데이트는 별도 프로세스 또는 조회 시 갱신.
  5. UI 및 메뉴 명시 가능 (UINAME, MENUNAME).
  6. 사용자 이벤트 기록 (누가 언제 어떤 상태 변경했는지 기록)

2.2 상태(State)

  • Occupied: 정상 점유중
  • Free: 해제됨
  • Expired: 만료 처리됨(시간 초과)

2.3. 프로세스

2.3.1. 순차적

%%{init: {"theme": "dark"} }%%
sequenceDiagram
    participant User as 사용자 및 화면
    participant OccupyService as 점유서비스
    participant OccupyControl as 점유관리(CT_OCCUPY_ITEM)
    participant OccupyHistory as 점유이력(CT_OCCUPY_ITEM_HISTORY)

    User->>OccupyService: 아이템 점유 요청(조회)
    OccupyService->>OccupyControl: 점유상태 확인
    alt 점유 정보 없음 or Expired 상태
        OccupyService->>OccupyControl: 점유 정보 INSERT/업데이트(STATE=OCCUPIED)
        OccupyService->>OccupyHistory: 점유 이벤트 이력 기록
        OccupyService-->>User: 작업 허용 응답
    else 이미 다른 사용자 점유 중(ExpireTime 미도래)
        OccupyService-->>User: 접근 거부 응답 (작업 불가)
    end

    User->>OccupyService: 작업 진행 중 요청
    OccupyService->>OccupyControl: 작업 상태 유지/검증

    alt 작업 종료 (창 닫힘/OK)
        User->>OccupyService: 점유 해제 요청
        OccupyService->>OccupyControl: 점유 해제 처리(STATE=FREE)
        OccupyControl->>OccupyHistory: 해제 이벤트 이력 기록
    end

    alt 점유 만료(ExpireTime 도래)
        OccupyService->>OccupyControl: 점유 만료 처리(STATE=EXPIRED)
        OccupyControl->>OccupyHistory: 만료 이벤트 이력 기록
    end

2.3.2. 상태

%%{init: {"theme": "dark"}}%%
stateDiagram-v2
    [*] --> FREE: 초기 상태 or 점유 해제
    FREE --> OCCUPIED: 사용자 점유 시작(조회)
    OCCUPIED --> FREE: 정상 해제(창 닫음/OK)
    OCCUPIED --> EXPIRED: ExpireTime 도래(만료)
    EXPIRED --> OCCUPIED: Expired 후 재점유(조회)

3. DB 테이블 설계

3.1 CT_OCCUPY_ITEM 테이블 (현재 점유 상태 관리)

컬럼명데이터 타입NOT NULLPK설명
ITEM_TYPEVARCHAR2(40)OOItem 유형 (LOT, PRODUCT, MASK 등)
ITEM_NAMEVARCHAR2(40)OOItem 명 (각 유형 별 대표 고유값)
USER_IDVARCHAR2(40)현재 점유 중인 사용자 ID
STATEVARCHAR2(40)점유 상태 (Occupied, Free, Expired 등)
START_TIMEDATE점유 시작 시간
EXPIRE_TIMEDATE점유 만료 시간
UI_NAMEVARCHAR2(40)점유 시 화면 명
MENU_NAMEVARCHAR2(80)점유 시 메뉴 명
REG_USR_IDVARCHAR2(20)최초 등록자 ID
REG_DTDATE최초 등록 일시
UPDT_USR_IDVARCHAR2(20)최종 수정자 ID
UPDT_DTDATE최종 수정 일시
  • PK: (ITEM_TYPE, ITEM_NAME)
  • 기능: 현재 점유 상태를 한 눈에 관리
  • 상태 갱신 시마다 UPDT_USR_ID, UPDT_DT 변경

3.2 CT_OCCUPY_ITEM_HISTORY 테이블 (점유 변동 이력 관리)

컬럼명데이터 타입NOT NULLPK설명
TIME_KEYVARCHAR2(80)OO고유 시간 키 (예: TIMESTAMP + SEQ 등)
ITEM_TYPEVARCHAR2(40)OOItem 유형
ITEM_NAMEVARCHAR2(40)OOItem 명
USER_IDVARCHAR2(40)처리를 진행한 사용자 ID
STATEVARCHAR2(40)해당 시점 상태 (Occupied, Free, Expired)
START_TIMEDATE점유 시작 시간
EXPIRE_TIMEDATE점유 만료 시간
UI_NAMEVARCHAR2(40)점유 시 화면 명
MENU_NAMEVARCHAR2(80)점유 시 메뉴 명
REG_USR_IDVARCHAR2(20)이벤트 등록자 ID
REG_DTDATE이벤트 등록 시간
  • PK: (TIME_KEY, ITEM_TYPE, ITEM_NAME)
  • 기능: 점유 상태 변경 이력 추적
  • TIME_KEY는 타임스탬프와 시퀀스 조합 등을 활용해 유니크한 값 생성

4. 테이블 생성 예시 (DDL)

sqlCREATE TABLE CT_OCCUPY_ITEM
(
   ITEM_TYPE    VARCHAR2(40 BYTE) NOT NULL,
   ITEM_NAME    VARCHAR2(40 BYTE) NOT NULL,
   USER_ID      VARCHAR2(40 BYTE),
   STATE        VARCHAR2(40 BYTE),
   START_TIME   DATE,
   EXPIRE_TIME  DATE,
   UI_NAME      VARCHAR2(40 BYTE),
   MENU_NAME    VARCHAR2(80 BYTE),
   REG_USR_ID   VARCHAR2(20 BYTE),
   REG_DT       DATE,
   UPDT_USR_ID  VARCHAR2(20 BYTE),
   UPDT_DT      DATE,
   CONSTRAINT CT_OCCUPY_ITEM_PK PRIMARY KEY (ITEM_TYPE, ITEM_NAME)
)
TABLESPACE MES_CUSTOMS_DAT
PCTUSED 0
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (INITIAL 64K NEXT 1M MAXSIZE UNLIMITED MINEXTENTS 1 MAXEXTENTS UNLIMITED PCTINCREASE 0)
LOGGING
NOCOMPRESS
NOCACHE
NOPARALLEL
MONITORING;

CREATE TABLE CT_OCCUPY_ITEM_HISTORY
(
   TIME_KEY    VARCHAR2(80 BYTE) NOT NULL,
   ITEM_TYPE   VARCHAR2(40 BYTE) NOT NULL,
   ITEM_NAME   VARCHAR2(40 BYTE) NOT NULL,
   USER_ID     VARCHAR2(40 BYTE),
   STATE       VARCHAR2(40 BYTE),
   START_TIME  DATE,
   EXPIRE_TIME DATE,
   UI_NAME     VARCHAR2(40 BYTE),
   MENU_NAME   VARCHAR2(80 BYTE),
   REG_USR_ID  VARCHAR2(20 BYTE),
   REG_DT      DATE,
   CONSTRAINT CT_OCCUPY_ITEM_HISTORY_PK PRIMARY KEY (TIME_KEY, ITEM_TYPE, ITEM_NAME)
)
TABLESPACE MES_CUSTOMS_DAT
PCTUSED 0
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (INITIAL 64K NEXT 1M MAXSIZE UNLIMITED MINEXTENTS 1 MAXEXTENTS UNLIMITED PCTINCREASE 0)
LOGGING
NOCOMPRESS
NOCACHE
NOPARALLEL
MONITORING;

5. 주요 구현 포인트 및 프로세스 정리

  1. 조회 시 데이터 존재 확인
    없으면 Insert (STATE = ‘OCCUPIED’, START_TIME = 현재, EXPIRE_TIME = 현재 + TTL)
    있으면 점유 만료시간(EXPIRE_TIME) 확인하여 만료되었으면 STATE=’EXPIRED’로 Update 후 신규 Insert or Update
  2. 다른 사용자의 조회 제한
    조회 시 현재 점유 중인 사용자 아니라면, EXPIRE_TIME 이전까지 조회 불가 – 예외처리 및 안내 메시지 표출
  1. 창 닫힘 또는 OK 클릭 시 해제(STATE=’FREE’)
    점유 해제 시점, 관련 컬럼(UPDT_USR_ID, UPDT_DT 등) 업데이트
  1. 점유 만료 처리
    만료시 자동 Expired 상태 처리 (조회 시 갱신 혹은 별도 배치 처리)
  1. 이력 관리
    상태 변경 시 CT_OCCUPY_ITEM_HISTORY에 이벤트 별도 기록

6. 기타

  • 컬럼 명은 모두 대문자 언더바 스네이크 케이스 적용
  • 사용자 ID 컬럼 길이 40은 충분하나 실제 ID 정책에 따라 조정 가능
  • REG_USR_ID, REG_DT: 최초 등록자 및 일시
  • UPDT_USR_ID, UPDT_DT: 최신 변경자 및 일시


게시됨

카테고리

작성자

태그: