๐Ÿ”ฅ RESTful API ์„ค๊ณ„ ์ „๋žต๊ณผ ์ง€ํ–ฅ์ 

Dev-Oยท2025๋…„ 5์›” 17์ผ
0

SideProject

๋ชฉ๋ก ๋ณด๊ธฐ
6/7

๐Ÿ”ฅ RESTful API ์„ค๊ณ„ ์ „๋žต๊ณผ ์ง€ํ–ฅ์ 

โœจ ์„œ๋น„์Šค ๊ฐœ์š”

CHOOZ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์—ฌ๋Ÿฌ ์žฅ์˜ ์‚ฌ์ง„ ์ค‘ "SNS์— ์–ด๋–ค ์‚ฌ์ง„์„ ์˜ฌ๋ฆด์ง€ ๊ณ ๋ฏผ๋  ๋•Œ" ๋„์›€์„ ๋ฐ›๊ธฐ ์œ„ํ•ด ๋งŒ๋“  ์‚ฌ์ง„ ๊ธฐ๋ฐ˜ ํˆฌํ‘œ SNS ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. ์‚ฌ์ง„ ์—…๋กœ๋“œ์™€ ํˆฌํ‘œ ์ƒ์„ฑ, ์‹ค์‹œ๊ฐ„ ๊ฒฐ๊ณผ ํ™•์ธ, ๋Œ“๊ธ€ ์ฐธ์—ฌ, ๊ณต์œ  ๋“ฑ ๋‹ค์–‘ํ•œ API๋ฅผ ์„œ๋ฒ„์—์„œ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.


โœ… RESTful API ์„ค๊ณ„ ์ „๋žต

1. ๋„๋ฉ”์ธ ์ค‘์‹ฌ์˜ ๋ฆฌ์†Œ์Šค ์„ค๊ณ„

  • ๋ชจ๋“  API ์—”๋“œํฌ์ธํŠธ๋Š” ๋„๋ฉ”์ธ ๊ฐœ๋…(Post, Comment, Notification, User ๋“ฑ)์„ ์ค‘์‹ฌ์œผ๋กœ ๋‚˜๋‰˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • /api/posts, /api/users/me, /api/notifications ๋“ฑ ๋ฆฌ์†Œ์Šค ๊ฒฝ๋กœ ์œ ์ง€

2. HTTP Method์˜ ์—ญํ•  ๋ถ„๋ฆฌ

  • GET: ์กฐํšŒ
  • POST: ์ƒ์„ฑ/์•ก์…˜ ํŠธ๋ฆฌ๊ฑฐ
  • PUT: ์ „์ฒด ์ˆ˜์ •
  • PATCH:์ผ๋ถ€ ์ˆ˜์ •
  • DELETE: ์‚ญ์ œ

์˜ˆ์‹œ: /api/users/me/device-tokens ํ•˜๋‚˜์˜ ์—”๋“œํฌ์ธํŠธ์—์„œ

  • POST๋กœ ๋“ฑ๋ก
  • DELETE๋กœ ํ•ด์ œ

3. ๋ฆฌ์†Œ์Šค ๊ณ„์ธต ๊ตฌ์กฐ ํ‘œํ˜„

  • /posts/{postId}/comments, /posts/{postId}/choices์™€ ๊ฐ™์ด ํ•˜์œ„ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜์—ฌ ์˜๋ฏธ ์ „๋‹ฌ๋ ฅ ๊ฐ•ํ™”

4. Query Parameter ํ™œ์šฉ ์ตœ์ ํ™”

  • ํŽ˜์ด์ง•, ์ •๋ ฌ, ํ•„ํ„ฐ ์กฐ๊ฑด์€ ๋ชจ๋‘ Query๋กœ ์ฒ˜๋ฆฌ

    • /api/posts?cursor=...&size=10
    • /api/posts/{postId}/comments?page=0&size=5
  • ์บ์‹ฑ๊ณผ ๋ธŒ๋ผ์šฐ์ € ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์œ„ํ•ด ๊ฐ™์€ url์—์„œ ์กฐ๊ฑด๋งŒ ๋ฐ”๋€Œ๋Š” ์กฐํšŒ์ผ ๊ฒฝ์šฐ, ์ฟผ๋ฆฌํŒŒ๋ผ๋ฏธํ„ฐ ์ ๊ทน์  ํ™œ์šฉ

5. me ํ‘œํ˜„ ๋„์ž…

  • ์‚ฌ์šฉ์ž ID๋ฅผ ์•Œ์ง€ ์•Š๊ณ ๋„ ํด๋ผ์ด์–ธํŠธ์—์„œ ๋‚ด ์ •๋ณด ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ

6. ๊ณต๊ฐœ๋ฒ”์œ„์— ๋”ฐ๋ฅธ ์„ค๊ณ„ ๋ถ„๊ธฐ

  • /posts/{id}: ๊ณต๊ฐœ ๋˜๋Š” ๋‚ด ๊ฒŒ์‹œ๋ฌผ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • /posts/share/{token}: ๋‚œ์ˆ˜ ๊ธฐ๋ฐ˜ ๊ณต์œ  ๋งํฌ ์ ‘๊ทผ ์ „์šฉ
  • ์„œ๋ฒ„์—์„œ๋Š” ํ•ญ์ƒ ๊ถŒํ•œ ๊ฒ€์ฆ(ํ† ํฐ ๋˜๋Š” ์ž‘์„ฑ์ž ์—ฌ๋ถ€)

7. ํ‘ธ์‹œ์•Œ๋ฆผ์€ ๋น„๋™๊ธฐ ๋‚ด๋ถ€ ํŠธ๋ฆฌ๊ฑฐ๋กœ ์ฒ˜๋ฆฌ

  • ํˆฌํ‘œ, ๋Œ“๊ธ€ ๋“ฑ์˜ ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ ์„œ๋ฒ„ ๋‚ด๋ถ€์—์„œ ์•Œ๋ฆผ ๋ฐœ์†ก
  • REST API๋Š” ๋””๋ฐ”์ด์Šค ๋“ฑ๋ก, ์•Œ๋ฆผ ์„ค์ •๋งŒ ์ œ๊ณตํ•˜๊ณ , ์‹ค์ œ ๋ฐœ์†ก์€ ๋กœ์ง์— ๋‚ด์žฌํ™”

8. ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์ „๋žต ํŒจํ„ด ๊ตฌ์กฐ ๋„์ž…

  • /users/me/posts?type=created ๋“ฑ ์ฟผ๋ฆฌ ๊ธฐ๋ฐ˜ ๋ถ„๊ธฐ๋Š” ์ „๋žต ํŒจํ„ด์œผ๋กœ ์ฒ˜๋ฆฌ
  • switch-case๊ฐ€ ์•„๋‹Œ ~Strategy ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๊ฐ ํƒ€์ž…์„ ์œ ์—ฐํ•˜๊ฒŒ ๋ถ„๋ฆฌ โ†’ OCP

๐Ÿ” ๋ณด์•ˆ ์„ค๊ณ„ ์›์น™ ์ ์šฉ ์‚ฌ๋ก€

โœ… /users/me vs /users/{userId} ๋ช…ํ™•ํ•œ ๋ถ„๋ฆฌ

  • /users/me: ๋ฏผ๊ฐ ์ •๋ณด ํฌํ•จ ๊ฐ€๋Šฅ (์ด๋ฉ”์ผ, ์•Œ๋ฆผ ์„ค์ • ๋“ฑ)
  • /users/{userId}: ํ”„๋กœํ•„๋งŒ ๊ณต๊ฐœ, ๋‹ค๋ฅธ ์œ ์ € ์ •๋ณด๋Š” ๊ถŒํ•œ ์ œํ•œ ํ•„์ˆ˜

๐Ÿ” ์ด์œ  ๋ฐ ์žฅ์ 

๋น„๊ต ํ•ญ๋ชฉ/users/me/users/{userId}
๋ฏผ๊ฐ ์ •๋ณด ํฌํ•จโœ…โŒ
userId ๋…ธ์ถœ ํ•„์š”โŒโœ…
์ธ์ฆ ๊ธฐ๋ฐ˜ ์ฒ˜๋ฆฌโœ…โš ๏ธ

/me๋Š” JWT ๊ธฐ๋ฐ˜ ์‚ฌ์šฉ์ž ํŒ๋ณ„์ด ํ™•์ •์ ์ด๋ฏ€๋กœ ์‹ค์ˆ˜ ๊ฐ€๋Šฅ์„ฑ์ด ๊ฑฐ์˜ ์—†์Œ
/users/{userId}๋Š” ๋ณด์•ˆ ์‹ค์ˆ˜๋กœ ์ธํ•ด ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๊ฐ€ ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ์Œ(๊ถŒํ•œ์ฒดํฌ๋กœ์ง ํ•„์ˆ˜)
๊ณต๊ฐœ๋œ ํ”„๋กœํ•„ ๊ฒŒ์‹œ๋ฌผ ์กฐํšŒ์‹œ์—๋งŒ, {userId}๋กœ ์ ‘๊ทผ.

์˜ˆ์‹œ ๋ฌธ์ œ

//๋‚ด์ •๋ณด์กฐํšŒ
@putMapping("/users/{userId}") 
public UserInfo getUser(@PathVariable Long userId) {
    return userRepository.findById(userId); // ๊ถŒํ•œ ์ฒดํฌ ๋น ์ง
}

ํ•„์ˆ˜์‚ฌํ•ญ

  • /me๋Š” ๋ฏผ๊ฐ ์ •๋ณด ์ „์šฉ(๋‚ด์ •๋ณด์กฐํšŒ ๋ฐ ์ˆ˜์ •)
  • /users/{id}๋Š” ๊ณต๊ฐœ ์ •๋ณด ์ „์šฉ(์ƒ๋Œ€ํ”„๋กœํ•„ ์กฐํšŒ)
  • ํ”„๋ก ํŠธ์—”๋“œ๋Š” ๋‘ ๊ฒฝ๋กœ๋ฅผ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•ด ์‚ฌ์šฉ

๐Ÿ”ฌ ๊ณ ๋ คํ•œ RESTful ์„ค๊ณ„

  1. ์ž์› ์ค‘์‹ฌ(Resource-Oriented)
    • ๋ชจ๋“  ๊ธฐ๋Šฅ์€ ๋„๋ฉ”์ธ ๋‹จ์œ„ ๋ฆฌ์†Œ์Šค๋กœ ๋ถ„๋ฆฌ๋จ
  2. HTTP ๋ช…์„ธ ์ค€์ˆ˜
    • ๋ฉ”์„œ๋“œ ๋ณ„ ์—ญํ•  ๊ตฌ๋ถ„ (GET, POST, DELETE, PUT)
  3. URI์˜ ์ผ๊ด€์„ฑ๊ณผ ๋ช…ํ™•์„ฑ
    • /posts/{id} vs /posts/share/{token} ๊ตฌ๋ถ„ ๋ช…ํ™•
  4. ๋ฌด์ƒํƒœ์„ฑ(Stateless)
    • JWT ํ† ํฐ์œผ๋กœ ์ธ์ฆ, ์š”์ฒญ๋งˆ๋‹ค ๋…๋ฆฝ ์ฒ˜๋ฆฌ
  5. ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ๋ถ„๋ฆฌ
    • ํ”„๋ก ํŠธ๋Š” ์ƒํƒœ๋งŒ ๊ด€๋ฆฌ, ๋ฐฑ์—”๋“œ๋Š” ๋ช…ํ™•ํ•œ API ์‘๋‹ต ์„ค๊ณ„
  6. ์บ์‹œ ๊ฐ€๋Šฅ์„ฑ
    • GET ์š”์ฒญ ์ค‘์‹ฌ์˜ ๋ฆฌ์ŠคํŠธ ์กฐํšŒ๋Š” ์บ์‹ฑ ๊ฐ€๋Šฅ์„ฑ ๊ณ ๋ คํ•จ

โœจ ๋งˆ๋ฌด๋ฆฌ

CHOOZ์˜ API๋Š” ๋‹จ์ˆœํ•œ CRUD ์„ค๊ณ„๊ฐ€ ์•„๋‹Œ, ๋„๋ฉ”์ธ ๊ตฌ์กฐ์— ๊ธฐ๋ฐ˜ํ•œ ๋ช…ํ™•ํ•˜๊ณ  RESTfulํ•œ ์„ค๊ณ„ ์ „๋žต์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ.
์œ ์ง€๋ณด์ˆ˜์„ฑ, ํ™•์žฅ์„ฑ, ์‚ฌ์šฉ์ž๊ฒฝํ—˜๊ณผ ๊ด€๋ จ๋œ ํšจ์œจ์ ์ธ API์„ค๊ณ„ ํ•„์š”.

profile
To Be Outstanding, To Foster Understanding๐Ÿš€

0๊ฐœ์˜ ๋Œ“๊ธ€