๐ ERD
์ข์์ ํ ์ด๋ธ์ ์ด๋ค ํ์์ด ์ด๋ค ๋์์ ์ข์์ ํ๋์ง id๊ฐ๋ค์ FK๋ก ์ ์ฅ
๐ ํ ์ด๋ธ ์์ฑ
๋๊ฐ ์ข์์๋ฅผ ๋๋ ๋ ์ง ์๊ธฐ ์ํด์๋ ๋ก๊ทธ์ธํ ์ ์ ๊ฐ ์ข์์๋ฅผ ๋๋ฌ์ผ ํ๋ค.
๋ก๊ทธ์ธ์ ํ๋ค๋ฉด ํ ํฐ์ ๊ฐ์ง๊ณ ์์ ๊ฒ์ด๊ณ ํด๋น ํ ํฐ์ผ๋ก ์ข์์ ๋๋ฅธ ์ ์ ๋ฅผ ํ์ ํ ์ ์๋ค.
์ฐ์ ํ ํฐ์ ๋์ค์ ๊ตฌํํ๊ธฐ๋ก ํ๊ณ ์ ์ id๊ฐ์ body์ ๋ฃ์ด ๊ตฌํํด๋ณด๋๋ก ํ๊ฒ ๋ค.
โค๏ธ ์ข์์ ์ถ๊ฐ API
const addLike = (req, res) => {
const {liked_book_id} = req.params;
const {user_id} = req.body;
let sql = `INSERT INTO likes (user_id, liked_book_id) VALUES (?, ?);`;
let values = [user_id, liked_book_id];
conn.query(sql, values,
(err, results) => {
if(err) {
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
return res.status(StatusCodes.OK).json(results);
})
};
์ข์์ ํ ์ด๋ธ์ ์ ์ ์ ๋์ id๋ฅผ INSERTํ์ฌ ์ข์์๋ฅผ ๊ตฌํํ์๋ค.
ํ์ง๋ง ์คํํด๋ณด๋ฉด ๊ฐ์ ์ ๋ฃ์ด์คฌ์์๋ Error: Colum 'liked_book_id' cannot be null ์ด๋ผ๋ ์๋ฌ๊ฐ ๋จ๋ค.
router.post('/:id', addLike); ์ด ์ฝ๋ ๋๋ฌธ์ด์๋ค.
๋ผ์ฐํฐ์์ params๋ก ์ค๋ ๊ฐ์ id๋ก ๋ฐ๊ธฐ๋ก ํ๋๋ฐ liked_book_id๋ก ์ฐพ์ผ๋ ๋น์ฐํ ๊ฐ์ ์ฐพ์ง ๋ชปํ๋ ๊ฒ์ด๋ค.
const {id} = req.params;
๋ณ์๋ช ์ ๋ง์ถฐ์ฃผ๋ฉด ํด๊ฒฐ๋๋ค.
๐ ์ข์์ ์ญ์ API
let sql = `DELETE FROM likes WHERE user_id = ? AND liked_book_id = ?`;
์ญ์ ๋ ์ ์ ์ ๋์์ id๋ฅผ ํ์ธํ๊ณ ํด๋นํ๋ ๊ฐ์ ์ข์์ ํ ์ด๋ธ์์ ์ญ์ ํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ์๋ค.
๐ MySQL Workbench Read Only
์ข์์ ํ ์ด๋ธ์ ์กฐํํ๋ค๋ณด๋ ํ์ ์ง์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ ์ ์๋ Read Only๋ก ๋ํ๋๊ณ ์๋ค.
์ด๋ PK๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
ํ์ฌ ์ข์์ ํ ์ด๋ธ์ ์๋ user_id์ liked_book_id๋ ๋ชจ๋ ์ ์ ํ ์ด๋ธ๊ณผ ๋์ ํ ์ด๋ธ์ id๊ฐ์ FK๋ก ํ๊ณ ์๋ ์ปฌ๋ผ์ด๋ค.
๋ฐ๋ผ์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๊ณ ์ถ๋ค๋ฉด PK๋ฅผ ์ถ๊ฐํด์ฃผ๊ฑฐ๋ INSERT๋ฌธ์ผ๋ก ์ง์ ๋ฃ์ด์ฃผ์ด์ผ ํ๋ค.
๐ฒ count()
ํ์ ๊ฐ์๋ฅผ ๋ฐํํด์ฃผ๋ ํจ์
SELECT count(*) FROM likes WHERE liked_book_id = 1;
WHERE์ ์ ํตํด ์กฐ๊ฑด์ ๋ง๋ ํ์ ๊ฐ์๋ฅผ ๊ตฌํ ์๋ ์๋ค.
๐ ์๋ธ ์ฟผ๋ฆฌ
์ฟผ๋ฆฌ ์์ ์๋ ์ฟผ๋ฆฌ๋ก, ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐ๊นฅ ์ฟผ๋ฆฌ(๋ฉ์ธ ์ฟผ๋ฆฌ)์ ์ฐ๋ ค๊ณ ํ ๋ ์ฌ์ฉ
์๋ฅผ ๋ค์ด, ๋์ ํ ์ด๋ธ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ๋ ํด๋น ๋์์ ์ข์์ ์๋ฅผ ํจ๊ป ์ถ๋ ฅํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ ์ ์๋ค.
SELECT *,
(SELECT count(*) FROM likes WHERE liked_book_id=books.id) AS likes
FROM books;
SELECT์ ์ ์ํ๋ ์ฟผ๋ฆฌ๋ฌธ์ ์์ฑํด์ฃผ๊ณ , AS๋ฅผ ์ฌ์ฉํด ๋ณ์นญ์ ์ ํด์ฃผ๋ฉด ๋๋ค.
์ด SQL๋ฌธ์ ๋ณด๋ฉด
books ํ ์ด๋ธ์ ์ ์ฒด ์ปฌ๋ผ๊ณผ
๊ฐ ํ๋ง๋ค likes ํ ์ด๋ธ์ liked_book_id๋ก ๊ฐ์ง๊ณ ์๋ ํ ์๋ฅผ likes๋ผ๋ ์ปฌ๋ผ์ผ๋ก ์กฐํํ๋ ค๋ ๊ฒ์ด๋ค.
๋ณ์นญ์ผ๋ก ์ค์ ํ likes์ ์ข์์ ์๊ฐ ์ ๋ด๊ฒจ์ ธ ๋์ค๊ณ ์๋ค.
๐ฉท ์ฌ์ฉ์ ์ข์์ ์ฌ๋ถ ์ถ๊ฐ
๋์๋ฅผ ์กฐํํ ๋ ์ฌ์ฉ์๊ฐ ์ข์์๋ฅผ ๋๋ ๋์ง ํ์ธํ๊ธฐ ์ํ ์ข์์ ์ฌ๋ถ๋ฅผ ์ถ๊ฐํด๋ณด๋๋ก ํ์.
์ข์์ ํ ์ด๋ธ์ ์ํ๋ ์ ์ ์์ด๋์ ๋์ ์์ด๋๊ฐ ์๋์ง ํ์ธํด๋ด์ผํ๋ค.
count()๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ ๊ฐ์๊ฐ ๋์ค๋๋ฐ ์ด์ฐจํผ 1 ์๋๋ฉด 0์ด ๋์ฌ ๊ฒ์ด๋ค.
์ด๋ด ๋ EXISTS ๊ตฌ๋ฌธ์ ์ฌ์ฉํด์ ํ์ธํ๋ ๋ฐฉ๋ฒ๋ ์๋ค.
- likes : ํด๋น ๋์์ ์ข์์ ์ด ๊ฐ์
- liked : ์ ์ ๊ฐ ์ข์์ ๋๋ ๋์ง ์ฌ๋ถ (1 : ๋๋ฆ / 0 : ๋๋ฅด์ง ์์)
๊ทธ๋ผ ๊ธฐ์กด์ ์์ ํ๋ ์นดํ ๊ณ ๋ฆฌ๋ช ์ ํจ๊ป ์ถ๋ ฅํ๊ธฐ ์ํ ์กฐ์ธ๋ฌธ๊น์ง ํฉ์ณ์ฃผ๋ฉด
const bookDetail = (req, res) => {
let book_id = req.params.id;
let {user_id} = req.body;
let sql = `SELECT *,
(SELECT count(*) FROM likes WHERE liked_book_id = books.id) AS likes,
(SELECT EXISTS (SELECT * FROM likes WHERE user_id = ? AND liked_book_id = ?)) AS liked
FROM books
LEFT JOIN category
ON books.category_id = category.category_id
WHERE books.id = ?;`;
let values = [user_id, book_id, book_id];
conn.query(sql, values,
(err, results) => {
if (err) {
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
if(results[0])
return res.status(StatusCodes.OK).json(results[0]);
else
return res.status(StatusCodes.NOT_FOUND).end();
})
};
์์ฑ !
๐จ ์นดํ ๊ณ ๋ฆฌ์ ๋์ ํ ์ด๋ธ์ id ์ปฌ๋ผ๋ช ์ด ๋์ผํ๊ฒ ์ค์ ๋์ด ์กฐ์ธํ์ ๋ ๋ฎ์ด์์์ง๋ ํ์์ด ๋ฐ์ํ๋ค.
โญ ๋ถํ์ํ ์นดํ ๊ณ ๋ฆฌ ์์ด๋๋ฅผ ์ ์ธํ ๋๋จธ์ง ์ปฌ๋ผ๋ช ์ ๋ชจ๋ ์์ฑํด์ ์กฐํํ๋ ๋ฐฉ๋ฒ๋ ์กด์ฌํ์ง๋ง
๊ฐ๋จํ๊ฒ ์นดํ ๊ณ ๋ฆฌ ํ ์ด๋ธ์ ์ปฌ๋ผ๋ช ์ category_id๋ก ๋ณ๊ฒฝํด ํด๊ฒฐํด์ฃผ์๋ค.
'๐๏ธ DevCourse > Backend' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[TIL] Week 9 ์ฃผ๋ฌธ API (3) | 2025.03.18 |
---|---|
[TIL] Week 9 ์ฅ๋ฐ๊ตฌ๋ API (2) | 2025.03.17 |
[TIL] Week 8 ์นดํ ๊ณ ๋ฆฌ๋ณ, ์ ๊ฐ์ ๋ฐ๋ฅธ ๋์ API ํ์ด์ง (2) | 2025.03.14 |
[TIL] Week 8 ๋์ API (1) | 2025.03.13 |
[TIL] Week 8 ์ปจํธ๋กค๋ฌ & ๋น๋ฐ๋ฒํธ ์ํธํ (1) | 2025.03.12 |