Sunmon / hh-plus-3-commerce

e-커머스 상품 주문 서비스
0 stars 0 forks source link

hh-plus-3-commerce

e-커머스 상품 주문 서비스

기능 목록

고도화

마일스톤

4주차 (10/13 ~ 10/18) - 4.5MD <기본 기능 구현>

5주차 (10/20~ 10/26) - 4MD <고도화>

상품 주문 API 시퀀스 다이어그램

sequenceDiagram
    actor User
    participant Order_Server
    participant Order_DB
    participant Pay_Server
    participant Pay_DB
    participant External_Server
    User->>+Order_Server: 상품 주문 (유저id, 상품id, 수량)
    Order_Server->>+Order_DB: 상품 정보 조회
    Order_DB-->>-Order_Server: 상품 정보 리턴(상품 id, 가격, 재고)
    opt 존재하지 않는 상품
    Order_Server-->>User: 오류 응답 반환 (존재하지 않는 상품)
    end
    opt 재고 부족
    Order_Server->>User: 오류 응답 반환 (재고부족)
    end
    Order_Server-->> Order_Server: 결제 금액 계산
    Order_Server->>+Pay_Server: 결제 요청(유저id, 결제금액)
    Pay_Server->>+Pay_DB: 사용자 정보 조회(유저id)
    Pay_DB-->>-Pay_Server: 사용자 정보 리턴(유저id, 계좌잔액)
    Pay_Server-->>Pay_Server: 결제후 잔액 계산
    opt 잔액부족
    Pay_Server-->>Order_Server: 오류 응답 반환(잔액부족)
    Order_Server-->>User: 오류 응답 반환(잔액부족)
    end
    Pay_Server->>+Pay_DB: 사용자 정보 업데이트(유저id, 계좌잔액)
    Pay_DB-->>-Pay_Server: 업데이트 결과 반환(유저id, 계좌잔액)
    opt  업데이트 실패
    Pay_Server->>Order_Server: 오류 응답 반환(계좌 업데이트 실패)
    Order_Server->>User: 오류 응답 반환(결제 실패)
    end
    Pay_Server->>+Pay_DB: 사용자 결제 히스토리 추가(유저id, 결제금액)
    Pay_DB-->>-Pay_Server: 사용자 결제 히스토리 추가 결과 리턴
    opt 히스토리 추가 실패
    Pay_Server->>Order_Server: 오류 응답 반환 (히스토리 추가 실패)
    Order_Server->>User: 오류 응답 반환(결제 실패)
    end
    Pay_Server-->>-Order_Server: 사용자 정보 리턴(유저 id, 잔액)
    Order_Server->>Order_DB: 상품 업데이트(상품id, 상품재고)
    Order_DB-->>Order_Server: 상품 업데이트 결과 반환
    opt 상품 업데이트 실패
    Order_Server-->User: 오류 응답 반환(주문 실패)
    end
    Order_Server->>Order_DB: 주문 히스토리 추가(유저id, 상품id, 주문개수)
    Order_DB-->>Order_Server: 주문 히스토리 추가 결과 반환
    opt 히스토리 추가 실패
    Order_Server-->User: 오류 응답 반환(주문 실패)
    end
    Order_Server-->External_Server: 주문 완료 API 호출 (유저id, 상품id, 주문개수)
    External_Server-->Order_Server: 응답 리턴(주문완료)
    Order_Server-->-User: 응답 리턴(유저id, 상품id, 수량)

ERD

https://github.com/Sunmon/hh-plus-3-commerce/issues/12 에 업로드 해두었습니다.

기본 패키지 구조

도메인별로 묶는 형식을 사용한다.

레이어별로 나누는 형식은 (Controller, Service, Repository, Model) 파일을 찾아보기 어려웠다.

따라서 어떤 기능이 구현되었는지 직관적으로 알아볼 수 있도록 도메인별로 묶어 관리한다.

또한 추후 서비스를 분리하거나 확장이 필요할 때 도메인째로 분리하면 되기 때문에 유리할 것이다.

--- src
    ├── domain
    │   ├── Account
    │   │   ├── AccountController
    │   │   ├── AccountService
    │   │   ├── AccountRepository
    │   │   ├── AccountEntity
    │   │   └── dto
    │   │       └── Account
    │   └── Payment
    │       ├── ...

기술 스택

API 명세

Swagger

상품 정보 조회 (GET /api/v1/products/{id})

•   200 상품 정보 조회 성공
•   404 상품을 찾을 수 없음
•   500 상품 정보 조회 실패

상품 주문/결제 (POST /api/v1/products/{id}/orders)

•   200 주문 성공
•   400 잘못된 파라미터
•   422 잔액 부족
•   422 상품 재고 부족
•   500 주문 실패

상위 상품 조회 (GET /api/v1/products/top)

•   200 인기상품 조회 성공
•   500 인기상품 조회 실패

유저 잔액 조회 (GET /api/v1/users/{id}/balance)

•   200 잔액 조회 성공
•   404 잘못된 파라미터
•   500 잔액 조회 실패

유저 잔액 충전 (POST /api/v1/users/{id}/balance)

•   200 잔액 충전 성공
•   400 잘못된 파라미터
•   500 잔액 충전 실패