๐ŸŽฏ ERD๋ฅผ ์„ค๊ณ„ํ•˜๋ฉฐ API๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ“™ Today I Learned

์–ด์ œ ์ž‘์„ฑํ–ˆ๋˜ API๋ฅผ ์ˆ˜์ •ํ•˜๊ณ , ERD๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ‘‰ ์ˆ˜์ •ํ•œ ๋ถ€๋ถ„์€ ์ฃผํ™ฉ์ƒ‰ ๊ธ€์”จ๋กœ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

ํšŒ์› API ์„ค๊ณ„

ํšŒ์› ๊ฐ€์ž…

  • Method : POST

  • URL : /join

  • HTTP Status Code : 201 Created

  • Request Body

  {
    "email": "์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ์ด๋ฉ”์ผ",
    "password" : "์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ"
  }
  • Response Body : x

๋กœ๊ทธ์ธ

  • Method : POST

  • URL : /login

  • HTTP Status Code : 200 Ok

  • Request Body

  {
    "email": "์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ์ด๋ฉ”์ผ",
    "password" : "์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ"
  }
  • Response Body : JWT Token

๋น„๋ฐ€๋ฒˆํ˜ธ ์ดˆ๊ธฐํ™” ์š”์ฒญ

  • Method : POST

  • URL : /rest

  • HTTP Status Code : 200 Ok

  • Request Body

  {
    "email": "์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ์ด๋ฉ”์ผ"
  }
  • Response Body : x

๋น„๋ฐ€๋ฒˆํ˜ธ ์ดˆ๊ธฐํ™”

  • Method : PUT

  • URL : /rest

  • HTTP Status Code : 200 Ok

  • Request Body

  {
    "email": "์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ์ด๋ฉ”์ผ"
  }
  • Response Body : x



๋„์„œ API ์„ค๊ณ„

์ „์ฒด ๋„์„œ ์กฐํšŒ

  • Method : GET

  • URL : /books

  • HTTP Status Code : 200 Ok

  • Request Body : x

  • Response Body :

[
  {
    "id" : ๋„์„œ id,
    "title": "๋„์„œ ์ œ๋ชฉ",
    "summary" : "์š”์•ฝ ์„ค๋ช…",
    "author" : "๋„์„œ ์ž‘๊ฐ€",
    "price" : ๊ฐ€๊ฒฉ,
    "likes" : ์ข‹์•„์š” ์ˆ˜,
    "pubDate" : "์ถœ๊ฐ„ ๋‚ ์งœ"
  },
  {
    "id" : ๋„์„œ id,
    "title": "๋„์„œ ์ œ๋ชฉ",
    "summary" : "์š”์•ฝ ์„ค๋ช…",
    "author" : "๋„์„œ ์ž‘๊ฐ€",
    "price" : ๊ฐ€๊ฒฉ,
    "likes" : ์ข‹์•„์š” ์ˆ˜,
    "pubDate" : "์ถœ๊ฐ„ ๋‚ ์งœ"
  },
  ...
]
  • TODO : ์ด๋ฏธ์ง€ ์ฃผ์†Œ ์ „๋‹ฌ, ๋ฐ์ดํ„ฐ๋ฅผ 8๊ฐœ์”ฉ ๋ณด๋‚ด์ฃผ์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์ถ”ํ›„์— ๊ณ ๋„ํ™”ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

๊ฐœ๋ณ„ ๋„์„œ ์กฐํšŒ

  • Method : GET

  • URL : /books/:id

  • HTTP Status Code : 200 Ok

  • Request Body

{
  "email": "์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ์ด๋ฉ”์ผ",
  "password" : "์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ"
}
  • Response Body :
{
  "id" : ๋„์„œ id,
  "title": "๋„์„œ ์ œ๋ชฉ",
  "category" : "์นดํ…Œ๊ณ ๋ฆฌ",
  "format" : "ํฌ๋งท",
  "isbn" : "isbn",  
  "summary" : "์š”์•ฝ ์„ค๋ช…",
  "author" : "๋„์„œ ์ž‘๊ฐ€",
  "pages" : ์ชฝ ์ˆ˜,
  "index" : "๋ชฉ์ฐจ",
  "price" : ๊ฐ€๊ฒฉ,
  "likes" : ์ข‹์•„์š” ์ˆ˜,
  "liked" : boolean,
  "pubDate" : "์ถœ๊ฐ„ ๋‚ ์งœ"
}
  • TODO : ์ด๋ฏธ์ง€ ์ฃผ์†Œ ์ „๋‹ฌ์€ ์ถ”ํ›„์— ๊ณ ๋„ํ™”ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ์‹ ๊ฐ„ ๋„์„œ ์กฐํšŒ

  • Method : GET

  • URL : /books?categoryId=:categoryId&new={boolean}

  • HTTP Status Code : 200 Ok

  • Request Body : x

  • Response Body :

[
  {
    "id" : ๋„์„œ id,
    "title": "๋„์„œ ์ œ๋ชฉ",
    "summary" : "์š”์•ฝ ์„ค๋ช…",
    "author" : "๋„์„œ ์ž‘๊ฐ€",
    "price" : ๊ฐ€๊ฒฉ,
    "likes" : ์ข‹์•„์š” ์ˆ˜,
    "pubDate" : "์ถœ๊ฐ„ ๋‚ ์งœ"
  },
  {
    "id" : ๋„์„œ id,
    "title": "๋„์„œ ์ œ๋ชฉ",
    "summary" : "์š”์•ฝ ์„ค๋ช…",
    "author" : "๋„์„œ ์ž‘๊ฐ€",
    "price" : ๊ฐ€๊ฒฉ,
    "likes" : ์ข‹์•„์š” ์ˆ˜,
    "pubDate" : "์ถœ๊ฐ„ ๋‚ ์งœ"
  },
  ...
]
  • TODO : ์ด๋ฏธ์ง€ ์ฃผ์†Œ ์ „๋‹ฌ, ๋ฐ์ดํ„ฐ๋ฅผ 8๊ฐœ์”ฉ ๋ณด๋‚ด์ฃผ์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์ถ”ํ›„์— ๊ณ ๋„ํ™”ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

  • ์ฐธ๊ณ ์‚ฌํ•ญ : new๊ฐ€ true์ผ ๋•Œ ์‹ ๊ฐ„ ์กฐํšŒ ๊ธฐ์ค€์€ ์ถœ๊ฐ„์ผ๋กœ๋ถ€ํ„ฐ 30์ผ ์ด๋‚ด




์ข‹์•„์š” API ์„ค๊ณ„

์ข‹์•„์š” ์ถ”๊ฐ€

  • Method : POST

  • URL : /likes/:bookId

  • HTTP Status Code :200 Ok

  • Request Body : x

  • Response Body : x


์ข‹์•„์š” ์ทจ์†Œ

  • Method : DELETE

  • URL : /likes/:bookId

  • HTTP Status Code : 200 Ok

  • Request Body : x

  • Response Body : x




์žฅ๋ฐ”๊ตฌ๋‹ˆ API ์„ค๊ณ„

์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋‹ด๊ธฐ

  • Method : POST

  • URL : /cart

  • HTTP Status Code : 200 Ok

  • Request Body

  {
    "bookId" : ๋„์„œ id,
    "count" : ์ˆ˜๋Ÿ‰
  }
  • Response Body : x

์žฅ๋ฐ”๊ตฌ๋‹ˆ ์กฐํšŒ

  • Method : GET

  • URL : /cart

  • HTTP Status Code : 200 Ok

  • Request Body : x

  • Response Body

 [
  { 
    "id" : ์žฅ๋ฐ”๊ตฌ๋‹ˆ id,
    "bookId" : ๋„์„œ id,
    "title" : "๋„์„œ ์ œ๋ชฉ",
    "summary" : "์š”์•ฝ ์„ค๋ช…",
    "count" : ์ˆ˜๋Ÿ‰,
    "price" : ๊ฐ€๊ฒฉ
  },
  {
    "id" : ์žฅ๋ฐ”๊ตฌ๋‹ˆ id,
    "bookId" : ๋„์„œ id,
    "title" : "๋„์„œ ์ œ๋ชฉ",
    "summary" : "์š”์•ฝ ์„ค๋ช…",
    "count" : ์ˆ˜๋Ÿ‰,
    "price" : ๊ฐ€๊ฒฉ
  },
 ]

์žฅ๋ฐ”๊ตฌ๋‹ˆ ์‚ญ์ œ

  • Method : DELETE

  • URL : /cart/:cartItemId

  • HTTP Status Code : 200 Ok

  • Request Body : x

  • Response Body : x


์ฃผ๋ฌธ ์˜ˆ์ƒ ์ƒํ’ˆ ๋ชฉ๋ก ์กฐํšŒ(์ฃผ๋ฌธ์„œ ์ž‘์„ฑ)

  • Method : GET

  • URL : /์ถ”ํ›„ ๊ฒฐ์ •

  • HTTP Status Code : 200 Ok

  • Request Body

[ cartItemId, cartItemId, ... ]
  • Response Body : x
[
  {
    "cartItemId" : ์žฅ๋ฐ”๊ตฌ๋‹ˆ id,
    "bookId" : ๋„์„œ id,
    "title" : "๋„์„œ ์ œ๋ชฉ",
    "summary" : "์š”์•ฝ ์„ค๋ช…",
    "count" : ์ˆ˜๋Ÿ‰,
    "price" : ๊ฐ€๊ฒฉ
  },
  {
    "cartItemId" : ์žฅ๋ฐ”๊ตฌ๋‹ˆ id,
    "bookId" : ๋„์„œ id,
    "title" : "๋„์„œ ์ œ๋ชฉ",
    "summary" : "์š”์•ฝ ์„ค๋ช…",
    "count" : ์ˆ˜๋Ÿ‰,
    "price" : ๊ฐ€๊ฒฉ
  },
]
  • TODO : ์ถ”ํ›„ api ์ˆ˜์ •



์ฃผ๋ฌธ(๊ฒฐ์ œ) API ์„ค๊ณ„

๊ฒฐ์ œํ•˜๊ธฐ

  • Method : POST

  • URL : /orders

  • HTTP Status Code : 200 Ok

  • Request Body

{
  "item": [
    {
    	"cartItemId" : ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋„์„œ id,
      	"bookId" : ๋„์„œ id,
      	"count" : ์ˆ˜๋Ÿ‰
    },
    {
    	"cartItemId" : ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋„์„œ id,
      	"bookId" : ๋„์„œ id,
      	"count" : ์ˆ˜๋Ÿ‰
    }  
  ],
  "delivery" : {
    	"address" : "์ฃผ์†Œ",
    	"receiver" : "์ด๋ฆ„",
    	"contact" : "์ „ํ™”๋ฒˆํ˜ธ"
  },
  "totalPrice" : ๊ธˆ์•ก
}
  • Response Body : x

์ฃผ๋ฌธ ๋ชฉ๋ก ์กฐํšŒ

  • Method : GET

  • URL : /orders

  • HTTP Status Code : 200 Ok

  • Request Body : x

  • Response Body :

[
  {
    "order_id" : ์ฃผ๋ฌธ id,
  	"created_at" : "์ฃผ๋ฌธ์ผ์ž",
    "delivery" : {
    	"address" : "์ฃผ์†Œ",
     	"receiver" : "์ด๋ฆ„",
    	"contact" : "์ „ํ™”๋ฒˆํ˜ธ",
    },
  	"bookTitle" : "๋Œ€ํ‘œ ์ฑ… ์ œ๋ชฉ",
  	"totalPrice" : ๊ฒฐ์ œ ๊ธˆ์•ก,
  	"totalCount" : ์ด ์ˆ˜๋Ÿ‰
  },
  {
    "order_id" : ์ฃผ๋ฌธ id,
  	"created_at" : "์ฃผ๋ฌธ์ผ์ž",
    "delivery" : {
    	"address" : "์ฃผ์†Œ",
     	"receiver" : "์ด๋ฆ„",
    	"contact" : "์ „ํ™”๋ฒˆํ˜ธ",
  },
  	"bookTitle" : "๋Œ€ํ‘œ ์ฑ… ์ œ๋ชฉ",
  	"totalPrice" : ๊ฒฐ์ œ ๊ธˆ์•ก,
  	"totalCount" : ์ด ์ˆ˜๋Ÿ‰
  },
  ...
]

์ฃผ๋ฌธ ์ƒ์„ธ ์กฐํšŒ

  • Method : GET

  • URL : /orders/:id

  • HTTP Status Code : 200 Ok

  • Request Body : x

  • Response Body :

[
  {
    "bookId" : ๋„์„œ id,
    "bookTitle" : "๋„์„œ ์ œ๋ชฉ",
    "author" : "์ž‘๊ฐ€",
    "price" : ๊ฐ€๊ฒฉ,
    "count" : ์ˆ˜๋Ÿ‰
  },
  {
    "bookId" : ๋„์„œ id,
    "bookTitle" : "๋„์„œ ์ œ๋ชฉ",
    "author" : "์ž‘๊ฐ€",
    "price" : ๊ฐ€๊ฒฉ,
    "count" : ์ˆ˜๋Ÿ‰
  },
  ...
]



ERD ์ž‘์„ฑ

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

Table books {
  id integar [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
}

Table likes {
  user_id integer 
  liked_book_id integer
}

Table cartItems {
  id integer [primary key]
  book_id integer
  count integer
}

Table deliveries {
  id integer [primary key]
  address varchar
  receiver varchar
  contact varchar
}

Table orders {
  id integer [primary key]
  delivery_id integer
  total_price integer
  created_at timestamp
  book_title varchar
  total_count integer
}

Table orderedBook {
  order_id integer
  book_id integer
  count integer
}

ref: orderedBook.order_id > orders.id
ref: orderedBook.book_id > books.id
ref: orders.delivery_id > deliveries.id
ref: cartItems.book_id > books.id
ref: likes.user_id > users.id
ref: likes.liked_book_id > books.id



โœ๏ธ ํ•œ ์ค„ ํšŒ๊ณ 

ERD๋ฅผ ๊ฐ™์ด ์„ค๊ณ„ํ•ด๋ณด๋‹ˆ ๋ฐ์ดํ„ฐ ํ๋ฆ„์ด ๋” ๋ช…ํ™•ํ•ด์ง€๊ณ , API ์„ค๊ณ„ ๋ฐฉํ–ฅ๋„ ํ•œ๋ˆˆ์— ์ž˜ ๋ณด์ด๋Š” ๋А๋‚Œ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

profile
๐ŸŒฑ๊ฐœ๋ฐœ ๊ธฐ๋ก์žฅ

0๊ฐœ์˜ ๋Œ“๊ธ€