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์ค๊ณ ํ์.