
๐ฏ ๋ชจ๋ API๋ฅผ ์ต์ข ์ ์ผ๋ก ์ ๋ฆฌํฉ๋๋ค.
MVC ํจํด์ ํ์ฉํ์ฌ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ๋น์ฆ๋์ค ๋ก์ง์ ์ํํ๋๋ก ๊ตฌ์ฑํ์์ต๋๋ค.
๐ฆBOOK-SHOP/
โโโ ๐controller/ # ์์ฒญ์ ๋ฐ์ ๋น์ฆ๋์ค ๋ก์ง์ ํธ์ถ
โ โโโ BookController.js
โ โโโ CartController.js
โ โโโ CategoryController.js
โ โโโ LikeController.js
โ โโโ OrderController.js
โ โโโ UserController.js
โ
โโโ ๐service/ # ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌ
โ โโโ BookService.js
โ โโโ CartService.js
โ โโโ CategoryService.js
โ โโโ LikeService.js
โ โโโ OrderService.js
โ โโโ UserService.js
โ
โโโ ๐model/ # ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ชจ๋ธ ์ ์
โ โโโ Book.js
โ โโโ Cart.js
โ โโโ Category.js
โ โโโ Like.js
โ โโโ Order.js
โ โโโ User.js
โ
โโโ ๐routes/ # ๋ผ์ฐํฐ ์ค์
โ โโโ books.js
โ โโโ carts.js
โ โโโ categories.js
โ โโโ likes.js
โ โโโ orders.js
โ โโโ users.js
โ
โโโ๐validation/ # ์์ฒญ ๋ฐ์ดํฐ ๊ฒ์ฆ
โ โโโ bookValidation.js
โ โโโ cartValidation.js
โ โโโ categoryValidation.js
โ โโโ likeValidation.js
โ โโโ orderValidation.js
โ โโโ userValidation.js
โ
โ
โโโ .env # ํ๊ฒฝ ๋ณ์
โโโ app.js # Express ์ ํ๋ฆฌ์ผ์ด์
์ด๊ธฐํ
โโโ auth.js # ์ธ์ฆ ๊ด๋ จ ๋ก์ง
โโโ mariadb.js # ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ
โโโ package.json # ํ๋ก์ ํธ ์์กด์ฑ
โโโ package-lock.json # ํจํค์ง ๋ฒ์ ๊ด๋ฆฌ
์ํํธ์จ์ด๋ฅผ ๋ชจ๋ธ(Model), ๋ทฐ(View), ์ปจํธ๋กค๋ฌ(Controller)๋ก ๋๋์ด ๊ตฌ์กฐํํ๋ ๋์์ธ ํจํด์ ๋๋ค.
Model : ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ด๋ จ๋ ๋ก์ง์ ๋ด๋นํฉ๋๋ค.
View : ์ฌ์ฉ์์๊ฒ ๋ณด์ด๋ UI๋ฅผ ๋ด๋นํฉ๋๋ค. (API ํ๋ก์ ํธ์ด๋ฏ๋ก ๋ทฐ๊ฐ ๋ฐ๋ก ์์)
Controller : ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฐ์ ๋ชจ๋ธ๊ณผ ๋ทฐ๋ฅผ ์ฐ๊ฒฐํ๋ ์ญํ .
1๏ธโฃ LIMIT & OFFSET ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์
๋๋ค.
SELECT * FROM Bookshop.books LIMIT 4 OFFSET 0;
SELECT count(*) FROM Bookshop.books;
2๏ธโฃ SQL_CALC_FOUND_ROWS๋ฅผ ํ์ฉํ๋ ๋ฐฉ๋ฒ์
๋๋ค.
SELECT SQL_CALC_FOUND_ROWS * FROM Bookshop.books LIMIT 4 OFFSET 0;
SELECT found_rows();
๐ ํ์ง๋ง ์ฑ๋ฅ์ด ๋จ์ด์ง๋ฏ๋ก ๋๋์ ๋ฐ์ดํฐ์์๋ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
๐ ์์ ํ ๋ถ๋ถ์ ์ฃผํฉ์ ๊ธ์จ๋ก ๋ํ๋
๋๋ค.

Method : POST
URL : /users/join
HTTP Status Code : 201 Created
Request Body
{
"email": "์ฌ์ฉ์๊ฐ ์
๋ ฅํ ์ด๋ฉ์ผ",
"password" : "์ฌ์ฉ์๊ฐ ์
๋ ฅํ ๋น๋ฐ๋ฒํธ"
}
Method : POST
URL : /users/login
HTTP Status Code : 200 Ok
Request Body
{
"email": "์ฌ์ฉ์๊ฐ ์
๋ ฅํ ์ด๋ฉ์ผ",
"password" : "์ฌ์ฉ์๊ฐ ์
๋ ฅํ ๋น๋ฐ๋ฒํธ"
}
JWT TokenMethod : POST
URL :/users/rest
HTTP Status Code : 200 Ok
Request Body
{
"email": "์ฌ์ฉ์๊ฐ ์
๋ ฅํ ์ด๋ฉ์ผ"
}
{
"email": "์ฌ์ฉ์๊ฐ ์
๋ ฅํ ์ด๋ฉ์ผ"
}
Method : PUT
URL : /users/rest
HTTP Status Code : 200 Ok
Request Body
{
"email": "์ด์ ํ์ด์ง์์ ์
๋ ฅํ ์ด๋ฉ์ผ",
"password" : "์ฌ์ฉ์๊ฐ ์
๋ ฅํ ๋น๋ฐ๋ฒํธ"
}

์์ ํ ๋ถ๋ถ์ ์ฃผํฉ์ ๊ธ์จ๋ก ๋ํ๋
๋๋ค.
Method : POST
URL : /likes/:bookId
HTTP Status Code : 200 Ok
Request Headers : 'Authorization' : JWT Token
Response Body : x
Method : DELETE
URL : /likes/:bookId
HTTP Status Code : 200 Ok
Request Headers : 'Authorization' : JWT Token
Response Body : x

๐ ์์ ํ ๋ถ๋ถ์ ์ฃผํฉ์ ๊ธ์จ๋ก ๋ํ๋ ๋๋ค.
Method : GET
URL :/books?limit=๊ฐ์¤tPage=ํ์ด์ง๋ฒํธ
HTTP Status Code : 200 Ok
Response Body :
{
"books" : [
{
"id" : ๋์ id,
"title": "๋์ ์ ๋ชฉ",
"img" : ์ด๋ฏธ์ง id,
"summary" : "์์ฝ ์ค๋ช
",
"author" : "๋์ ์๊ฐ",
"price" : ๊ฐ๊ฒฉ,
"likes" : ์ข์์ ์,
"pubDate" : "์ถ๊ฐ ๋ ์ง"
},
{
"id" : ๋์ id,
"title": "๋์ ์ ๋ชฉ",
"img" : ์ด๋ฏธ์ง id,
"summary" : "์์ฝ ์ค๋ช
",
"author" : "๋์ ์๊ฐ",
"price" : ๊ฐ๊ฒฉ,
"likes" : ์ข์์ ์,
"pubDate" : "์ถ๊ฐ ๋ ์ง"
},
...
],
"pagination": {
"currentPage": ํ์ฌ ํ์ด์ง,
"totalCount": ์ด ๋์ ์
}
}
Method : GET
URL : /books/:id
HTTP Status Code : 200 Ok
Request Headers : 'Authorization' : JWT Token
Response Body :
{
"id" : ๋์ id,
"title": "๋์ ์ ๋ชฉ",
"img" : ์ด๋ฏธ์ง id,
"categoryName" : "์นดํ
๊ณ ๋ฆฌ",
"form" : "ํฌ๋งท",
"isbn" : "isbn",
"summary" : "์์ฝ ์ค๋ช
",
"detail" : "์์ธํ ์ค๋ช
",
"author" : "๋์ ์๊ฐ",
"pages" : ์ชฝ ์,
"contents" : "๋ชฉ์ฐจ",
"price" : ๊ฐ๊ฒฉ,
"likes" : ์ข์์ ์,
"liked" : boolean, (๋ก๊ทธ์ธ์ธ ์ํ์๋ง ๋ณด๋ด์ค)
"pubDate" : "์ถ๊ฐ ๋ ์ง"
}
Method : GET
URL : /books?categoryId=:categoryId&news={boolean}
HTTP Status Code : 200 Ok
Request Body : x
Response Body :
[
{
"id" : ๋์ id,
"title": "๋์ ์ ๋ชฉ",
"img" : ์ด๋ฏธ์ง id,
"summary" : "์์ฝ ์ค๋ช
",
"author" : "๋์ ์๊ฐ",
"price" : ๊ฐ๊ฒฉ,
"likes" : ์ข์์ ์,
"pubDate" : "์ถ๊ฐ ๋ ์ง"
},
{
"id" : ๋์ id,
"title": "๋์ ์ ๋ชฉ",
"img" : ์ด๋ฏธ์ง id,
"summary" : "์์ฝ ์ค๋ช
",
"author" : "๋์ ์๊ฐ",
"price" : ๊ฐ๊ฒฉ,
"likes" : ์ข์์ ์,
"pubDate" : "์ถ๊ฐ ๋ ์ง"
},
...
]
news๊ฐ true์ผ ๋ ์ ๊ฐ ์กฐํ ๊ธฐ์ค์ ์ถ๊ฐ์ผ๋ก๋ถํฐ 1๋ฌ ์ด๋ด
Method : POST
URL : /carts
HTTP Status Code : 200 Ok
Request Headers : 'Authorization' : JWT Token
Request Body
{
"bookId" : ๋์ id,
"quantity" : ์๋,
}
Method : GET
URL : /carts
HTTP Status Code : 200 Ok
Request Headers : 'Authorization' : JWT Token
Request Body :
{
"selected" : [cartItemId, cartItemId ...]
}
[
{
"id" : ์ฅ๋ฐ๊ตฌ๋ id,
"bookId" : ๋์ id,
"title" : "๋์ ์ ๋ชฉ",
"summary" : "์์ฝ ์ค๋ช
",
"quantity" : ์๋,
"price" : ๊ฐ๊ฒฉ
},
{
"id" : ์ฅ๋ฐ๊ตฌ๋ id,
"bookId" : ๋์ id,
"title" : "๋์ ์ ๋ชฉ",
"summary" : "์์ฝ ์ค๋ช
",
"quantity" : ์๋,
"price" : ๊ฐ๊ฒฉ
},
]
Method : DELETE
URL : /carts/:cartItemId
HTTP Status Code : 200 Ok
Request Headers : 'Authorization' : JWT Token
Request Body : x
Response Body : x

Method : POST
URL : /orders
HTTP Status Code : 200 Ok
Request Headers : 'Authorization' : JWT Token
Request Body
{
"items": [ ์ฅ๋ฐ๊ตฌ๋ ๋์ id, ์ฅ๋ฐ๊ตฌ๋ ๋์ id, ...],
"delivery" : {
"address" : "์ฃผ์",
"receiver" : "์ด๋ฆ",
"contact" : "์ ํ๋ฒํธ"
},
"totalQuantity" : ์ด ์๋,
"totalPrice" : ์ด ๊ธ์ก,
"firstbookTitle" : "๋ํ ๋์ ์ ๋ชฉ"
}
Method : GET
URL : /orders
HTTP Status Code : 200 Ok
Request Headers : 'Authorization' : JWT Token
[
{
"orderId" : ์ฃผ๋ฌธ id,
"createdAt" : "์ฃผ๋ฌธ์ผ์",
"address" : "์ฃผ์",
"receiver" : "์ด๋ฆ",
"contact" : "์ ํ๋ฒํธ",
"bookTitle" : "๋ํ ์ฑ
์ ๋ชฉ",
"totalQuantity" : ์ด ์๋,
"totalPrice" : ๊ฒฐ์ ๊ธ์ก,
},
{
"orderId" : ์ฃผ๋ฌธ id,
"createdAt" : "์ฃผ๋ฌธ์ผ์",
"address" : "์ฃผ์",
"receiver" : "์ด๋ฆ",
"contact" : "์ ํ๋ฒํธ",
"bookTitle" : "๋ํ ์ฑ
์ ๋ชฉ",
"totalQuantity" : ์ด ์๋,
"totalPrice" : ๊ฒฐ์ ๊ธ์ก,
},
...
]
Method : GET
URL : /orders/:id
HTTP Status Code : 200 Ok
Request Headers : 'Authorization' : JWT Token
[
{
"bookId" : ๋์ id,
"title" : "๋์ ์ ๋ชฉ",
"author" : "์๊ฐ",
"price" : ๊ฐ๊ฒฉ,
"quantity" : ์๋
},
{
"bookId" : ๋์ id,
"title" : "๋์ ์ ๋ชฉ",
"author" : "์๊ฐ",
"price" : ๊ฐ๊ฒฉ,
"quantity" : ์๋
},
...
]
๋ฐฑ์๋ ๊ฐ๋ฐ ๊ฐ์๊ฐ ๋๋ฌ๋ค๋ ๊ฒ ์ค๊ฐ์ด ์ ๋๊ณ , MVC ํจํด์ ํ์ฉํด์ ์ฝ๋๋ฅผ ์ ๋ฆฌํ๋ ๊ณผ์ ๋ฅผ ๋ ํํด์ ์ ๋ง๋ฌด๋ฆฌํด์ผ๊ฒ ์ต๋๋ค!!
