axios ํ†ต์‹  ์‹œ params ๋ถ™์—ฌ์„œ GET ๋ฐฉ์‹ ํ†ต์‹ ํ•˜๊ธฐ

์ผ๊ฐ„ ๋‘๋”์ง€ ํƒˆ์ถœ๊ธฐ (๋ถ€์ œ. ์‚ฝ์งˆ ๋ฉˆ์ถฐ!โ€ฆ)
HappyHouse ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉฐ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ ์ƒํ™ฉ

๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ๋ฐฐ๊ฒฝ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๊ฒŒ์‹œํŒ ์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋˜ ์ค‘ ํŠน์ • ํƒœ๊ทธ๋“ค์ด ํฌํ•จ๋œ ๊ฒŒ์‹œ๊ธ€์„ ์กฐํšŒํ•˜๊ณ ์ž ํ–ˆ๋‹ค. โ€œ์กฐํšŒโ€ ๋ชฉ์ ์ด๊ธฐ๋•Œ๋ฌธ์— ์š”์ฒญ ๋ฉ”์„œ๋“œ๋Š” GET ๋ฐฉ์‹์œผ๋กœ ๋ณด๋‚ด์•ผ ํ–ˆ๊ณ , ํƒœ๊ทธ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ•จ๊ป˜ ๋ณด๋‚ด์•ผํ•˜๋ฏ€๋กœ @RequestBody๋กœ ๋ณด๋‚ด๋ ค๊ณ  ํ–ˆ๋‹ค.

๊ทผ๋ฐ, ์•„๋ฌด๋ฆฌ ํ”„๋ก ํŠธ์—์„œ ํƒœ๊ทธ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ”๋””์— ํฌํ•จํ•ด์„œ ๋ณด๋‚ด๋„ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์—์„œ๋Š” ๋ฐ”๋””๊ฐ€ ์—†๋‹ค๊ณ  ํ•˜๋Š”๊ฑฐ๋‹ค!! URI๊ฐ€ ์ถฉ๋Œํ•˜๋Š” ์ค„ ์•Œ๊ณ  ๊ฒฝ๋กœ๋„ ๋ฐ”๊ฟ”๋ณด๊ณ  ์ด๊ฒƒ ์ €๊ฒƒ ๋‹คํ•ด๋ดค๋Š”๋ฐ ์•Œ๊ณ ๋ณด๋‹ˆ GET + Body๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ–ˆ๋˜ ๊ฒƒโ€ฆ

axios-get-body-stackoverflow

stackoverflow

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

JavaScript
/**
 * [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

JavaScript
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"; ํ•ด์•ผํ•จ์„ ์žŠ์ง€ ๋ง์ž!

npm qs

๋ฐฑ์—์„œ ํƒœ๊ทธ ๋ฆฌ์ŠคํŠธ๋ฅผ params๋กœ ๋ฐ›๊ธฐ

์—ฌ๊ธฐ๊นŒ์ง€ ํ•˜๋ฉด ๋‹ค์ธ ์ค„ ์•Œ์•˜๋Š”๋ฐ ๋ฐฑ์—์„œ๋Š” ์—ฌ์ „ํžˆ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ชป๋ฐ›์•˜๋‹คโ€ฆ GET + Params๋ฅผ ์ฐพ์•„๋ด๋„ ๊ฑฐ์˜ ๋‹ค ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹๋งŒ ์„ค๋ช…ํ•ด๋‘๊ณ  ๋ฐฑ์—”๋“œ์—์„œ ๋ฐ›๋Š” ๋ฐฉ์‹์€ ์ •๋ฆฌ๊ฐ€ ์•ˆ๋˜์–ด์žˆ๋”๋ผ. ์ด๊ฑด ๋„ˆ๋ฌด ๊ธฐ๋ณธ์ด๋ผ ๊ทธ๋Ÿฐ๊ฑธ๊นŒโ€ฆ? ๋‘๋”์ง€๋Š” ์˜ค๋Š˜๋„ ์ƒˆ๋กญ๊ฒŒ ๋ฐฐ์›๋‹ˆ๋‹ค..๐Ÿฅฒ

๋ฐฑ์—”๋“œ์—์„œ GET ๋ฉ”์„œ๋“œ๋กœ ์˜จ RequestParam์„ ๋ฐ›๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•ด์ค˜์•ผ ํ•œ๋‹ค. ์ฐธ๊ณ ๋กœ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋Š” Spring Boot ํ™˜๊ฒฝ์œผ๋กœ ๊ตฌํ˜„์ค‘์ด๋‹ค.

Java
@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 ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋ณด๋‚ธ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐฐ์—ด ๊ฐ์ฒด๋ฅผ ๋ฐฐ์—ด๋กœ ๋ฐ›์•„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค!

์ง„์งœ ๋—!