๐โ๋ฆฌ๋ทฐ ๊ธฐ๋ฅ์ UX์์ ์์ํด, REST๋ก ์์ฑ๋๋ค โ ReviewAjaxController ๊ตฌํ๊ธฐโ
๐ 2025-07-02 | โ๏ธ ๋ฐ์ฐฌํฌ |
๐ง ๊ตฌํ ๋ชฉํ
๊ธฐ์กด ๊ฐ์ ๋ฆฌ๋ทฐ ๊ธฐ๋ฅ์ ์ ํต์ ์ธ JSP ํผ ์ ์ถ ๋ฐฉ์์ด์๋ค.
๋ฆฌ๋ทฐ๋ฅผ ๋ฑ๋กํ๋ฉด ํ๋ฉด์ด ์๋ก๊ณ ์นจ๋๊ณ , ๋ฆฌ๋ทฐ ๋ฆฌ์คํธ๋ฅผ ๋ค์ ๋ณด๊ธฐ ์ํด์ ํ์ด์ง ์ ์ฒด๋ฅผ ๋ฆฌ๋ ๋๋งํด์ผ ํ๋ค.
์ฌ์ฉ์ ์ ์ฅ์์ ์ด๊ฑด ๋๋ฌด ๊ฑฐ์ฌ๋ฆฐ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฐฑ์๋ ๊ด์ ์์๋ ๋๋ฌด ๋นํจ์จ์ ์ด๋ค.
๊ทธ๋์ ์ด๋ฒ์ ์ค๊ณํ ๊ฑด ์์ ํ ์๋กญ๊ฒ ๋ถ๋ฆฌ๋ Ajax ๊ธฐ๋ฐ ์ปจํธ๋กค๋ฌ.
RESTful ๊ตฌ์กฐ๋ก ๋ฆฌ๋ทฐ ๋ฑ๋ก
๊ณผ ๋ฆฌ๋ทฐ ์กฐํ
๋ฅผ ์์ ํ ๋ถ๋ฆฌํ๊ณ ,
ํ๋ก ํธ์์ JSON ์ฐ๋์ ๊ณ ๋ คํด UX๋ฅผ ํด์น์ง ์์ผ๋ฉด์๋ ๊ตฌ์กฐ์ ์ผ๋ก ๋ช ํํ API๋ฅผ ๊ตฌํํ๋ค.
๐ ์ฃผ์ ์๋ ์์ฝ
ํญ๋ชฉ | ํต์ฌ ์ค๊ณ |
---|---|
๋ฆฌ๋ทฐ ์กฐํ | GET /review?lectureId=1 โ JSON ๋ฐฐ์ด ๋ฐํ |
๋ฆฌ๋ทฐ ๋ฑ๋ก | POST /review โ JSON ์๋ต + ๋ฆฌ๋ค์ด๋ ํธ URL ํฌํจ |
์ธ์ฆ ์ฒดํฌ | ์ธ์ ๊ธฐ๋ฐ ์ธ์ฆ ๋ฏธํต๊ณผ ์ 401 ๋ฐํ |
์์ธ ํ๋ฆ | 400 / 401 / 500 ๋ฑ ์ํฉ๋ณ ์ํ ์ฝ๋ + ๋ฉ์์ง ๋ช ์ |
์๋ต ํฌ๋งท | { success, message?, data? } ๋ก ํต์ผ๋ ๊ตฌ์กฐ |
๐งฑ ์ ์ฒด ๊ตฌ์กฐ
[Client]
โ AJAX
[ReviewAjaxController]
โ ReviewService
โ ReviewDAO
โ MySQL
- ์ปจํธ๋กค๋ฌ๋ ํ๋ฆ๋ง,
- ์๋น์ค๋ ๋น์ฆ๋์ค ์กฐ๊ฑด ํ๋จ,
- DAO๋ DB ์ฟผ๋ฆฌ ์คํ
- ์๋ต์ ํญ์ JSON ๊ธฐ๋ฐ์ผ๋ก ๋ฐํ
โ๏ธ ์ฃผ์ ๊ธฐ๋ฅ ํ๋ฆ
โ
1. ๋ฆฌ๋ทฐ ์กฐํ โ GET /review?lectureId=1
int lectureId = Integer.parseInt(req.getParameter("lectureId"));
List<ReviewDTO> reviews = reviewService.getReviewsByLectureId(lectureId);
gson.toJson(reviews, res.getWriter());
- ํ๋ก ํธ์์ ๊ฐ์ ID๋ง ๋๊ธฐ๋ฉด, ์๋ฒ๋ ๋ฆฌ์คํธ๋ฅผ JSON ๋ฐฐ์ด๋ก ์๋ต
- Service ๋จ์์
LocalDateTime โ yyyy-MM-dd HH:mm
ํฌ๋งท ์ฒ๋ฆฌ - ์๋ต์ content-type: application/json
๐ ํ๋ก ํธ๋ ๋จ์ํ ๋ฆฌ์คํธ ๋ฐ์ ๋ ๋๋ง๋ง ํ๋ฉด ๋๋ค. ์๋ฒ๊ฐ ๋ชจ๋ ํ์์ ์ฑ ์์ง๋ค.
โ
2. ๋ฆฌ๋ทฐ ๋ฑ๋ก โ POST /review
UserDTO user = (UserDTO) session.getAttribute("user");
if (user == null) {
resp.setStatus(401);
...
}
ReviewDTO dto = new ReviewDTO();
dto.setLectureId(lectureId);
dto.setUserId(user.getUserId());
...
reviewService.addReview(dto);
- ์ธ์ ๊ฒ์ฆ โ ํ๋ผ๋ฏธํฐ ์์ โ DTO ์์ฑ โ Service ํธ์ถ
- ๋ฑ๋ก ์ฑ๊ณต ์
{ success: true, redirectUrl: "/lecture/play?lectureId=1" }
๋ฐํ - ํ๋ก ํธ๋ ์๋ต๋ฐ๊ณ
location.href = redirectUrl
๋ก ์ด๋ ์ฒ๋ฆฌ
๐ POST ์์ฒญ์ธ๋ฐ๋ ์๋ก๊ณ ์นจ์ ์๋ค. ์ฌ์ฉ์๋ โํ๋ฆโ์ด ๋๊ธฐ์ง ์๋๋ค.
๐ง ํธ๋ฌ๋ธ์ํ ์ฌ๋ก
โ lectureId ์์ ๋ 500 ์๋ฌ โ 400์ผ๋ก ์์
- ์ด๊ธฐ์๋
Integer.parseInt()
์์ ์๋ฌ๊ฐ ํฐ์ง๋ฉฐ 500 Internal Server Error ๋ฐํ๋จ - ๊ฐ์ : ํ๋ผ๋ฏธํฐ ๋๋ฝ ์ catch๋ก ์ก๊ณ 400 Bad Request ์๋ต + ๋ฉ์์ง ํฌํจ
try {
...
} catch (NumberFormatException e) {
resp.setStatus(HttpServletResponse.SC_BAD_REQUEST);
result.put("message", "๊ฐ์ ID๊ฐ ์ ํจํ์ง ์์ต๋๋ค.");
}
๐ ํด๋ผ์ด์ธํธ์์ ์ ๋ขฐ๋ ์ ํํ ์๋ฌ์ฝ๋๋ถํฐ ์์๋๋ค.
๐ง ๋ฐฐ์ด ์
- RESTfulํ๊ฒ API๋ฅผ ๋๋๋ฉด, ํด๋ผ์ด์ธํธ๋ ์์ฐ์ค๋ฝ๊ฒ ์ค๊ณ๊ฐ ๊น๋ํด์ง๋ค.
- ๋ฆฌ๋ทฐ ๋ฑ๋ก์ POST๋ก ๋ถ๋ฆฌํ๊ณ , JSON ํฌ๋งท์ ํต์ผํด๋๋, React/Vue ๋ฑ ํ๋ก ํธ ํ๋ ์์ํฌ์์๋ ์ฝ๊ฒ ์ฌ์ฌ์ฉ๋๋ค.
-
๊ฐ์ฅ ์ค์ํ ๊ฑด โ๋ฆฌ๋ทฐ๋ฅผ ์ด ์ฌ์ฉ์๊ฐ UI ์ค๋จ ์์ด ํ๋ฆ์ ์ด์ด๊ฐ ์ ์๊ฒ ํ๋ ๊ฒโ์ด์๊ณ ,
์ด๋ฒ ๋ฆฌํฉํ ๋ง์ผ๋ก ์ด ๋ถ๋ถ์ ์ ๋๋ก ์ก์๋ค.
โ๏ธ ํ๊ณ
์ด๋ฒ ReviewAjaxController
๋ ๋จ์ ๋ฆฌ๋ทฐ API๊ฐ ์๋์๋ค.
๊ทธ ์์๋ ์ฌ์ฉ์ ํ๋ฆ, ์๋ฒ ํ์ฅ์ฑ, ๋ณด์, ์์ธ ํ๋ฆ ๋ฑ ์ค๋ฌด ๊ฐ๋ฐ์ ํต์ฌ์ด ๋ค ๋ค์ด์์๋ค.
โAjax๋ฅผ ๋จ์ง ๊ธฐ์ ๋ก ์ฐ์ง ๋ง์.
ํ๋ฆ์ ๋์ง ์๋ ๊ตฌ์กฐ ์์ฒด๋ก ์ฌ์ฉ์ ๊ฒฝํ์ ์ค๊ณํ์.โ
ํ๋ก ํธ์ ๋ฐฑ์๋๊ฐ ์์ฐ์ค๋ฝ๊ฒ ๋ํํ ์ ์๋๋ก,
์ด ์ปจํธ๋กค๋ฌ๋ JSON ์๋ต์ ์ค์ฌ์ผ๋ก ๋ช ํํ๊ฒ ์ค๊ณ๋์๋ค.