F&B 회원 관리 서비스입니다.
Springboot 기반의 애플리케이션을 직접 구현하며, 개발에 필요한 내용을 공부하고 마주한 문제를 고민하고 해결한 내용을 기록합니다.
기능이 추가되거나 개선된 내용은 꾸준히 업데이트 됩니다.
- F&B 회원의 적립 포인트를 관리하기 위한 서비스
- F&B 회원은 사용자의 휴대폰 전화번호 별로 하나의 바코드를 발급
- F&B 내 총 3가지 종류의 브랜드(MOONBUCKS, SEOULBAGUETTE, BURGERQUEEN)가 존재함
- 점포는 점포명과 위 3가지 브랜드 중 하나의 정보를 갖으며, 같은 브랜드 끼리는 적립금을 공유함
- 회원 바코드 정보 혹은 전화번호를 통해 가족 혹은 친구끼리 공유 가능
- 점포가 새로 개점하거나 폐업하는 경우, 그리고 브랜드를 변경하는 상황은 존재하지 않다고 가정
- F&B 회원이 회원 정보를 변경하거나 탈퇴하는 경우는 없으며 회원 정보의 제한된 유효기간 또한 존재하지 않음
-
회원 가입 API
- 회원 전화번호를 요청값으로 받음, 회원 가입 시 바코드를 발급함
- 전화번호는 10~11자리 문자열이며 010으로만 시작하며 유일함 (ex. 0101234567, 01012345678)
- 바코드는 12자리 숫자로된 문자열이며 유일하고, 바코드의 생성로직은 예측이 불가능해야함
- 이미 가입된 회원일 경우, 기존 바코드를 반환함
-
포인트 적립 API
- 적립 요청 시, 회원 정보(전화번호 or 바코드)와 점포 정보(ID) 그리고 적립 금액을 전달되어야 함
- 같은 브랜드의 점포는 브랜드별 적립금에 통합 적립이 가능함
- 올바르지 않은 회원 정보에 대한 오류 처리 (올바르지 않은 회원 오류 반환)
- 올바르지 않은 점포 정보에 대한 오류 처리 (올바르지 않은 점포 오류 반환)
-
포인트 사용 API
- 회원 정보(전화번호 or 바코드)와 점포 정보(ID) 그리고 사용할 적립 금액을 요청값으로 받음
- 같은 브랜드의 점포의 경우, 브랜드별 통합 적립금을 사용할 수 있음
- 적립금액을 초과하여 사용하는 경우, 포인트 부족 오류 처리
- 올바르지 않은 회원 정보에 대한 오류 처리 (올바르지 않은 회원 오류 반환)
- 올바르지 않은 점포 정보에 대한 오류 처리 (올바르지 않은 점포 오류 반환)
-
포인트 적립/사용 조회 API
- 회원 정보(전화번호 or 바코드)와 조회 기간(시작~종료)을 요청값으로 받음
- 요청 시간, 적립/사용 여부, 적립 점포명, 적립 브랜드명, 요청 포인트 금액을 응답값으로 전달
- 올바르지 않은 회원 정보에 대한 오류 처리 (올바르지 않은 회원 오류 반환)
- 여러 서버에서 여러 인스턴스를 통해 동작할 수 있어야 함
- 회원 정보(전화번호 or 바코드)는 공유가 가능하기 때문에 동시다발적으로 적립 및 사용 요청이 발생할 수 있음
자세한 내용은 🔗 entity_diagram_2023-04-09.md 파일을 참고하세요.
erDiagram
BRAND {
binary(16) brand_id PK
varchar(255) brand_name
datetime(6) created_at
}
MEMBER {
binary(16) member_id PK
varchar(12) barcode UK
varchar(11) phone UK
datetime(6) created_at
}
POINT_ORDER {
binary(16) point_order_id PK
binary(16) member_id
varchar(255) brand_name
varchar(255) store_name
varchar(255) type
bigint requested_point_amount
datetime(6) approved_at
}
STORE {
binary(16) store_id PK
binary(16) brand_id FK
varchar(255) store_name
datetime(6) created_at
}
POINT {
binary(16) point_id PK
binary(16) brand_id FK
binary(16) member_id FK
bigint amount
datetime(6) created_at
bigint version
}
POINT |o--|| BRAND : brand_id
POINT }o--|| MEMBER : member_id
STORE }o--|| BRAND : brand_id
Controller - Service - Repository 세 레이어의 위치한 클래스 관계를 나타냅니다.
자세한 내용은 🔗 class_diagram_2023-03-23.md 파일을 참고하세요.
classDiagram
%% Controller --> Service
MemberServiceController --> MemberService
PointOrderServiceController --> MemberService
PointOrderServiceController --> PointOrderService
RequestPointOrderServiceController --> RequestPointOrderService
%% Service --> Service
RequestPointOrderService --> MemberService
RequestPointOrderService --> StoreService
RequestPointOrderService --> PointService
RequestPointOrderService --> PointOrderService
%% Service --> Repository
MemberService --> MemberRepository
PointOrderService --> MemberRepository
PointOrderService --> PointRepository
PointOrderService --> StoreRepository
PointOrderService --> PointOrderRepository
PointService --> MemberRepository
PointService --> PointRepository
PointService --> BrandRepository
StoreService --> StoreRepository
class MemberServiceController
class PointOrderServiceController
class RequestPointOrderServiceController
class MemberService
class PointOrderService
class PointService
class RequestPointOrderService
class StoreService
class MemberRepository {
<<interface>>
}
class PointRepository {
<<interface>>
}
class PointOrderRepository {
<<interface>>
}
class BrandRepository {
<<interface>>
}
class StoreRepository {
<<interface>>
}
구현된 4 개의 API의 Sequence Diagram을 나타냅니다.
자세한 내용은 🔗 sequence_diagram-04-10.md 파일을 참고하세요.
프로젝트를 진행하며 기능을 추가하거나 코드를 개선한 내용을 작성한 문서입니다. 문제 상황에 대해서 고민하고 해결한 내용을 기록합니다.
자세한 내용은 아래 링크를 참고하세요.