도서 쇼핑몰 API 설계 (8)

차재현·2024년 4월 15일
post-thumbnail

✔️ [변경 사항]

  1. 좋아요 API 기능 구현에 따른 좋아요 API 설계부분 내용 추가
  2. 좋아요 개수 출력 기능 구현에 따른 도서 API 설계부분 내용 추가
  3. 개별 도서 조회 API 설계에서 “좋아요를 했는지 여부” 확인 기능 구현에 따른 내용 추가


1. 회원 API 설계

  • 회원 가입 API
    • Method : POST
    • URL : /users/join
    • Request Body
      • JSON
        {
        	email : "사용자가 입력한 이메일",
        	password : "사용자가 입력한 비밀번호"
        }
    • Response
      • 201 : 로그인 페이지로 이동

  • 로그인 API
    • Method : POST
    • URL : /users/login
    • Request Body
      • JSON
        {
        	email : "사용자가 입력한 이메일",
        	password : "사용자가 입력한 비밀번호"
        }
    • Response Cookie
      • 200 : JWT Token

  • 비밀번호 초기화 요청 API ( = 신원확인)
    • Method : POST
    • URL : /users/reset
    • Request Body
      • JSON
        {
        	email : "사용자가 입력한 이메일"
        }
    • Response
      • 200
        • JSON
          {
          	email : "이메일"
          }
          • 인증을 위해 입력했던 이메일을 가지고 비밀번호 초기화 화면으로 이동

  • 비밀번호 초기화 API ( = 수정)
    • Method : PUT
    • URL : /users/reset
    • Request Body
      • JSON
        {
        	email : "이전 페이지에서 입력했던 이메일",
        	password : "사용자가 입력한 새로운 비밀번호"
        }
    • Response
      • 200 :

2. 도서 API 설계

  • 전체 도서 조회 API
    • Method : GET
    • URL : /books?limit={page 당 도서 개수}¤tPage={현재 page}
      • 페이징 기능 구현을 위해 limit, 현재 page 값을 URL로 받아오도록 한다.
      • offset = limit * (currentPage-1) 을 활용한다.
    • Request Body : X
    • Response (이미지 경로, n개씩 응답 → 2가지 고려해야 함.)
      • 200
        • JSON Array
          // 전체 도서 목록에는 도서의 상세 정보를 모두 포함합니다.
          // 필요한 데이터만 선별하여 구현 부탁드립니다.
          [
          	{
          		id : 도서 id,
          		title : "도서 제목",
          		img : 이미지 id (picsum image #num),
          		summary : "요약 설명",
          		author : "도서 작가",
          		price : 가격,
          		likes : 좋아요 수,
          		pubDate : 출간일
          	},
          	{
          		id : 도서 id,
          		title : "도서 제목",
          		summary : "요약 설명",
          		author : "도서 작가",
          		price : 가격,
          		likes : 좋아요 수,
          		pubDate : 출간일
          	},
          	...
          ]
          • 전체 도서 목록에서 개별 도서 조회 URL로 이동하기 위해서 각 도서 JSON마다 도서 id(book_id)를 가지고 있어야 한다.
          • 전체 도서 데이터를 DB에서 가지고 올 때, 도서들의 모든 정보를 가져오는 것으로 설계하였기 때문에 프론트엔드 개발자에게 전체 데이터중에 필요한 데이터만 사용하라고 알려주도록 한다.
          • (new)서브쿼리를 통해 BookController.js에서 sql을 수정해준것 만으로 좋아요 수도 응답할 수 있게 되었다.

  • 개별 도서 조회 API
    • Method : GET
    • URL : /books/:book_id
    • Request Body : X
    • Response(이미지 경로 → 고려해야 함)
      • 200
        • JSON
          {
          	id : 도서 id,
          	title : "도서 제목",
          	img : 이미지 id (picsum image #num),
          	category : "카테고리",
          	format : "포맷",
          	isbn : "isbn",
          	summary : "요약 설명",
          	description : "상세 설명",
          	author : "도서 작가",
          	pages : 쪽 수,
          	index : "목차",
          	price : 가격,
          	**likes : 좋아요 수,**
          ~~~~	**liked : boolean,**
          	pubDate : 출간일
          }
          • (new)서브쿼리를 통해 BookController.js에서 sql을 수정해준것 만으로 좋아요 수도 응답할 수 있게 되었다.
          • (new)SELECT EXISTS 쿼리를 통해 likes 테이블에 특정 유저가 특정 책을 좋아요 추가했는지에 대한 데이터가 존재하는지 확인하여 응답할 수 있게 되었다.

  • 카테고리 별 도서 목록 조회 API
    • Method : GET
    • URL : /books?category_id = {category_id}&news = {boolean}&limit={page 당 도서 개수}¤tPage={현재 page}
      • news = true 이면 카테고리 별 신간 조회 (기준 : 출간일(pubDate) 한 달 이내)
      • 페이징 기능 구현을 위해 limit, 현재 page 값을 URL로 받아오도록 한다.
      • offset = limit * (currentPage-1) 을 활용한다.
    • Request Body : X
    • Response (이미지 경로, n개씩 응답, 카테고리 아이디..? → 3가지 고려해야 함)
      • 200
        • JSON Array
          [
          	{
          		id : 도서 id,
          		title : "도서 제목",
          		img : 이미지 id (picsum image #num),
          		summary : "요약 설명",
          		author : "도서 작가",
          		price : 가격,
          		**likes : 좋아요 수,**
          		pubDate : 출간일
          	},
          	{
          		id : 도서 id,
          		title : "도서 제목",
          		img : 이미지 id (picsum image #num),
          		summary : "요약 설명",
          		author : "도서 작가",
          		price : 가격,
          		**likes : 좋아요 수,**
          		pubDate : 출간일
          	},
          	...
          ]
    • 전체 도서 조회 기능의 코드와 합쳐져있음을 인지하자.
    • 서브쿼리를 통해 BookController.js에서 sql을 수정해준것 만으로 좋아요 수도 응답할 수 있게 되었다.

3. 카테고리 API 설계 (카테고리 테이블 생성)

  • 카테고리 전체 조회 API
    • Method : GET
    • URL : /category
    • Request Body : X
    • Response
      • 200
        • JSON Array
          [
          	{
          		id = 카테고리 id,
          		name = 카테고리 이름
          	},{
          		id = 카테고리 id,
          		name = 카테고리 이름
          	},
          	...
          ]

4. 좋아요 API 설계 (좋아요 테이블을 새로 생성하여 관리)

  • 좋아요 추가 API
    • Method : POST
    • URL : /likes/:book_id
    • Request Body
      • 누가 좋아요를 눌렀는지 확인 필요
        1. 로그인할 때 받은 JWT (header “Authorization”)

        2. JWT의 PAYLOAD 값을 읽는다 = 사용자의 id값을 읽을 수 있다.

          // 일단은 토큰을 받아서 유저의 id값을 확인했다고 치고 기능구현을 진행한다.

    • Response
      • 200
  • 좋아요 취소 API
    • Method : DELETE
    • URL : /likes/:book_id
    • Request Body : X
    • Response
      • 200

5. 장바구니 API 설계

  • 장바구니 담기 API
    • Method : POST
    • URL : /carts
    • Request Body
      • JSON
        {
        	book_id : 도서 id,
        	count : 구매 수량
        }
    • Response
      • 201 :

  • 장바구니 조회 API
    • Method : GET
    • URL : /carts
    • Request Body : X
    • Response (이미지 경로 → 고려해야 함)
      • 201
        • JSON Array
          [
          	{
          		cartItem_id : 장바구니에 담긴 도서 id,
          		book_id : 도서 id,
          		title : "도서 제목",
          		summary : "도서 요약",
          		count : 구매 수량,
          		price : 가격
          	},
          	{
          		cartItem_id : 장바구니에 담긴 도서 id,
          		book_id : 도서 id,
          		title : "도서 제목",
          		summary : "도서 요약",
          		count : 구매 수량,
          		price : 가격
          	},
          	...
          ]

  • 장바구니 도서 개별 삭제 API
    • Method : DELETE
    • URL : /carts/:book_id
    • Request Body : X
    • Response
      • 200

  • (장바구니에서 선택한) 주문 “예상” 상품 목록 조회 API
    • Method : GET
    • URL : /…
    • Request Body
      • Array
        [ cartItem_id, cartItem_id, ... ]
    • Response (이미지 경로 → 고려해야 함)
      • 200
        • JSON Array
          [
          	{
          		cartItem_id : 장바구니에 담긴 도서 id,
          		book_id : 도서 id,
          		title : "도서 제목",
          		summary : "도서 요약",
          		count : 구매 수량,
          		price : 가격
          	},
          	{
          		cartItem_id : 장바구니에 담긴 도서 id,
          		book_id : 도서 id,
          		title : "도서 제목",
          		summary : "도서 요약",
          		count : 구매 수량,
          		price : 가격
          	},
          	...
          ]
    • 실제로 주문이 완료된게 아니라 주문 하기 전에 장바구니에 있는 물품 중에서 주문할 것들을 선택할 수 있도록 보여주는 것이기 때문에 주문 API에서 장바구니 API로 이동하였다.

6. 주문 API 설계

  • 결제 하기 API (= 주문 하기 = 주문 등록 = 주문 DB에 INSERT)
    • Method : POST
    • URL : /orders
    • Request Body
      • JSON
        {
            items : [{
        		    cartItem_id : 장바구니 도서 id,
        		    book_id : 도서 id,
        		    count : 수량
            },{
        		    cartItem_id : 장바구니 도서 id,
        		    book_id : 도서 id,
        		    count : 수량
            }, ...],
            delivery : {
        			  address : "주소",
        			  receiver : "이름",
        			  contact : "010-0000-0000"
        		},
        		totalPrice : 총 금액
        		// 결제방법은 보류
        }
        • 주문이 완료된 장바구니 상품은 DELETE 해야 한다.
    • Response
      • 200

  • 주문 목록(내역) 조회 API
    • Method : GET
    • URL : /orders
    • Request Body : X
    • Response
      • 200
        • JSON Array
          [
          		{
          				order_id : 주문 id,
          				create_at : "주문 일자",
          				delivery : {
          						address : "주소",
          						receiver : "이름",
          						contact : "전화번호"
          				},
          				bookTitle : "대표 책 제목",
          				totalPrice : 총 결제 금액,
          				totalCount : 총 수량	
          		},{
          				order_id : 주문 id,
          				create_at : "주문 일자",
          				delivery : {
          						address : "주소",
          						receiver : "이름",
          						contact : "전화번호"
          				},
          				bookTitle : "대표 책 제목",
          				totalPrice : 총 결제 금액,
          				totalCount : 총 수량
          		},
          		...
          ]

  • 주문 상품 상세 조회 API
    • Method : GET
    • URL : /orders/:order_id
    • Request Body : X
    • Response
      • 200
        • JSON Array
          [
          		{
          				book_id : 도서 id,
          				bookTitle : "도서 제목",
          				author : "작가명",
          				price : 가격,
          				count : 수량
          		},{
          				book_id : 도서 id,
          				bookTitle : "도서 제목",
          				author : "작가명",
          				price : 가격,
          				count : 수량
          		},
          		...
          ]
profile
Develop what? and why?

0개의 댓글