- 팀원들간 TDD 이해도를 높이기 위해 만든 연습 Repository입니다.
- Java 11
- Spring Boot 2.7.14
- 해당 repository을 fork 합니다.
- 각자 fork받은 본인의 Repository에서 TDD를 활용 해 제공된 요구사항들을 처리합니다.
- 단, 본인의 TDD 스타일을 설명하기 위해 TDD의 Step별로 Commit을 해주시길 바랍니다.
- 커밋은 다른 팀원들이 이해하기 쉽게 상세하게 작성합시다.
- 메인 repository로 PR을 신청합니다.
- 팀원들의 Commit Log를 살펴보고 의견을 나눕니다.
- 모든 도메인 엔티티들은
생성 일시(createdAt)
와최종 수정 일시(lastModifiedAt)
을 가지고 있어야 합니다. lastModifiedAt
을 제외하고는 모두 Not-Null 제약조건을 지켜야 합니다. (편의성을 위해 Null 제약조건은 작성하지 않았습니다.)
- Datasource 설정정보를 입력해야 합니다.
application.yaml
에 각자 설정정보를 입력합시다.- 혹시 원격 DB (AWS의 RDS 등)을 사용한다면 gitignore을 필수적으로 합시다.
├── controller
│ └── UserController.java
├── domain
│ ├── User.java
│ ├── UserLevel.java
│ └── UserType.java
├── repository
│ └── UserRepository.java
└── service
└── UserService.java
- 모든 도메인 패키지 구조는 다음을 따릅니다. (예시 :
user
도메인) - 각 패키지 내부의 클래스들은 예시일 뿐 얼마든지 클래스를 추가로 생성하셔도 됩니다.
변수명 | 필드명 | 설명 |
---|---|---|
id | 사용자 아이디 | 사용자 엔티티 식별자 |
username | 사용자 아이디 | 사용자 로그인 아이디 |
password | 사용자 비밀번호 | 사용자 비밀번호 |
nickname | 사용자 닉네임 | 사용자 닉네임 |
userLevel | 사용자 등급 | 사용자 등급 |
type | 사용자 유형 | 사용자 유형으로 ADMIN, USER가 존재 |
createdAt | 생성 일시 | 사용자 최초 생성 일시 |
lastModifiedAt | 최종 수정 일시 | 사용자 최종 수정 일시 |
- 사용자는
회원가입
이 가능합니다.- 회원가입은 아이디, 비밀번호, 비밀번호 재확인, 닉네임을 입력해야 합니다..
- 사용자는
로그인
을 할 수 있습니다.- 로그인은 아이디와 비밀번호를 비교합니다.
- 사용자 별로
등급(level)
이 존재합니다.- 초기 사용자의 레벨은 BRONZE입니다.
- BRONZE, SILVER, GOLD가 존재하며 추후 주문 시 결제 금액 할인이 가능합니다.
- 5번 구매를 하면 SILVER, 10번 구매를 하면 GOLD로 등급업이 됩니다.
- 사용자 별
타입(type)
이 존재합니다.- USER : 일반유저
- ADMIN : 관리자
변수명 | 필드명 | 설명 |
---|---|---|
id | 상품 아이디 | 상품 엔티티 식별자 |
name | 상품명 | 상품의 이름 |
price | 상품 가격 | 상품의 가격 |
amount | 상품 재고 | 상품의 재고 |
sellingStatus | 상품 상태 | 상품의 판매 상태 |
createdAt | 생성 일시 | 상품의 최초 생성 일시 |
lastModifiedAt | 최종 수정 일시 | 상품의 최종 수정 일시 |
- 상품명과 가격은 중복될 수 있습니다.
- 상품에는 재고수량이 정해져 있어 모든 재고 소모 시 주문이 불가능해야 합니다.
- 상품 판매 상태(
SellingStatus
)가 존재합니다.- SELLING : 상품을 판매하는 중이며 사용자는 상품을 주문할 수 있습니다.
- STOP_SELLING : 상품 판매가 중지된 상태며, 사용자는 해당 상품을 주문할 수 없습니다.
변수명 | 필드명 | 설명 |
---|---|---|
id | 주문 아이디 | 주문 엔티티 식별자 |
userId | 유저 아이디 | 유저 엔티티 식별자 |
orderProducts | 주문 상품 정보 | 주문의 상품의 정보 |
price | 총 주문 가격 | 총 주문 가격 |
orderStatus | 주문 상태 | 주문 상태 |
createdAt | 생성 일시 | 주문의 최초 생성 일시 |
lastModifiedAt | 최종 수정 일시 | 주문의 최종 수정 일시 |
-
상품들을 주문하는 기능입니다.
-
사용자들은 로그인을 해야 주문을 할 수 있습니다.
-
상품의 재고가 존재해야 주문을 할 수 있습니다.
-
상품은 여러가지를 주문 할 수 있습니다.
OrderProduct
를 확인해주세요. -
최종적으로 상품의 가격을 정해야 합니다.
- 상품의 가격은 기본적으로
주문 상품 가격 X 주문 상품 수
의 합으로 이루어집니다. - 최종 가격에서 사용자 등급별로 할인이 이루어집니다.
- SILVER : 5% 할인
- GOLD : 10% 할인
- 상품의 가격은 기본적으로
-
주문 상태를 확인할 수 있습니다.
- INIT : 주문 생성 (주문 최초 생성 시 적용되는 상태로 가정)
- CANCELED : 주문 취소 (사용자가 주문을 취소할 때의 상태로 가정)
- 관리자는 CANCELED 상태에서 주문 승인을 할 수 없습니다..
- CANCLED 에서 INIT으로 상태변경이 불가능합니다.
- COMPLETE : 처리 완료 (관리자가 주문을 승인했을 때의 상태로 가정)
- 사용자는 COMPLETE 상태에서 주문 취소를 할 수 없습니다.
- COMPLETE 에서 INIT으로 상태변경이 불가능합니다.
-
상품 총 가격은 다음 식을 만족합니다. 상품 총 가격 = (상품 가격 X 주문 수)
변수명 | 필드명 | 설명 |
---|---|---|
id | 상품 아이디 | 상품 엔티티 식별자 |
productId | 상품 아이디 | 상품 엔티티 식별자 |
orderId | 주문 아이디 | 주문 엔티티 식별자 |
amount | 상품 수 | 주문할 상품의 갯수 |
createdAt | 생성 일시 | 주문의 최초 생성 일시 |
lastModifiedAt | 최종 수정 일시 | 주문의 최종 수정 일시 |
- 상품과 주문을 잇기 위한 중간클래스입니다. (M:M 논리적 구조를 1:M으로 분해하기 위한 클래스)
- Order : OrderProduct 는 1:M 관계입니다.
- Product : OrderProduct 는 1:M 관계입니다.
- 주문한 갯수만큼 OrderProduct.amount에 추가됩니다.