axios ํต์ ์ params ๋ถ์ฌ์ GET ๋ฐฉ์ ํต์ ํ๊ธฐ
์ผ๊ฐ ๋๋์ง ํ์ถ๊ธฐ (๋ถ์ . ์ฝ์ง ๋ฉ์ถฐ!โฆ)
HappyHouse ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉฐ ๋ฐ์ํ ์๋ฌ๋ฅผ ์ ๋ฆฌํฉ๋๋ค.
๋ฌธ์ ์ํฉ
๋ฌธ์ ๊ฐ ๋ฐ์ํ ๋ฐฐ๊ฒฝ์ ๋ค์๊ณผ ๊ฐ๋ค.
๊ฒ์ํ ์๋น์ค๋ฅผ ๊ตฌํํ๋ ์ค ํน์ ํ๊ทธ๋ค์ด ํฌํจ๋ ๊ฒ์๊ธ์ ์กฐํํ๊ณ ์ ํ๋ค. โ์กฐํโ ๋ชฉ์ ์ด๊ธฐ๋๋ฌธ์ ์์ฒญ ๋ฉ์๋๋ GET
๋ฐฉ์์ผ๋ก ๋ณด๋ด์ผ ํ๊ณ , ํ๊ทธ ๋ฆฌ์คํธ๋ฅผ ํจ๊ป ๋ณด๋ด์ผํ๋ฏ๋ก @RequestBody
๋ก ๋ณด๋ด๋ ค๊ณ ํ๋ค.
๊ทผ๋ฐ, ์๋ฌด๋ฆฌ ํ๋ก ํธ์์ ํ๊ทธ ๋ฆฌ์คํธ๋ฅผ ๋ฐ๋์ ํฌํจํด์ ๋ณด๋ด๋ ๋ฐฑ์๋ ์๋ฒ์์๋ ๋ฐ๋๊ฐ ์๋ค๊ณ ํ๋๊ฑฐ๋ค!! URI๊ฐ ์ถฉ๋ํ๋ ์ค ์๊ณ ๊ฒฝ๋ก๋ ๋ฐ๊ฟ๋ณด๊ณ ์ด๊ฒ ์ ๊ฒ ๋คํด๋ดค๋๋ฐ ์๊ณ ๋ณด๋ GET + Body๊ฐ ๋ถ๊ฐ๋ฅํ๋ ๊ฒโฆ
stackoverflow ๊ธ์ ๋์ถฉ ์์ฝํด๋ณด๋ฉด, axios๋ก ์์ฒญ์ ๋ณด๋ผ ๋ GET + Body๋ฅผ ๋ณด๋ด๋ฉด ์ํ์ฝ๋ 400๋ฒ๋ ์๋ฌ๊ฐ ๋จ๋ฉด์ ์์ฒญ์ด ์๋ชป๋๋ค๊ณ ํ๋ค. ์ด๊ฑด ๋น๋จ axios๋ง์ ๋ฌธ์ ๋ ์๋๊ณ Http ํ๋กํ ์ฝ ์์ฒด๊ฐ Body๋ GET ๋ฐฉ์์ผ๋ก ๋ณด๋ผ ์ ์๊ฒ ๋ง๋ค์ด๋๋ค๊ณ ํ๋ค.(PUT, POST, DELETE, and PATCH ์์ฒญ๋ง ๊ฐ๋ฅ)
** ๊ทธ๋ฐ๋ฐ, ์ฌ๋ฐ๋ ์ฌ์ค์ axio๊ฐ ์๋ ๋ค๋ฅธ ํต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฒฝ์ฐ ์ข ์ข GET + Body๋ฅผ ์ง์ํ๊ธฐ๋ ํ๋ค๊ณ ํ๋ค. ์ฝ๊ฒ ํ ์คํธํด๋ณด๋ ค๋ฉด Postmap API Platform์์ ํด๋ณด๋ฉด ๋๋ค. ํฌ์คํธ๋งจ์์๋ GET + Body ํต์ ์ด ๊ฐ๋ฅํ๋ค.. ใ ใ
์๋ฌดํผ ๋ณธ๋ก ์ผ๋ก ๋์์์, GET + Body๋ ๊ถ์ฅํ์ง ์๋ ๋ฐฉ๋ฒ์ด๋ GET + @RequestParam
๋ฐฉ์์ ์ด์ฉํด์ผํ๋๋ฐ, @RequestParam
๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์๋ URI์ ์ฟผ๋ฆฌ์คํธ๋ง์ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ฌ ๋ณด๋ด๊ธฐ๋๋ฌธ์ ์ ์กํ๋ ๋ฐ์ดํฐ์ ๊ธธ์ด์ ์ ํ์ด ์๊ณ ๋ณด์์ ์ฃผ์ํด์ผํ๋ค๋ ๋ฌธ์ ๊ฐ ์๋ค. ์ง๊ธ ๊ตฌํํ๋ ๋ถ๋ถ์์ ์ ์กํ๋ ๋ฐ์ดํฐ๋ ๊ฒ์๊ธ ํ๊ทธ์ด๊ธฐ๋๋ฌธ์ ๋ณด์์๋ ๋ฌธ์ ๊ฐ ์๊ณ , ๋ฐ์ดํฐ ๊ธธ์ด ๋ฌธ์ ์ญ์ ์ ํ ํ๊ทธ ๊ฐ์๋ฅผ ์ ํํ๋ค๋ฉด ํฐ ๋ฌธ์ ๊ฐ ์์ ๊ฒ์ด๋ผ ํ๋จํ์ฌ GET + @RequestParam
๋ฐฉ์์ ์ฌ์ฉํ๊ธฐ๋ก ํ๋ค!
ํ๋ก ํธ์์ ํ๊ทธ ๋ฆฌ์คํธ๋ฅผ params๋ก ๋ณด๋ด๊ธฐ
Wrong Case
/**
* [GET] ๋ฐฑ์๋ ์๋ฒ์์ ํ๊ทธ๋ก ๊ฒ์๊ธ ์กฐํ
* @param {int} tagList - ํ๊ทธ ๋ฆฌ์คํธ
* @param {function} success - ๊ฒ์๊ธ ์กฐํ ์ฑ๊ณต
* @param {function} fail - ๊ฒ์๊ธ ์กฐํ ์คํจ
*/
function getPostsByTags(tagList, success, fail) {
api.get(`/board/hashtags`, { params: tagList })
.then(success).catch(fail);
}
์ง๊ธ๊น์ง params ๋ถ์ฌ์ ๋ณด๋ด๋๊ฑด ๋ง์ด ํด๋ดค์ผ๋๊น! ๐ ๋ ์ญ์ ๋๋์ง ๊ฐ์ ์๋ฆฌ์๋ค ใ
์์ ๊ฐ์ด ํ๊ทธ ๋ฆฌ์คํธ ๊ฐ์ฒด { tag: [] }
๋ฅผ tagList
ํ๋ผ๋ฏธํฐ๋ก ๋ณด๋๋๋ฐ ๋ฐฑ์์๋ ์ฌ์ ํ ๋ฐ์ง ๋ชปํ๋ค. ์ข ๋ ์ฐพ์๋ณด๋ ๋ฆฌ์คํธ ๊ฐ์ฒด๋ฅผ ๋ณด๋ด๋ ๋ฐฉ์์ ์กฐ๊ธ ๋ค๋ฅด๋๋ผ!
Correct Case
import qs from "qs";
/**
* [GET] ๋ฐฑ์๋ ์๋ฒ์์ ํ๊ทธ๋ก ๊ฒ์๊ธ ์กฐํ
* @param {int} tagList - ํ๊ทธ ๋ฆฌ์คํธ
* @param {function} success - ๊ฒ์๊ธ ์กฐํ ์ฑ๊ณต
* @param {function} fail - ๊ฒ์๊ธ ์กฐํ ์คํจ
*/
function getPostsByTags(tagList, success, fail) {
api.get(`/board/hashtags`, {
params: tagList,
paramsSerializer: params => {
return qs.stringify(params, { arrayFormat : 'brackets' })
}
})
.then(success).catch(fail);
}
ํ๊ทธ ๋ฆฌ์คํธ ์์ ํฌํจ๋ []
๊ดํธ ๋ฌธ์๋ฅผ ์ ๋๋ก ์ธ์ํ์ฌ ๋ฐฐ์ด์ ์ธ๋ฑ์ฑํ์ฌ ๋ณด๋ด๊ธฐ ์ํด์๋ qs
๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํด์ผ ํ๋ค. ํ๊ทธ ๋ฆฌ์คํธ ๋ด์ฉ์ for๋ฌธ ๋๋ฉด์ ๋ฌธ์์ด๋ก ๋ถ์ฌ ์ง์ ์ฟผ๋ฆฌ์คํธ๋ง์ ๋ง๋ค ์๋ ์๊ฒ ์ง๋ง ์ข ๋ ์๋ฆฌํ ๋ฐฉ๋ฒ์ ์ฐ๊ณ ์ถ๋ค๋ฉด ์์ ๊ฐ์ด ํด๋ณด์!
๋ค์๊ณผ ๊ฐ์ด ์์๊ฒ ์ฟผ๋ฆฌ์คํธ๋ง์ ๋ง๋ค์ด์ ์์ฒญ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ณด๋ด์ค๋ค.
"http://happyhouse/board/hashtag/tag[0]=apt&tag[1]=rent"
์ ๊ทธ๋ฆฌ๊ณ qs ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ๊ธฐ ์ํด์๋ ํ๋ก์ ํธ ๊ฒฝ๋ก์์ npm install qs
ํ ๋ค axios ํต์ ๋ฉ์๋๊ฐ ํฌํจ๋ ํ์ผ ์๋จ์ import qs from "qs";
ํด์ผํจ์ ์์ง ๋ง์!
๋ฐฑ์์ ํ๊ทธ ๋ฆฌ์คํธ๋ฅผ params๋ก ๋ฐ๊ธฐ
์ฌ๊ธฐ๊น์ง ํ๋ฉด ๋ค์ธ ์ค ์์๋๋ฐ ๋ฐฑ์์๋ ์ฌ์ ํ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ชป๋ฐ์๋คโฆ GET + Params๋ฅผ ์ฐพ์๋ด๋ ๊ฑฐ์ ๋ค ํ๋ก ํธ์๋์์ ๋ณด๋ด๋ ๋ฐฉ์๋ง ์ค๋ช ํด๋๊ณ ๋ฐฑ์๋์์ ๋ฐ๋ ๋ฐฉ์์ ์ ๋ฆฌ๊ฐ ์๋์ด์๋๋ผ. ์ด๊ฑด ๋๋ฌด ๊ธฐ๋ณธ์ด๋ผ ๊ทธ๋ฐ๊ฑธ๊นโฆ? ๋๋์ง๋ ์ค๋๋ ์๋กญ๊ฒ ๋ฐฐ์๋๋ค..๐ฅฒ
๋ฐฑ์๋์์ GET ๋ฉ์๋๋ก ์จ RequestParam์ ๋ฐ๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ด ํด์ค์ผ ํ๋ค. ์ฐธ๊ณ ๋ก ๋ฐฑ์๋ ์๋ฒ๋ Spring Boot ํ๊ฒฝ์ผ๋ก ๊ตฌํ์ค์ด๋ค.
@GetMapping("/hashtags")
public ResponseEntity<List<Post>> retrievePostByHashtag(@RequestParam(value="tag[]") String[] hashtagList) {
List<Post> posts = postService.retrievePostsByHashtag(hashtagList);
if (posts.size()!=0) return ResponseEntity.ok(posts);
else return ResponseEntity.noContent().build();
}
์ปจํธ๋กค๋ฌ์์ ๋งค๊ฐ๋ณ์๋ก String ํ์
์ ๋ฐฐ์ด์ ๋ฐ๋ก ๋ฐ์ ์ ์๋๋ฐ, @RequestParam(value="tag[]")
์ด๋
ธํ
์ด์
์ ์ ๋ถ์ฌ์ค์ผ ํ๋ค.
value=โparams ๋ฐฐ์ด์ value์ผ๋ก ๊ฐ๋ ๊ฐ์ฒด์์ key์ด๋ฆ[]โ
{ tag: [] }
์์ โtagโ๋ฅผ value์ ๊ฐ๋ถ๋ถ์ ๋ฃ์ด์ฃผ๊ณ ๋ฐ๋ก ๋ค์ ๋ฐฐ์ด์ ํํํ๋ โ[]โ์ ๋ถ์ฌ์ค๋ค
์ด๋ ๊ฒํ๋ฉด GET ๋ฉ์๋๋ฅผ ํตํด ๋ณด๋ธ ํ๋ผ๋ฏธํฐ ๋ฐฐ์ด ๊ฐ์ฒด๋ฅผ ๋ฐฐ์ด๋ก ๋ฐ์ ์ฌ์ฉํ ์ ์๋ค!
์ง์ง ๋!