๐ ๋์ ํ ์ด๋ธ ์์ฑ
ERD
์ฒ์์ DB๋ฅผ ์ด๋ ๊ฒ ์ค์ ํ์ง๋ง ์ผ๋ถ ์ปฌ๋ผ๋ช ์ด SQL ์์ฝ์ด๋ ๊ฒน์น๊ณ ์์ด ๋ณ๊ฒฝํด์ฃผ์๋ค.
์์ฝ์ด : DB์์ SQL ์ฉ์ด๋ก ์ฌ์ฉ ์ค์ธ ๋จ์ด
- format → form
- description → detail
- index → contents
๐ ๋์ ์ ์ฒด ์กฐํ API
const allBooks = (req, res) => {
let sql = 'SELECT * FROM books';
conn.query(sql, (err, results) => {
if (err) {
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
return res.status(StatusCodes.OK).json(results);
})
};
ํ๋ฉด ์ค๊ณ ์ ๋์์ ๋ชจ๋ ์ ๋ณด๊ฐ ํ์ํ์ง ์์ง๋ง ๊ตณ์ด ์๋ผ์ ๋ณด๋ด์ฃผ๊ธฐ ๋ณด๋ค๋
ํ๋ก ํธ ์์์ ํ์ํ ์ ๋ณด๋ง ๊ฐ์ ธ๋ค ์ฐ๋๋ก ์์
๋์ , API ๋ช ์ธ์์ ๋ชจ๋ ๋ด์ฉ์ด ํฌํจ๋์ด์๋ค๋ ๋ด์ฉ์ ์ถ๊ฐ
๐ ์์ธ ๋์ ์กฐํ API
const bookDetail = (req, res) => {
const {id} = req.params;
let sql = 'SELECT * FROM books WHERE id=?';
conn.query(sql, id,
(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();
})
};
results์ ๊ฐ์ด 1๊ฐ๋ง ๋ค์ด์ค๋๋ฐ๋ ๋ฐฐ์ด๋ก ๋ด์์ฃผ๊ณ ์๊ธฐ ๋๋ฌธ์ results[0]๋ฅผ ๋ฐํ
๐ท Picsum
Lorem Picsum
Lorem Ipsum... but for photos
picsum.photos
์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ๋ค ์ฌ์ฉํ ์ ์๋ ์ฌ์ดํธ
https://picsum.photos/id/{์ด๋ฏธ์งid}/{width}/{height}
์ํ๋ ์ด๋ฏธ์ง์ ์์ด๋๊ฐ์ ๋ฃ์ด์ฃผ๊ณ ์ํ๋ ํฌ๊ธฐ๋ฅผ ํจ๊ป ๋ฃ์ด์ ํธ์ถํด ์ฌ์ฉํ ์ ์๋ค.
๐ ์นดํ ๊ณ ๋ฆฌ๋ณ ๋์ ๋ชฉ๋ก ์กฐํ API
router.get('/', allBooks); // ์ ์ฒด ๋์ ์กฐํ
router.get('/:id', bookDetail); // ๊ฐ๋ณ ๋์ ์กฐํ
router.get('/', booksByCategory); // ์นดํ
๊ณ ๋ฆฌ๋ณ ๋์ ๋ชฉ๋ก ์กฐํ
๊ฐ์ HTTP method, ๊ฐ์ URI๋ผ๋ฉด ๋จผ์ ์์ฑ๋ ๋ผ์ฐํฐ๊ฐ ์ฐ์ ์์๋ฅผ ๊ฐ์ง๊ฒ ๋๋ค.
๋ฐ๋ผ์ ์๋ฌด๋ฆฌ bookByCategory๊ฐ ์ฟผ๋ฆฌ๋ฅผ ํฌํจํด์ ์์ฒญํ๋คํ๋๋ผ๋ allBooks๊ฐ ๋จผ์ ์คํ๋๊ฒ ๋๋ค.
๋ฐ๋ผ์ ๋์ ๋ถ๋ฆฌํ์ง๋ง๊ณ ํฉ์น ๋ค์ ์ฟผ๋ฆฌ ์ ๋ฌด์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋๋ก ํด์ผํ๋ค.
const allBooks = (req, res) => {
let {category_id} = req.query;
if(category_id) {
let sql = 'SELECT * FROM books WHERE category_id=?';
conn.query(sql, category_id,
(err, results) => {
if (err) {
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
if(results.length)
return res.status(StatusCodes.OK).json(results);
else
return res.status(StatusCodes.NOT_FOUND).end();
}
)
} else {
let sql = 'SELECT * FROM books';
conn.query(sql, (err, results) => {
if (err) {
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
return res.status(StatusCodes.OK).json(results);
})
}
};
์ฟผ๋ฆฌ์ ์นดํ ๊ณ ๋ฆฌ id๊ฐ ๋ค์ด์๋ค๋ฉด ์นดํ ๊ณ ๋ฆฌ๋ณ ๋์ ๋ชฉ๋ก์ ์กฐํํด ๋ฐํํ๊ณ ,
์ฟผ๋ฆฌ์ ์นดํ ๊ณ ๋ฆฌ id๊ฐ ์๋ค๋ฉด ์ ์ฒด ๋์๋ฅผ ๋ฐํํ๋๋ก ์์ ํ์๋ค.
๐ ์นดํ ๊ณ ๋ฆฌ ์ ์ฒด ๋ชฉ๋ก ์กฐํ API
์ API๋ฅผ ๋ฐ๋ ์ฌ๋์ ์นดํ ๊ณ ๋ฆฌ id๋ง์ ๊ฐ์ง๊ณ ๋ ๋ฌด์จ ์นดํ ๊ณ ๋ฆฌ์ธ์ง ์ ์ ์๋ค.
๊ทธ๋์ id๊ฐ ๋์ ์นดํ ๊ณ ๋ฆฌ๋ช ์ ๋๋ ค์ค์ผํ ๊ฒ ๊ฐ๋ค.
๋จผ์ ์นดํ ๊ณ ๋ฆฌ๋ช ๋ถํฐ ์ ์ฒด ์กฐํ ํด๋ณด์
const allCategory = (req, res) => {
let sql = "SELECT * FROM category";
conn.query(sql, (err, results) => {
if (err) {
console.log(err);
return res.status(StatusCodes.BAD_REQUEST).end();
}
return res.status(StatusCodes.OK).json(results);
})
};
'๐๏ธ DevCourse > Backend' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[TIL] Week 8 ๋์ ์์ ์ข์์ API (2) | 2025.03.15 |
---|---|
[TIL] Week 8 ์นดํ ๊ณ ๋ฆฌ๋ณ, ์ ๊ฐ์ ๋ฐ๋ฅธ ๋์ API ํ์ด์ง (2) | 2025.03.14 |
[TIL] Week 8 ์ปจํธ๋กค๋ฌ & ๋น๋ฐ๋ฒํธ ์ํธํ (1) | 2025.03.12 |
[TIL] Week 8 Express-generator ๊ตฌ์กฐ & ๋์ ์์ API ๊ธฐ๋ณธ ์ธํ (3) | 2025.03.11 |
[TIL] Week 7 ํ๋ก์ ํธ ๊ด๋ฆฌ ์๋ฃจ์ ๋ณ ํน์ง (2) | 2025.03.10 |