CHOOZ๋ ์ฌ์ฉ์๊ฐ ์ฌ๋ฌ ์ฅ์ ์ฌ์ง ์ค "SNS์ ์ด๋ค ์ฌ์ง์ ์ฌ๋ฆด์ง ๊ณ ๋ฏผ๋ ๋" ๋์์ ๋ฐ๊ธฐ ์ํด ๋ง๋ ์ฌ์ง ๊ธฐ๋ฐ ํฌํ SNS ์๋น์ค์ ๋๋ค. ์ฌ์ง ์ ๋ก๋์ ํฌํ ์์ฑ, ์ค์๊ฐ ๊ฒฐ๊ณผ ํ์ธ, ๋๊ธ ์ฐธ์ฌ, ๊ณต์ ๋ฑ ๋ค์ํ API๋ฅผ ์๋ฒ์์ ์ ๊ณตํฉ๋๋ค.
/api/posts, /api/users/me, /api/notifications ๋ฑ ๋ฆฌ์์ค ๊ฒฝ๋ก ์ ์งGET: ์กฐํPOST: ์์ฑ/์ก์
ํธ๋ฆฌ๊ฑฐPUT: ์ ์ฒด ์์ PATCH:์ผ๋ถ ์์ DELETE: ์ญ์ ์์:
/api/users/me/device-tokensํ๋์ ์๋ํฌ์ธํธ์์
POST๋ก ๋ฑ๋กDELETE๋ก ํด์
/posts/{postId}/comments, /posts/{postId}/choices์ ๊ฐ์ด ํ์ ๋ฆฌ์์ค๋ฅผ ๋ช
ํํ๊ฒ ํํํ์ฌ ์๋ฏธ ์ ๋ฌ๋ ฅ ๊ฐํํ์ด์ง, ์ ๋ ฌ, ํํฐ ์กฐ๊ฑด์ ๋ชจ๋ Query๋ก ์ฒ๋ฆฌ
/api/posts?cursor=...&size=10/api/posts/{postId}/comments?page=0&size=5์บ์ฑ๊ณผ ๋ธ๋ผ์ฐ์ ํ์คํ ๋ฆฌ๋ฅผ ์ํด ๊ฐ์ url์์ ์กฐ๊ฑด๋ง ๋ฐ๋๋ ์กฐํ์ผ ๊ฒฝ์ฐ, ์ฟผ๋ฆฌํ๋ผ๋ฏธํฐ ์ ๊ทน์ ํ์ฉ
/posts/{id}: ๊ณต๊ฐ ๋๋ ๋ด ๊ฒ์๋ฌผ๋ง ์ ๊ทผ ๊ฐ๋ฅ/posts/share/{token}: ๋์ ๊ธฐ๋ฐ ๊ณต์ ๋งํฌ ์ ๊ทผ ์ ์ฉ/users/me/posts?type=created ๋ฑ ์ฟผ๋ฆฌ ๊ธฐ๋ฐ ๋ถ๊ธฐ๋ ์ ๋ต ํจํด์ผ๋ก ์ฒ๋ฆฌswitch-case๊ฐ ์๋ ~Strategy ์ธํฐํ์ด์ค๋ก ๊ฐ ํ์
์ ์ ์ฐํ๊ฒ ๋ถ๋ฆฌ โ OCP/users/me vs /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}๋ ๊ณต๊ฐ ์ ๋ณด ์ ์ฉ(์๋ํ๋กํ ์กฐํ)GET, POST, DELETE, PUT) /posts/{id} vs /posts/share/{token} ๊ตฌ๋ถ ๋ช
ํ CHOOZ์ API๋ ๋จ์ํ CRUD ์ค๊ณ๊ฐ ์๋, ๋๋ฉ์ธ ๊ตฌ์กฐ์ ๊ธฐ๋ฐํ ๋ช
ํํ๊ณ RESTfulํ ์ค๊ณ ์ ๋ต์ ๋ง๋๋ ๊ฒ์ด ๋ชฉํ.
์ ์ง๋ณด์์ฑ, ํ์ฅ์ฑ, ์ฌ์ฉ์๊ฒฝํ๊ณผ ๊ด๋ จ๋ ํจ์จ์ ์ธ API์ค๊ณ ํ์.