프로젝트/도서구매사이트

1015 도서구매 사이트 REST API 및 ERD 설계

thinktank911 2025. 10. 14. 18:38

회원 API

 1. 회원가입

Method POST
URI /join
HTTP status code 성공 201
Request Body {
    email: ‘사용자가 입력 이메일’,
    password: ‘사용자가 입력 비밀번호’
}
Response Body  

 

 2. 로그인

Method POST
URI /login
HTTP status code 성공 200
Request Body {
    email: ‘사용자가 입력 이메일’,
    password: ‘사용자가 입력 비밀번호’
}
Response Body JWT Token

 

3. 비밀번호 초기화 요청

Method POST
URI /reset
HTTP status code 성공 200
Request Body {
    email: ‘사용자가 입력 이메일’,
}
Response Body  

 

4. 비밀번호 초기화 (=수정)

Method PUT
URI /reset
HTTP status code 성공 200
Request Body {
    password: ‘사용자가 입력 비밀번호’
}
Response Body  

 

[DB 회원 테이블 구조]

 

dbdiagram.io - Database Relationship Diagrams Design Tool

 

dbdiagram.io

 

// 회원
Table users {
  id integer [primary key]
  email varchar
  password varchar
}

도서 API

1. 전체 도서 조회

  • 추가 고려 사항 : 이미지 경로, 8개씩 보내줘야함
Method GET
URI /books
HTTP status code 성공 200
Request Body  
Response Body [
  {
    id : 도서 id,
    title: ‘도서 제목’,
    summary: ‘요약 설명’,
    author: ‘도서 작가’,
    price: ‘가격’,
    likes: ‘좋아요 수’,
    pubDate: ‘출간일’,
  },
  {
    id : 도서 id,
    title: ‘도서 제목’,
    summary: ‘요약 설명’,
    author: ‘도서 작가’,
    price: ‘가격’,
    likes: ‘좋아요 수’,
    pubDate: ‘출간일’,
  },
  ...
]

 

2. 개별 도서 조회

  • 추가 고려 사항 :  이미지 경로
Method GET
URI /books/{bookid}
HTTP status code 성공 200
Request Body  
Response Body {
  id : 도서 id,
  title: ‘도서 제목’,
  category: ‘카테고리’,
  format: ‘포맷’,
  isbn: ‘isbn’,
  summary: ‘요약 설명’,
  description: ‘상세 설명’,
  author: ‘도서 작가’,
  pages: ‘쪽 수’,
  index: ‘목차’,
  price: ‘가격’,
  likes: ‘좋아요 수’,
  liked: boolean,
  pubDate: ‘출간일’,
}

 

3. 카테고리별 도서 목록 조회

  • new : true => 신간 조회(기준 : 출간일 30일 이내)
  • 추가 고려 사항 : 이미지 경로, 8개씩 보내줘야함
                             카테고리 id 어떻게 알고 보내줄까?
Method GET
URI /books?categoryId={categoryId}&new={boolean}
HTTP status code 성공 200
Request Body  
Response Body [
  {
    id : 도서 id,
    title: ‘도서 제목’,
    summary: ‘요약 설명’,
    author: ‘도서 작가’,
    price: ‘가격’,
    likes: ‘좋아요 수’,
    pubDate: ‘출간일’,
  },
  {
    id : 도서 id,
    title: ‘도서 제목’,
    summary: ‘요약 설명’,
    author: ‘도서 작가’,
    price: ‘가격’,
    likes: ‘좋아요 수’,
    pubDate: ‘출간일’,
  },
  ...
]

 

 

[DB 도서 테이블 구조]

 

// 도서
Table books {
  id integer [primary key]
  title varchar
  category varchar
  format varchar
  isbn  varchar
  summary text
  description text
  author varchar
  pages integer
  index text
  price integer
  likes integer
  pubDate timestamp
}

좋아요 API

1. 좋아요 추가

Method POST
URI /likes/{bookId}
HTTP status code 성공 200
Request Body  
Response Body  

 

2. 좋아요 취소

Method DELETE
URI /likes/{bookId}
HTTP status code 성공 200
Request Body  
Response Body  

 

[DB 좋아요 테이블 구조]

  • 좋아요 테이블을 별도 분리해 회원이 좋아요를 누르면 해당 회원id에 좋아요 누른 book_id가 매핑되어 데이터 생성 즉, insert되는 구조로 만든다.
  • 좋아요 취소 시 해당 테이블의 데이터를 delete한다.
// 좋아요
Table likes {
  user_id integer
  liked_book_id integer
  created_at timestamp
}

장바구니 API

1. 장바구니 담기

Method POST
URI /cart
HTTP status code 성공 201
Request Body {
    id : 도서 id,
    count: 수량,
}
Response Body  

 

2. 장바구니 조회

Method GET
URI /cart
HTTP status code 성공 200
Request Body  
Response Body [
  {
    cartItemId: 장바구니 도서 id,
    id : 도서 id,
    title: ‘도서 제목’,
    summary: ‘요약 설명’,
    price: ‘가격’,
    count: 수량,
  },
  {
    cartItemId: 장바구니 도서 id,
    id : 도서 id,
    title: ‘도서 제목’,
    summary: ‘요약 설명’,
    price: ‘가격’,
    count: 수량,
  },
  ...
]

 

3. 장바구니 도서 삭제

Method DELETE
URI /cart/{bookId}
HTTP status code 성공 200
Request Body  
Response Body  

 

4. 장바구니에서 선택한 주문 예상 상품 목록 조회

Method GET
URI /
HTTP status code 성공 200
Request Body [cartItemId, cartItemId, ...]
Response Body [
  {
    cartItemId: 장바구니 도서 id,
    id : 도서 id,
    title: ‘도서 제목’,
    summary: ‘요약 설명’,
    price: ‘가격’,
    count: 수량,
  },
  {
    cartItemId: 장바구니 도서 id,
    id : 도서 id,
    title: ‘도서 제목’,
    summary: ‘요약 설명’,
    price: ‘가격’,
    count: 수량,
  },
  ...
]

 

[DB 장바구니 테이블 구조]

  • 장바구니 테이블은 주문하는 책과 수량을 세트로 묶어 cart_item_id로 번호를 매긴 데이터 모음이라고 보면 된다. 
  • 장바구니에서 선택한 주문 예상 상품을 보려면 요청 바디에 [cartItemId, cartItemId, ...] 배열을 보내준다.
// 장바구니
Table cart_items {
  cart_item_id integer [primary key]
  book_id integer
  count integer
}

주문(결제) API

1. 결제/주문하기 insert

  • 추가 고려사항 : 결제와 동시에 장바구니에서 주문된 상품은 delete 하기
  • 장바구니에서 선택한 주문예상목록을 item으로 받아 요청바디에서 보내주고, 배송정보(delivery), totalPrice를 함께 보내준다.
Method POST
URI /orders
HTTP status code 성공 201
Request Body {
    //상품목록
    items : [{
         cartItemId: 장바구니 도서 id,
         bookId : 도서 id,
         count : 수량
    }, {
         cartItemId: 장바구니 도서 id,
         bookId : 도서 id,
         count : 수량
    }],
    //배송정보
    delivery : {
        address : “주소”,
        receiver : “이름”,
        contact : “010-0000-0000”
    }
    //총금액
    totalPrice: 총 금액
}
Response Body  

 

2. 주문 목록(내역) 조회

  • 요청 바디로 JWT(토큰) 보내주면 주문 내역을 배열로 받는다.
Method GET
URI /orders
HTTP status code 성공 200
Request Body 토큰
Response Body [
    {
        order_id : 주문 id,
        created_at : “주문일자”,
        delivery : {
            address : “주소”,
            receiver : “이름”,
            contact : “전화번호”
        },
        repBookTitle : “대표 책 제목”,
        totalPrice : 결제 금액,
        totalCount : 총 수량
    }
]

 

3. 주문 상세 상품 조회

  • order_id를 uri로 받아 orderedBook 테이블에 book_id 배열 가져와 책 정보를 응답해준다.
Method GET
URI /orders/{order_id}
HTTP status code 성공 200
Request Body  
Response Body [
    {
        bookId : 도서 id,
        bookTitle : “도서 제목”,
        author : “작가명”,
        price : 가격,
        count : 수량
    },
    {
        bookId : 도서 id,
        bookTitle : “도서 제목”,
        author : “작가명”,
        price : 가격,
        count : 수량
    },
]

 

[DB 배송정보, 주문한책, 주문내역 테이블 구조]

  • 배송정보 테이블을 별도 분리하여 일단 입력창에서 받는 값을 저장하기로 결정함
  • 주문 상세 상품 조회를 위해서 주문한책 정보를 저장하는 테이블 orderedBook  별도 분리
// 배송정보
Table delevery {
  id integer [primary key]
  address varchar
  receiver varchar
  contact varchar
}

// 주문한 책
Table orderedBook {
  order_id integer [primary key]
  book_id integer
  count integer
}

// 주문내역
Table orders {
  order_id integer [primary key]
  delivery_id integer
  total_price integer
  total_count integer
  rep_book_title varchar
  created_at timestamp
}