꾸준히하자아자

카카오 쇼핑하기 클론프로젝트 #1 본문

프로젝트/카카오 쇼핑하기 web

카카오 쇼핑하기 클론프로젝트 #1

성장하고픈개발자 2023. 7. 2. 21:57
728x90
728x90

1. 요구사항 시나리오를 보고 부족해 보이는 기능을 하나 이상 체크하여 README에 내용을 작성하시오.

  • 화면 UI에 있는 톡딜가로 구매하기 기능
  • 회원정보를 수정하는 기능
  • 개별 상품마다 별점을 표기하는 기능
  • (매진임박일때) 각 옵션별 남은 수량, 품절여부를 보여주는 기능 
  • 상품을 카테고리 형태로 볼 수 있는 기능
  • 장바구니 조회 (수량 결정)에서 상품을 삭제하거나 특정 옵션을 삭제하는 기능
  • 배송 관련 기능
  • 결제하기 단계에서 쿠폰이나 상품권을 사용할 수 있는 기능

2. 제시된 화면 설계를 보고 해당 화면설계와 배포된 기존 서버의 API주소를 매칭하여 README에 내용을 작성하시오.

● (기능 1) 회원 가입

  • 회원가입 버튼 클릭 시 : (/join) POST 요청
  • 이메일 중복 체크를 해줘야 한다. (/check) POST 요청

● (기능 2) 로그인 

  • 로그인 버튼 클릭 시 : (/login) POST 요청
  • 회원 정보를 저장해둔 데이터베이스를 검색하여 해당 사용자가 유효한 사용자인지 판단하고 유효한 사용자일 경우 JWT Token을 반환한다.

● (기능 3) 로그아웃

  • 로그아웃은 프론트에서 처리

● (기능 4) 전체 상품 목록 조회 

  • (/products?page={number}) GET 요청
  • 전체 상품 목록 페이지에 들어가면 API를 호출하여 page값에 따라 상품의 데이터를 보여준다.
  • 추후에 판매자가 새로운 상품을 등록하고 싶을 때 상품등록 API가 필요할 것 같다.

● (기능 5) 개별 상품 상세 조회 

  •  (/products/{id}) GET 요청
  • 개별 상품 페이지에 들어가면 해당 API를 호출하여 상품의 데이터를 보여준다.

● (기능 6) 상품 옵션 선택

이미 선택된 옵션은 다시 선택이 불가능하게 해야한다.


● (기능 7) 옵션 확인 및 수량 결정

선택한 상품 옵션을 재확인하고 수량을 결정한다. 선택한 옵션과 수량에 따라 합계 금액이 출력된다.


● (기능 8) 장바구니 담기

  • (/carts/add) POST 요청
  • 장바구니 담기 버튼 클릭 시 옵션의 id와 갯수가 저장된다.

● (기능 9) 장바구니 보기 (조회)

  • (/carts) GET 요청
  • 장바구니에 담았던 상품들의 옵션과 갯수 정보를 출력하는 API를 호출한다.

● (기능 10) 장바구니 상품 옵션 확인 및 수량 결정 (주문하기 - 장바구니 수정)

  • (/carts/update) POST 요청
  • 장바구니에 담았던 옵션들의 수량을 수정할 수 있다.

● (기능 11) 결제

  • (/orders/save) POST 요청
  • 결제하기 버튼을 누르면 장바구니에 있는 물품들이 삭제된다. 그리고 주문아이템 테이블에 채워진다.


● (기능 12) 주문 결과 확인

  • (/orders/{order_id}) GET 요청
  • 결제가 된 상품명, 주문번호, 옵션 이름을 출력하는 API를 호출한다.

3. 응답 데이터 확인하면서 시나리오에 부족한 데이터 확인

 

/carts/update (POST)

  • 주문하기 - (장바구니 수정)에서 장바구니에 담겨있는 물품들 수량 업데이트(줄이거나 늘리거나)할 때 이전에 6. 장바구니 담기 에서 담았던 물품들과의 cartId가 다르면 안된다.

(담았던 물품에 존재하지 않는 cartId를 수정하려고 했을 때)

{
    "success": false,
    "response": null,
    "error": {
        "message": "장바구니에 없는 상품은 주문할 수 없습니다 : 3",
        "status": 400
    }
}

 

  • 주문하기 - (장바구니 수정)에서 두 물품의 cartId가 같은 경우
{
    "success": false,
    "response": null,
    "error": {
        "message": "동일한 장바구니 아이디를 주문할 수 없습니다",
        "status": 400
    }
}

/orders/save (POST)

  • 결제하기 (주문 인서트)에서 장바구니에 있던 물품들을 모두 결제하고 (POST 요청 보냄) 또 다시 요청을 보내면 장바구니에 아무 내역이 존재하지 않는다는 시나리오가 필요하다.
{
    "success": false,
    "response": null,
    "error": {
        "message": "장바구니에 아무 내역도 존재하지 않습니다",
        "status": 404
    }
}

/orders/1 (GET)

  • 주문 결과 확인 에서 없는 주문을 요청하면 주문을 찾을 수 없다는 에러 메세지
{
    "success": false,
    "response": null,
    "error": {
        "message": "해당 주문을 찾을 수 없습니다 : 3",
        "status": 404
    }
}

4. 테이블 설계를 하여 README에 ER-Diagram을 추가하여 제출하시오.

 

-- -----------------------------------------------------
-- Table `kakao_shop`.`user`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `kakao_shop`.`user` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(45) NOT NULL,
  `email` VARCHAR(45) NOT NULL,
  `password` VARCHAR(45) NOT NULL,
  `date` DATETIME NULL DEFAULT NULL,
  PRIMARY KEY (`id`))

-- -----------------------------------------------------
-- Table `kakao_shop`.`product`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `kakao_shop`.`product` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(45) NOT NULL,
  `image` VARCHAR(45) NULL,
  `price` INT NULL DEFAULT NULL,
  `date` DATETIME NULL DEFAULT NULL,
  PRIMARY KEY (`id`))

-- -----------------------------------------------------
-- Table `kakao_shop`.`options`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `kakao_shop`.`options` (
  `id` INT NOT NULL,
  `name` VARCHAR(45) NOT NULL,
  `price` INT NOT NULL,
  `date` DATETIME NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  CONSTRAINT `product_id`
    FOREIGN KEY (`id`)
    REFERENCES `kakao_shop`.`product` (`id`))

-- -----------------------------------------------------
-- Table `kakao_shop`.`cart`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `kakao_shop`.`cart` (
  `cart_id` INT NOT NULL AUTO_INCREMENT,
  `quantity` VARCHAR(45) NOT NULL,
  `user_id` INT NOT NULL,
  `options_id` INT NOT NULL,
  PRIMARY KEY (`cart_id`),
  INDEX `fk_cart_user1_idx` (`user_id` ASC) VISIBLE,
  INDEX `fk_cart_options1_idx` (`options_id` ASC) VISIBLE,
  CONSTRAINT `fk_cart_user1`
    FOREIGN KEY (`user_id`)
    REFERENCES `kakao_shop`.`user` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_cart_options1`
    FOREIGN KEY (`options_id`)
    REFERENCES `kakao_shop`.`options` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)

-- -----------------------------------------------------
-- Table `kakao_shop`.`order`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `kakao_shop`.`order` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `user_id` INT NOT NULL,
  PRIMARY KEY (`id`),
  INDEX `fk_order_user1_idx` (`user_id` ASC) VISIBLE,
  CONSTRAINT `fk_order_user1`
    FOREIGN KEY (`user_id`)
    REFERENCES `kakao_shop`.`user` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)

-- -----------------------------------------------------
-- Table `kakao_shop`.`order_item`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `kakao_shop`.`order_item` (
  `id` INT NOT NULL,
  `quantity` INT NOT NULL,
  `price` INT NOT NULL,
  PRIMARY KEY (`id`),
  CONSTRAINT `fk_option_id`
    FOREIGN KEY (`id`)
    REFERENCES `kakao_shop`.`options` (`id`),
  CONSTRAINT `fk_order_id`
    FOREIGN KEY (`id`)
   REFERENCES `kakao_shop`.`order` (`id`))

728x90
728x90