** ๐Ÿ“Œ RESTful API ์„ค๊ณ„**

URL๊ณผ HTTP ๋ฉ”์„œ๋“œ๋ฅผ ์˜๋ฏธ ์žˆ๊ฒŒ ๋‚˜๋ˆ„์–ด

์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ๋†’์ด๋Š” ์›น ์„œ๋น„์Šค ์„ค๊ณ„ ์›์น™

JSP + Servlet ํ™˜๊ฒฝ์—์„œ์˜ RESTful API ์‹ค์ „ ์„ค๊ณ„ ์˜ˆ์ œ ํฌํ•จ


๐Ÿงฉ ๋ชฉ์ฐจ

  1. REST๋ž€?
  2. RESTful์ด๋ž€?
  3. RESTful URL ์„ค๊ณ„ ์›์น™
  4. HTTP ๋ฉ”์„œ๋“œ์™€ CRUD ๋งคํ•‘
  5. Servlet ๊ธฐ๋ฐ˜ RESTful ์„ค๊ณ„ ์˜ˆ์ œ
  6. ์‹ค๋ฌด ์ ์šฉ ํŒ
  7. ๊ธฐ์ˆ  ๋ฉด์ ‘ ๋Œ€๋น„ ํ•ต์‹ฌ ์š”์•ฝ
  8. ๋งˆ๋ฌด๋ฆฌ ์š”์•ฝ + 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. ๋งˆ๋ฌด๋ฆฌ ์š”์•ฝ ๐Ÿง