회원 API
1. 회원 가입
| Method | POST |
| URI | /users/join |
| HTTP status code | 성공 201 |
| Request Body | { email : "사용가자 입력한 이메일", password : "사용자가 입력한 비밀번호" } |
| Response Body |
2. 로그인
| Method | POST |
| URI | /users//login |
| HTTP status code | 성공 200 |
| Request Body | { email : "사용가자 입력한 이메일", password : "사용자가 입력한 비밀번호" } |
| Response Cookie | JWT Token (문자열) |
3. 비밀번호 초기화 요청
비밀번호를 까먹었을 때 사용, 로그인 전에 사용
| Method | POST |
| URI | /reset |
| HTTP status code | 성공 200 |
| Request Body | { email : "사용자가 입력한 이메일" } |
| Response Body | { email : "이메일 (4번으로 연결)" } |
4. 비밀번호 초기화(=수정)
| Method | PUT |
| URI | /reset |
| HTTP status code | 성공 200 |
| Request Body | { email : "이전 페이지에서 입력했던 이메일", password : "사용자가 입력한 비밀번호" } |
| Response Body |
도서 API
1. 전체 도서 조회
//이미지 경로, n개씩 보내줘야함
| Method | GET |
| URI | /books?limit={page당 도서 수}¤tPage={현재 page} |
| HTTP status code | 성공 200 |
| Request Body | |
| Response Body | // 전체 도서 목록에서는 도서의 상세 정보를 포합합니다. // 필요한 데이터만 선별하여 구현 부탁드립니다. { books : [ { id : 도서 id, title : "도서 제목", img : 이미지 id(piksum image #id), summary : "요약 설명", author : "도서 작가", price : 가격, likes : 좋아요 수, pubDate : "출간일" }, { id : 도서 id, title : "도서 제목", img : 이미지 id(piksum image #id), summary : "요약 설명", author : "도서 작가", price : 가격, likes : 좋아요 수, pubDate : "출간일" } ], pagination : { currentPage : 현제 페이지, totalCount : 총 도서 수 } } |
2. 개별 도서 조회
//이미지 경로
| Method | GET |
| URI | /books/{bookId} |
| HTTP status code | 성공 200 |
| Request Body | |
| Response Body | { id : 도서 id, title : "도서 제목", img : 이미지 id, categoryName : "카테고리", format : "포맷", isbn : "isbn" summary : "요약 설명", detail : "상세 설명", author : "도서 작가", pages : 쪽 수, contents. "목차", price : 가격, likes : 좋아요 수, liked : boolean (로그인 상태에만 보내줌) pubDate : "출간일" } |
3. 카테고리별 도서 목록 조회
- new : true => 신간 조회 (기준: 출간일 1달 이내)
// 이미지 경로, 8개씩 보내줘야함
// 카테고리 id... 어떻게 알고 보내줄까?
| Method | GET |
| URI | /books?limit={page당 도서 수}¤tPage={현재 page}&categoryId={categoryId}&new={boolean} |
| HTTP status code | 성공 200 |
| Request Body | |
| Response Body | { books : [ { id : 도서 id, title : "도서 제목", img : 이미지 id(piksum image #id), summary : "요약 설명", author : "도서 작가", price : 가격, likes : 좋아요 수, pubDate : "출간일" }, { id : 도서 id, title : "도서 제목", img : 이미지 id(piksum image #id), summary : "요약 설명", author : "도서 작가", price : 가격, likes : 좋아요 수, pubDate : "출간일" } ], pagination : { currentPage : 현제 페이지, totalCount : 총 도서 수 } } |
카테고리 API
1. 카테고리 전체 조회
| Method | GET |
| URI | /category |
| HTTP status code | 성공 200 |
| Request Body | |
| Response Body | { { id : 0, name : "동화" }, { id : 1, name : "소설" } } |
좋아요 API
1. 좋아요 추가
| Method | POST |
| URI | /likes/{bookId} |
| HTTP status code | 성공 200 |
| Request Headers | "Authorization" : 로그인할때 받은 JWT Token(문자열) |
| Request Body | // 로그인 할 때 token 전달 > header 'Authorization' // payload 값을 읽을 수 있음 = 사용자의 id를 읽어낼 수 있음 |
| Response Body |
2. 좋아요 취소
| Method | DELETE |
| URI | /likes/{bookId} |
| HTTP status code | 성공 200 |
| Request Headers | "Authorization" : 로그인할때 받은 JWT Token(문자열) |
| Request Body | |
| Response Body |
장바구니 API
회원 1명당 - 장바구니 1개씩
1. 장바구니 담기
| Method | POST |
| URI | /cart |
| HTTP status code | 성공 201 |
| Request Headers | "Authorization" : 로그인할때 받은 JWT Token(문자열) |
| Request Body | { bookId: 도서 id, quantity : 수량, userId: 회원 id } |
| Response Body |
2. 내 장바구니 아이템 목록 조회 / 선택한 장바구니 상품 목록 조회
| Method | GET |
| URI | /cart |
| HTTP status code | 성공 200 |
| Request Headers | "Authorization" : 로그인할때 받은 JWT Token(문자열) |
| Request Body | 1) 내 장바구니 아이템 목록 조회 : Request Body 없음 2) 선택한 장바구니 상품 목록 조회 { selected : [cartItemId, cartItemId, ...] } |
| Response Body | { { id : 장바구니 도서 id, bookId : 도서 id, title: "도서 제목", summary : "도서 요약", quantity : 수량, price : 가격 }, { id : 장바구니 도서 id, bookId : 도서 id, title: "도서 제목", summary : "도서 요약", quantity : 수량, price : 가격 } } |
3. 장바구니 도서 삭제
| Method | DELETE |
| URI | /cart/{cartItemId} |
| HTTP status code | 성공 200 |
| Request Body | |
| Response Body |
결제(주문) API
1. 결제하기 = 주문하기 = 주문등록 = 데이터베이스 주문 insert
= 장바구니에서 주문된 상품은 delete
| Method | POST |
| URI | /orders |
| HTTP status code | 성공 200 |
| Request Headers | "Authorization" : 로그인할때 받은 JWT Token(문자열) |
| Request Body | { items : [장바구니 도서 id, 장바구니 도서 id ...], delivery : { (1) delivery insert address : "주소", receiver : "이름", contact : "010-0000-0000" } totalQuantity : 총 수량, (2) orders insert totalPrice : 총 금액, firstbookTitle : 대표 도서 제목 } |
| Response Body |
2. 주문 목록(내역) 조회
| Method | GET |
| URI | /orders |
| HTTP status code | 성공 200 |
| Request Header | "Authorization" : 로그인할때 받은 JWT Token(문자열) |
| Request Body | |
| Response Body | { { id : 주문 id createdAt : "주문일자" address : "주소", receiver : "이름", contact : "전화번호", bookTitle : "대표 책 제목", totalQuantity : 총 수량, totalPrice : 결제 금액, } } |
3. 주문 상세 상품 조회
| Method | GET |
| URI | /orders/{orderId} |
| HTTP status code | 성공 200 |
| Request Header | "Authorization" : 로그인할 때 받은 JWT Token(문자열) |
| Request Body | |
| Response Body | { { bookId : 도서 id, bookTtle : "도서 제목", author : "작가명", price : 가격, quantity: 수량, }, { bookId : 도서 id, bookTitle : "도서 제목", author : "작가명", price : 가격, quantity : 수량, } } |
ERD
Table users {
id integer [primary key]
email varchar
password varchar
}
Table books {
id integar [primary key]
title varchar
img integer
category_id integer
form varchar
isbn varchar
summary varchar
detail text
author varchar
pages integar
contents text
price integar
pub_date date
}
Table category {
category_id integer [primary key]
category_name varchar
}
Table likes {
user_id integer
liked_booked_id integer
}
Table cartItems {
id integer [primary key]
user_id integer
book_id integer
quantity integer
}
Table orders {
id integer [primary key]
book_title varchar
total_quantity integer
total_price integer
created_at timestamp
user_id integer
delivery_id integer
}
Table delivery {
id integar [primary key]
address varchar
receiver varchar
contact varchar
}
Table orderedBook{
id integer [primary key]
order_id integer
book_id integer
quantity integer
}
Ref: books.category_id > category.category_id
Ref: likes.user_id > users.id
Ref : likes.liked_booked_id > books.id
Ref : cartItems.book_id > books.id
Ref : cartItems.user_id > users.id
Ref: orders.delivery_id > delivery.id
Ref: orderedBook.order_id > orders.id
Ref: orderedBook.book_id > books.id
Ref: orders.user_id > users.id

'Devcourse > BookShop 사이드 프로젝트' 카테고리의 다른 글
| [BookShop 프로젝트] 주문 API - LAST_INSERT_ID(), MAX()로 최신 데이터 가져오기, insertId, 벌크 INSERT (0) | 2026.02.20 |
|---|---|
| [BookShop 프로젝트] 장바구니 API - fk제약조건, in(~, ~) (0) | 2026.02.19 |
| [BookShop] 좋아요 API 구현 - count(), EXISTS (0) | 2026.02.18 |
| [BookShop 프로젝트] Books API 구현 - picsum (0) | 2026.02.14 |
| [BookShop 프로젝트] Users API 구현 - http-status-codes 모듈, 컨트롤러, crypto 모듈(비밀번호 암호화) (0) | 2026.02.13 |