UML : Flow Chart & Sequence Diagrams - leonroars/slam GitHub Wiki

Chapter 3. UML(Unified Modeling Language)

I. Flow Chart

flowchart TD
    A1["곡연 선택"] --> B1["μ˜ˆμ•½ κ°€λŠ₯ λ‚ μ§œ 쑰회"]
    B1 --> C1{"λ‚ μ§œ 선택 κ°€λŠ₯ μ—¬λΆ€"}
    C1 -- "κ°€λŠ₯" --> D1["νŠΉμ • λ‚ μ§œ 선택"]
    C1 -- "λΆˆκ°€λŠ₯" --> B1

    D1 --> E1["λŒ€κΈ°μ—΄ 토큰 생성"]
    E1 --> F1["λŒ€κΈ° μƒνƒœ 확인 (폴링 μ‹œμž‘)"]
    F1 --> G1{"차둀인가?"}
    G1 -- "μ•„λ‹ˆμ˜€" --> F1
    G1 -- "예" --> H1["μ˜ˆμ•½ κ°€λŠ₯ μ’Œμ„ 쑰회"]
    H1 --> I1["μ’Œμ„ 선택"]
    I1 --> J1["μ’Œμ„ μ˜ˆμ•½ μš”μ²­"]
    J1 --> K1["결제(포인트 차감)"]
    K1 --> L1{"결제 성곡?"}
    L1 -- "예" --> M1["μ˜ˆμ•½ μ™„λ£Œ"]
    L1 -- "μ•„λ‹ˆμ˜€" --> N1["결제 μ‹€νŒ¨ 처리"]
    
    %% 뢀가적인 이벀트
    N1 --> O1["포인트 μΆ©μ „ λ˜λŠ” μ’Œμ„ μž¬μ„ νƒ"]
    O1 --> H1

    %% μ„€λͺ…을 μœ„ν•œ λ…ΈνŠΈ
    style A1 fill:#f9f,stroke:#333,stroke-width:2px
    style M1 fill:#0f0,stroke:#333,stroke-width:2px
    style N1 fill:#f66,stroke:#333,stroke-width:2px

II. API 별 Sequence Diagram

1. μ˜ˆμ•½ κ°€λŠ₯ λ‚ μ§œ 쑰회 API

sequenceDiagram
    participant User as μ‚¬μš©μž
    participant DatePage as "μ˜ˆμ•½ κ°€λŠ₯ λ‚ μ§œ 쑰회 νŽ˜μ΄μ§€"
    participant SeatAPI as "μ§€μ • λ‚ μ§œ μ˜ˆμ•½ κ°€λŠ₯ μ’Œμ„ 쑰회 API"
    participant ScheduleDB as "곡연일정 ν…Œμ΄λΈ”(DB)"

    User->>DatePage: 곡연 선택 ν›„ μ˜ˆμ•½ κ°€λŠ₯ λ‚ μ§œ 쑰회 μš”μ²­
    DatePage->>SeatAPI: μ§€μ • λ‚ μ§œ μ˜ˆμ•½ κ°€λŠ₯ μ’Œμ„ 쑰회 API 호좜
    SeatAPI->>ScheduleDB: 곡연 일정 확인 (곡연 ID)
    ScheduleDB-->>SeatAPI: μ˜ˆμ•½ κ°€λŠ₯ λ‚ μ§œ λͺ©λ‘ λ°˜ν™˜
    SeatAPI-->>DatePage: μ˜ˆμ•½ κ°€λŠ₯ λ‚ μ§œ λͺ©λ‘ 응닡
    DatePage-->>User: μ˜ˆμ•½ κ°€λŠ₯ λ‚ μ§œ ν‘œμ‹œ

2.λŒ€κΈ° μƒνƒœ 확인 API : λŒ€κΈ°μ—΄ 졜초 μ§„μž… μ‹œμ 

sequenceDiagram
    participant User as μ‚¬μš©μž
    participant WaitAPI as "λŒ€κΈ° μƒνƒœ 확인 API"
    participant TokenCreate as "토큰 생성 λͺ¨λ“ˆ"
    participant WaitTokenDB as "λŒ€κΈ° μƒνƒœ 토큰 ν…Œμ΄λΈ”(DB)"
    participant Queue as "λŒ€κΈ°μ—΄ λͺ¨λ“ˆ"

    User->>WaitAPI: λŒ€κΈ° μƒνƒœ 확인 μš”μ²­ (선택 λ‚ μ§œ)
    alt 쿠킀에 토큰이 μ—†μŒ
        WaitAPI->>TokenCreate: 토큰 생성 μš”μ²­ (μ‚¬μš©μž ID, 곡연 ID, λ‚ μ§œ)
        TokenCreate->>WaitTokenDB: μƒˆλ‘œμš΄ 토큰 μ €μž₯
        WaitTokenDB-->>TokenCreate: 토큰 생성 μ™„λ£Œ
        TokenCreate-->>WaitAPI: 토큰 ID λ°˜ν™˜
        WaitAPI->>User: 쿠킀에 토큰 ID μ„€μ • + λŒ€κΈ° μƒνƒœ 응닡
    else 쿠킀에 토큰이 있음
        WaitAPI->>Queue: λŒ€κΈ° 순번 확인 (토큰 ID)
        Queue-->>WaitAPI: ν˜„μž¬ λŒ€κΈ° 순번 및 μƒνƒœ
        WaitAPI-->>User: λŒ€κΈ° 순번 및 μƒνƒœ 응닡
    end

3. λŒ€κΈ° μƒνƒœ 확인 API : 폴링 및 토큰 μœ νš¨μ„± 검증

sequenceDiagram
    participant User as μ‚¬μš©μž
    participant WaitAPI as "λŒ€κΈ° μƒνƒœ 확인 API"
    participant Queue as "λŒ€κΈ°μ—΄ λͺ¨λ“ˆ"
    participant TokenVerify as "토큰 검증 λͺ¨λ“ˆ"
    participant ActiveTokenDB as "ν™œμ„±ν™” μƒνƒœ 토큰 ν…Œμ΄λΈ”(DB)"
    participant SeatPage as "μ§€μ • λ‚ μ§œ μ˜ˆμ•½ κ°€λŠ₯ μ’Œμ„ 쑰회 νŽ˜μ΄μ§€"

    %% 폴링 μ£ΌκΈ° μ„€μ • (1λΆ„)
    Note over User, WaitAPI: μ‚¬μš©μžλŠ” 1λΆ„ κ°„κ²©μœΌλ‘œ λŒ€κΈ° μƒνƒœλ₯Ό ν™•μΈν•©λ‹ˆλ‹€.

    loop λ§€ 1λΆ„λ§ˆλ‹€ 폴링
        User->>WaitAPI: λŒ€κΈ° μƒνƒœ μž¬ν™•μΈ μš”μ²­ (토큰 ID)
        WaitAPI->>Queue: ν˜„μž¬ 순번 확인 (토큰 ID)
        Queue-->>WaitAPI: 순번 및 μƒνƒœ λ°˜ν™˜
        alt 차둀인 경우
            WaitAPI->>TokenVerify: 토큰 μœ νš¨μ„± 검증 (토큰 ID)
            TokenVerify->>ActiveTokenDB: 토큰 μƒνƒœ 확인
            ActiveTokenDB-->>TokenVerify: ν™œμ„±ν™” μƒνƒœ λ°˜ν™˜
            TokenVerify-->>WaitAPI: μœ νš¨μ„± κ²°κ³Ό
            WaitAPI->>SeatPage: μ’Œμ„ 쑰회 νŽ˜μ΄μ§€λ‘œ Redirect (토큰 ID)
            Note right of SeatPage: 폴링 μ’…λ£Œ
        else μ°¨λ‘€κ°€ μ•„λ‹Œ 경우
            WaitAPI-->>User: 남은 λŒ€κΈ° 인원 정보 응닡
        end
        Note right of WaitAPI: 1λΆ„ ν›„ λ‹€μ‹œ 폴링 μ‹œμž‘
    end

4. μ§€μ • λ‚ μ§œ μ˜ˆμ•½ κ°€λŠ₯ μ’Œμ„ 쑰회 API

sequenceDiagram
    participant User as μ‚¬μš©μž
    participant SeatPage as "μ§€μ • λ‚ μ§œ μ˜ˆμ•½ κ°€λŠ₯ μ’Œμ„ 쑰회 νŽ˜μ΄μ§€"
    participant SeatAPI as "μ§€μ • λ‚ μ§œ μ˜ˆμ•½ κ°€λŠ₯ μ’Œμ„ 쑰회 API"
    participant TokenVerify as "토큰 검증 λͺ¨λ“ˆ"
    participant ActiveTokenDB as "ν™œμ„±ν™” μƒνƒœ 토큰 ν…Œμ΄λΈ”(DB)"
    participant SeatDB as "μ’Œμ„ ν…Œμ΄λΈ”(DB)"

    User->>SeatPage: μ’Œμ„ 쑰회 νŽ˜μ΄μ§€ 접속 (토큰 ID)
    SeatPage->>SeatAPI: μ§€μ • λ‚ μ§œ μ˜ˆμ•½ κ°€λŠ₯ μ’Œμ„ 쑰회 API 호좜 (토큰 ID, λ‚ μ§œ)
    SeatAPI->>TokenVerify: 토큰 μœ νš¨μ„± 검증 (토큰 ID)
    TokenVerify->>ActiveTokenDB: 토큰 μƒνƒœ 확인
    ActiveTokenDB-->>TokenVerify: ν™œμ„±ν™” μƒνƒœ λ°˜ν™˜
    TokenVerify-->>SeatAPI: μœ νš¨μ„± κ²°κ³Ό
    alt 토큰 μœ νš¨ν•œ 경우
        SeatAPI->>SeatDB: μ˜ˆμ•½ κ°€λŠ₯ μ’Œμ„ λͺ©λ‘ 쑰회 (λ‚ μ§œ)
        SeatDB-->>SeatAPI: μ˜ˆμ•½ κ°€λŠ₯ μ’Œμ„ λͺ©λ‘ λ°˜ν™˜
        SeatAPI-->>SeatPage: μ˜ˆμ•½ κ°€λŠ₯ μ’Œμ„ λͺ©λ‘ 응닡
        SeatPage-->>User: μ˜ˆμ•½ κ°€λŠ₯ μ’Œμ„ ν‘œμ‹œ
    else 토큰 λ¬΄νš¨ν•œ 경우
        SeatAPI-->>SeatPage: 토큰 무효 응닡
        SeatPage-->>User: λ‚ μ§œ 쑰회 νŽ˜μ΄μ§€λ‘œ Redirect
    end

5.μ’Œμ„ μ˜ˆμ•½ μš”μ²­ API

sequenceDiagram
    participant User as μ‚¬μš©μž
    participant ReserveAPI as "μ’Œμ„ μ˜ˆμ•½ μš”μ²­ API"
    participant TokenVerify as "토큰 검증 λͺ¨λ“ˆ"
    participant ActiveTokenDB as "ν™œμ„±ν™” μƒνƒœ 토큰 ν…Œμ΄λΈ”(DB)"
    participant TentativeDB as "κ°€μ˜ˆμ•½ μ’Œμ„ ν…Œμ΄λΈ”(DB)"
    participant PaymentAPI as "결제(포인트 차감) API"

    User->>ReserveAPI: μ’Œμ„ μ˜ˆμ•½ μš”μ²­ (토큰 ID, μ‚¬μš©μž ID, 곡연 ID, μ’Œμ„ ID)
    ReserveAPI->>TokenVerify: 토큰 μœ νš¨μ„± 검증 (토큰 ID)
    TokenVerify->>ActiveTokenDB: 토큰 μƒνƒœ 확인
    ActiveTokenDB-->>TokenVerify: ν™œμ„±ν™” μƒνƒœ λ°˜ν™˜
    TokenVerify-->>ReserveAPI: μœ νš¨μ„± κ²°κ³Ό
    alt 토큰 μœ νš¨ν•œ 경우
        ReserveAPI->>TentativeDB: κ°€μ˜ˆμ•½ μ’Œμ„ 등둝 (μ’Œμ„ ID, 5λΆ„ 타이머 μ„€μ •)
        TentativeDB-->>ReserveAPI: κ°€μ˜ˆμ•½ μ™„λ£Œ
        ReserveAPI-->>User: 결제 νŽ˜μ΄μ§€λ‘œ Redirect
    else 토큰 λ¬΄νš¨ν•œ 경우
        ReserveAPI-->>User: μ˜ˆμ•½ λΆˆκ°€ 응닡
    end

6. 결제(포인트 차감) API

sequenceDiagram
    participant User as μ‚¬μš©μž
    participant PaymentAPI as "결제(포인트 차감) API"
    participant UserDB as "μ‚¬μš©μž ν…Œμ΄λΈ”(DB)"
    participant SeatDB as "μ’Œμ„ ν…Œμ΄λΈ”(DB)"
    participant TentativeDB as "κ°€μ˜ˆμ•½ μ’Œμ„ ν…Œμ΄λΈ”(DB)"

    User->>PaymentAPI: 결제 μš”μ²­ (μ‚¬μš©μž ID, 곡연 ID, 곡연 λ‚ μ§œ, μ’Œμ„ ID)
    PaymentAPI->>UserDB: μ‚¬μš©μž 포인트 μž”μ•‘ 확인 (μ‚¬μš©μž ID)
    alt μž”μ•‘ >= μ’Œμ„ 가격
        PaymentAPI->>UserDB: 포인트 차감 (μ‚¬μš©μž ID, κΈˆμ•‘)
        PaymentAPI->>SeatDB: μ’Œμ„ μƒνƒœ λ³€κ²½ (μ’Œμ„ ID, μ˜ˆμ•½ μ™„λ£Œ)
        PaymentAPI->>TentativeDB: κ°€μ˜ˆμ•½ ν•΄μ œ (μ’Œμ„ ID)
        PaymentAPI-->>User: μ˜ˆμ•½ μ™„λ£Œ 응닡
    else μž”μ•‘ < μ’Œμ„ 가격
        PaymentAPI-->>User: 결제 μ‹€νŒ¨ 응닡
    end

7. 포인트 μΆ©μ „ API

sequenceDiagram
    participant User as μ‚¬μš©μž
    participant RechargeAPI as "포인트 μΆ©μ „ API"
    participant UserDB as "μ‚¬μš©μž ν…Œμ΄λΈ”(DB)"

    User->>RechargeAPI: 포인트 μΆ©μ „ μš”μ²­ (μ‚¬μš©μž ID, μΆ©μ „ κΈˆμ•‘)
    RechargeAPI->>UserDB: μ‚¬μš©μž 쑴재 μ—¬λΆ€ 확인 (μ‚¬μš©μž ID)
    alt μ‚¬μš©μž μ‘΄μž¬ν•˜λŠ” 경우
        RechargeAPI->>UserDB: ν˜„μž¬ 포인트 쑰회 (μ‚¬μš©μž ID)
        alt ν˜„μž¬ 포인트 + μΆ©μ „ κΈˆμ•‘ <= 1,000,000
            RechargeAPI->>UserDB: 포인트 μ—…λ°μ΄νŠΈ (μ‚¬μš©μž ID, μΆ©μ „ κΈˆμ•‘)
            UserDB-->>RechargeAPI: μ—…λ°μ΄νŠΈ μ™„λ£Œ
            RechargeAPI-->>User: μΆ©μ „ 성곡 응닡 (ν˜„μž¬ μž”μ•‘)
        else μ΅œλŒ€ ν•œλ„ 초과
            RechargeAPI-->>User: μΆ©μ „ μ‹€νŒ¨ 응닡 (ν˜„μž¬ μž”μ•‘ + 였λ₯˜ λ©”μ‹œμ§€)
        end
    else μ‚¬μš©μž μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 경우
        RechargeAPI-->>User: μΆ©μ „ μ‹€νŒ¨ 응닡 (였λ₯˜ λ©”μ‹œμ§€)
    end

8. 포인트 μž”μ•‘ 쑰회 API

sequenceDiagram
    participant User as μ‚¬μš©μž
    participant BalanceAPI as "포인트 μž”μ•‘ 쑰회 API"
    participant UserDB as "μ‚¬μš©μž ν…Œμ΄λΈ”(DB)"

    User->>BalanceAPI: 포인트 μž”μ•‘ 쑰회 μš”μ²­ (μ‚¬μš©μž ID)
    BalanceAPI->>UserDB: μ‚¬μš©μž 쑴재 μ—¬λΆ€ 확인 (μ‚¬μš©μž ID)
    alt μ‚¬μš©μž μ‘΄μž¬ν•˜λŠ” 경우
        BalanceAPI->>UserDB: 포인트 μž”μ•‘ 쑰회 (μ‚¬μš©μž ID)
        UserDB-->>BalanceAPI: 포인트 μž”μ•‘ λ°˜ν™˜
        BalanceAPI-->>User: 포인트 μž”μ•‘ 응닡
    else μ‚¬μš©μž μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 경우
        BalanceAPI-->>User: 쑰회 μ‹€νŒ¨ 응닡 (였λ₯˜ λ©”μ‹œμ§€)
    end