** ๐ RESTful API ์ค๊ณ**
URL๊ณผ HTTP ๋ฉ์๋๋ฅผ ์๋ฏธ ์๊ฒ ๋๋์ด
์ ์ง๋ณด์์ฑ๊ณผ ํ์ฅ์ฑ์ ๋์ด๋ ์น ์๋น์ค ์ค๊ณ ์์น
JSP + Servlet ํ๊ฒฝ์์์ RESTful API ์ค์ ์ค๊ณ ์์ ํฌํจ
๐งฉ ๋ชฉ์ฐจ
- REST๋?
- RESTful์ด๋?
- RESTful URL ์ค๊ณ ์์น
- HTTP ๋ฉ์๋์ CRUD ๋งคํ
- Servlet ๊ธฐ๋ฐ RESTful ์ค๊ณ ์์
- ์ค๋ฌด ์ ์ฉ ํ
- ๊ธฐ์ ๋ฉด์ ๋๋น ํต์ฌ ์์ฝ
- ๋ง๋ฌด๋ฆฌ ์์ฝ + Notion ์์ฑ ํ
โ
1. REST๋?
ํญ๋ชฉ |
์ค๋ช
|
์ ์ |
REpresentational State Transfer โ ์์์ ๋ช
ํํ ํํํ๊ณ ์ํ๋ฅผ ์ ์กํ๋ ์ค๊ณ ๋ฐฉ์ |
ํน์ง |
URL์ ์์(Resource) ๋ฅผ ๋ํ๋ด๊ณ , ๋์ฌ(ํ์) ๋ HTTP ๋ฉ์๋๋ก ํํ |
๋ชฉ์ |
์น ์๋น์ค์ ๊ตฌ์กฐ๋ฅผ ๋จ์ํ๊ณ ๋ช
ํํ๊ฒ ๋ง๋ค์ด ์ ์ง๋ณด์์ฑ โ |
โ
2. RESTful์ด๋?
๊ตฌ๋ถ |
์ค๋ช
|
RESTful |
REST ์์น์ ์ ์งํจ API ์ค๊ณ ๋ฐฉ์ (์์ ์ค์ฌ, ๋ฉ์๋ ๋ช
ํ, ์ํ ๋ฌด๊ด) |
์ |
/posts/3 โ ๊ฒ์๊ธ 3๋ฒ์ ์๋ฏธ. GET/PUT/DELETE ๋ฑ์ ๋ฉ์๋๋ก ๊ตฌ๋ถ |
๋นRESTful |
/getPost.do , /deletePost.jsp ์ฒ๋ผ URL์ ๋์ฌ๊ฐ ํฌํจ๋๋ ๋ฐฉ์ โ |
โ
3. RESTful URL ์ค๊ณ ์์น
ํญ๋ชฉ |
์์ |
์๋ฏธ |
โ
๋ช
์ฌ ์ฌ์ฉ |
/users |
์ฌ์ฉ์ ๋ชฉ๋ก |
โ
๋ฆฌ์์ค ID |
/users/5 |
ID๊ฐ 5์ธ ์ฌ์ฉ์ |
โ
ํ์ ๊ด๊ณ |
/users/5/posts |
์ฌ์ฉ์ 5์ ๊ฒ์๊ธ ๋ชฉ๋ก |
โ ๋์ฌ ํฌํจ ๊ธ์ง |
/getUser.do , /deleteUser.jsp |
๋น๊ถ์ฅ ๋ฐฉ์ |
โ
4. HTTP ๋ฉ์๋์ CRUD ๋งคํ
๋ฉ์๋ |
์๋ฏธ |
์ฌ์ฉ ์ |
GET |
์กฐํ (Read) |
/posts , /posts/1 |
POST |
์์ฑ (Create) |
/posts |
PUT |
์์ (Update) |
/posts/1 |
DELETE |
์ญ์ (Delete) |
/posts/1 |
๐ก JSP/Servlet์์๋ ์ค์ ๋ฉ์๋์ ๋ฐ๋ผ doGet, doPost, doPut, doDelete ๋ฑ ์ฌ์ฉ ๊ฐ๋ฅ (๋จ, JS์์ PUT/DELETE ์์ฒญ ์ JS + ํํฐ ํ์)
โ
5. Servlet ๊ธฐ๋ฐ RESTful ์ค๊ณ ์์ ๐ฏ
๐ URL ์ค๊ณ ์
๊ธฐ๋ฅ |
URL |
๋ฉ์๋ |
์ค๋ช
|
๊ฒ์๊ธ ์ ์ฒด ์กฐํ |
/posts |
GET |
๊ฒ์๊ธ ๋ชฉ๋ก ๋ณด๊ธฐ |
๊ฒ์๊ธ ์์ธ ์กฐํ |
/posts/5 |
GET |
5๋ฒ ๊ธ ๋ณด๊ธฐ |
๊ฒ์๊ธ ๋ฑ๋ก |
/posts |
POST |
์ ๊ธ ์์ฑ |
๊ฒ์๊ธ ์์ |
/posts/5 |
PUT |
5๋ฒ ๊ธ ์์ |
๊ฒ์๊ธ ์ญ์ |
/posts/5 |
DELETE |
5๋ฒ ๊ธ ์ญ์ |
๐ PostsServlet.java (๋จ์ผ ์๋ธ๋ฆฟ ์ฒ๋ฆฌ)
@WebServlet("/posts/*")
public class PostsServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String pathInfo = req.getPathInfo(); // / or /5
if (pathInfo == null || "/".equals(pathInfo)) {
// ์ ์ฒด ๋ชฉ๋ก ์กฐํ
} else {
// ํน์ ๊ฒ์๊ธ ์์ธ ์กฐํ
int id = Integer.parseInt(pathInfo.substring(1));
}
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// ์ ๊ฒ์๊ธ ๋ฑ๋ก ์ฒ๋ฆฌ
}
protected void doPut(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// ๊ฒ์๊ธ ์์ ์ฒ๋ฆฌ
}
protected void doDelete(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// ๊ฒ์๊ธ ์ญ์ ์ฒ๋ฆฌ
}
}
โ
PUT/DELETE ์์ฒญ ๋ณด๋ด๊ธฐ (JS์์)
fetch("/posts/5", {
method: "DELETE"
}).then(res => res.text()).then(msg => alert(msg));
๐ก JSP/Servlet ํ๊ฒฝ์์๋ PUT/DELETE ์์ฒญ์ ํํฐ๋ JS๋ก ๋ณด๋ด์ผ ํจ
โ
6. ์ค๋ฌด ์ ์ฉ ํ
ํญ๋ชฉ |
ํ |
RESTful ๊ตฌ์กฐ ์ ์ง |
URL์ ํญ์ ๋ช
์ฌํ, ๋ฉ์๋๋ ๋์์ ๋๋ |
ID ํ๋ผ๋ฏธํฐ๋ path์ ํฌํจ |
/users/5 , /posts/3 |
PUT/DELETE ์ฌ์ฉ ์ |
JS fetch๋ก ๋ฉ์๋ ์ง์ ๋๋ hidden input ์ฌ์ฉ |
์ปจํธ๋กค๋ฌ ๋ถ๋ฆฌ |
/posts , /users ๋ฑ ๋ฆฌ์์ค ๋จ์๋ก ์๋ธ๋ฆฟ ๋ถ๋ฆฌ ๊ถ์ฅ |
โ
7. ๊ธฐ์ ๋ฉด์ ๋๋น ํต์ฌ ์์ฝ ๐ฌ
์ง๋ฌธ |
์์ ์ ๋ฆฌ |
REST๋? |
์์์ ๋ช
์ฌ๋ก ํํํ๊ณ , ์ํ๋ HTTP ๋ฉ์๋๋ก ๊ตฌ๋ถํ๋ ์ค๊ณ ์์น |
RESTful URL ์ค๊ณ ์์น์? |
URL์ ๋ช
์ฌ๋ก, ๋ฉ์๋์ ๋ฐ๋ผ ์๋ฏธ ๊ตฌ๋ถ (GET/POST/PUT/DELETE) |
Servlet์์ REST ๋ฐฉ์ ์ ์ฉ ์๋? |
@WebServlet("/posts/*") โ pathInfo๋ก ๋ฆฌ์์ค ๊ตฌ๋ถ |
PUT/DELETE๋ ์ด๋ป๊ฒ ๊ตฌํํ๋์? |
JS fetch๋ก ์์ฒญํ๊ฑฐ๋ _method=PUT ๋ฐฉ์์ผ๋ก ์ ํ ์ฒ๋ฆฌ |
โ
8. ๋ง๋ฌด๋ฆฌ ์์ฝ ๐ง
- ๐ REST๋ URL์ ๋ฆฌ์์ค(๋ช
์ฌ) ๋ก ์ค๊ณํ๊ณ , ๋ฉ์๋๋ก ํ์ ๋ฅผ ๊ตฌ๋ถ
- ๐ฆ Servlet์์๋
doGet
, doPost
, doPut
, doDelete
ํ์ฉ ๊ฐ๋ฅ
- ๐ซ
.do
, .jsp
๋ฑ์ ๋์ฌ ๊ธฐ๋ฐ URL์ RESTfulํ์ง ์์
- โ
ํด๋ฆฐํ URL ๊ตฌ์กฐ์ ๋ช
ํํ ์ญํ ๋ถ๋ฆฌ๋ ์ ์ง๋ณด์์ฑ์ ๋์ฌ์ค