๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŒŒ | WEB DEV/React

[React] 14. React์™€ ์„œ๋ฒ„ ์—ฐ๋™ํ•˜๊ธฐ (ajax๋ฅผ ์ด์šฉํ•ด! (get, post) )

by KASSID 2024. 1. 12.

๋ชฉ์ฐจ

    728x90

    ์ด์ „ ๊ธ€ โ–ผ

    ๋”๋ณด๊ธฐ

    0. 2023.05.05 - [๐ŸŒŒ | WEB DEV/React] - [React] 0. React๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ  & ์ดˆ๊ธฐ ์„ธํŒ…

    1. 2023.05.07 - [๐ŸŒŒ | WEB DEV/React] - [React] 1. JSX

    2. 2023.05.26 - [๐ŸŒŒ | WEB DEV/React] - [React] 2. state (๋ณ€์ˆ˜, array, object)

    2-1. 2023.05.27 - [๐ŸŒŒ | WEB DEV/React] - [React] 2-1. array state ์ •๋ ฌํ•˜๊ธฐ ( .sort()ํ™œ์šฉ)

    3. 2023.05.28 - [๐ŸŒŒ | WEB DEV/React] - [React] 3. ์ปดํฌ๋„ŒํŠธ (Component)

    4. 2023.05.28 - [๐ŸŒŒ | WEB DEV/React] - [React] 4. ๋™์ ์ธ UI ์ œ์ž‘ํ•˜๊ธฐ

    5. 2023.05.28 - [๐ŸŒŒ | WEB DEV/React] - [React] 5. ๋ฐ˜๋ณต๋˜๋Š” ๋ถ€๋ถ„ ์ถ•์•ฝํ•˜๊ธฐ (map)

    6. 2023.05.29 - [๐ŸŒŒ | WEB DEV/React] - [React] 6. props

    7. 2023.07.03 - [๐ŸŒŒ | WEB DEV/React] - [React] 7. ์ด๋ฏธ์ง€ ์‚ฝ์ž…ํ•˜๊ธฐ(css, html, publicํด๋”์—์„œ ๊ฐ€์ ธ์˜ค๊ธฐ)

    8. 2023.07.06 - [๐ŸŒŒ | WEB DEV/React] - [React] 8. ๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ

    9. 2023.07.09 - [๐ŸŒŒ | WEB DEV/React] - [React] 9. ๋ผ์šฐํŒ…-1 (react-router-dom์„ธํŒ…, Routes, Route, Link)

    10. 2023.07.10 - [๐ŸŒŒ | WEB DEV/React] - [React] ๋ผ์šฐํŒ…-2 (useNavigate, 404page, Nested Routes, Outlet)

    11. 2023.10.03 - [๐ŸŒŒ | WEB DEV/React] - [React] 11. ๋ผ์šฐํŒ…-3 ์–‘์‚ฐํ˜• ๋ผ์šฐํŒ…

    12. 2023.10.04 - [๐ŸŒŒ | WEB DEV/React] - [React] 12. Styled-components (+ ํ•œ ์ปดํฌ๋„ŒํŠธ์— cssํŒŒ์ผ ์ ์šฉ๋ฒ•)

    13. 2024.01.02 - [๐ŸŒŒ | WEB DEV/React] - [React] 13. ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ์˜ Lifecycle์™€ useEffect

     

    ์ด๋ฒˆ์—๋Š” ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•ด ์›ํ•˜๋Š” ๊ฒƒ๋“ค์„ ๋ฐ›์•„์™€๋ณด์ž!

     

    1. ์„œ๋ฒ„๋ž€?

    ๊ฐ„๋‹จํ•˜๊ฒŒ ์ด์•ผ๊ธฐํ•˜๋ฉด ์„œ๋ฒ„๋Š”

    ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๋ฉด ์š”์ฒญํ•œ๋Œ€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด์ฃผ๋Š” ํ”„๋กœ๊ทธ๋žจ์ด๋‹ค.

     

    ์˜ˆ๋ฅผ ๋“ค์–ด '~~์‚ฌ์ง„ ๋ณด์—ฌ์ค˜' ํ•˜๋ฉด ์‚ฌ์ง„์„ ๋ณด์—ฌ์ฃผ๊ณ , '~~๋™์˜์ƒ ๋ณด์—ฌ์ค˜' ํ•˜๋ฉด ๋™์˜์ƒ์„ ๋ณด์—ฌ์ฃผ๋„๋ก

    ๋งŒ๋“ค๋ฉด ๋œ๋‹ค.(์ดˆ์ดˆ์••์ถ•)

     

    ์ด๋•Œ ์š”์ฒญ์„ ์œ„ํ•ด์„œ๋Š” ์‚ฌ์ „์— ์ •์˜๋œ ์ •ํ™•ํ•œ ๊ทœ๊ฒฉ์— ๋งž์ถฐ ๋ณด๋‚ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

    1) ์–ด๋–ค ๋ฐ์ดํ„ฐ์ธ์ง€ (URL)
    2) ์–ด๋–ค ๋ฐฉ์‹์ธ์ง€ (GET, POST ๋“ฑ)

     

    ์—ฌ๊ธฐ์„œ GET์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์„ ๋•Œ, POST๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

     

     

     

    โ–ผ ์กฐ๊ธˆ ๋” ์ •๋ฆฌํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜ ๋งํฌ์—!

    https://bluishhot-star.tistory.com/237

     

    [NodeJS+Express] 9. RESTful API๋ž€?

    ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ DB์— ์ €์žฅํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์ „์— RESTful API ์— ๋Œ€ํ•œ ๊ฐœ๋…์„ ์•Œ์•„๋ณด์ž! 1. ์„œ๋ฒ„๋กœ์˜ ์š”์ฒญ ์„œ๋ฒ„๋Š” '์š”์ฒญ'์— ๋”ฐ๋ฅธ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ํ•œ ์ค„ ์š”์•ฝํ•  ์ˆ˜ ์žˆ

    bluishhot-star.tistory.com

     

     

     


    2. ๊ฐ€์žฅ ์‰ฌ์šด GET, POST ์š”์ฒญํ•˜๋Š” ๋ฐฉ๋ฒ•

    ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž.

     

    1) GET ์š”์ฒญ - ์ฃผ์†Œ์ฐฝ ์ž…๋ ฅ

    GET ์š”์ฒญ์„ ํ•  ๋•Œ ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ์ฃผ์†Œ์ฐฝ์— url์„ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

    2) POST ์š”์ฒญ - <form action="~" method="~">

    POST ์š”์ฒญ์€ <form>ํƒœ๊ทธ๋ฅผ ์ด์šฉํ•˜๋ฉด ๋˜๋Š”๋ฐ

    ์†์„ฑ์œผ๋กœ action์— url, method์— ์š”์ฒญ๋ฐฉ๋ฒ•์„ ์ž…๋ ฅํ•œ๋‹ค.

     

     

    ์ด ๋ฐฉ๋ฒ•๋“ค์˜ ํŠน์ง•์€ ์š”์ฒญ ์ดํ›„์— ํŽ˜์ด์ง€๊ฐ€ ์ƒˆ๋กœ๊ณ ์นจ์ด ๋œ๋‹ค๋Š” ์ ์ด๋‹ค.

     

     


    3. AJAX๋ฅผ ์ด์šฉํ•œ ์š”์ฒญ

    AJAX๋Š” ์ƒˆ๋กœ๊ณ ์นจ์—†์ด ์„œ๋ฒ„์— GET, POST ์š”์ฒญ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

     

    ์ด๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ 3๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

    1) XMLHttpRequest
    2) fetch()
    3) ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (axios)

     

    ์ด๋“ค ์ค‘ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” axios๋ฅผ ํ†ตํ•ด ์š”์ฒญ์„ ๋ณด๋‚ด๋ณด์ž!

     

    1) axios

    axios๋ผ๋Š” ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•ด ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ๋น„๊ต์  ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

     

    - ์„ค์น˜ํ•˜๊ธฐ

    npm install axios

     

    - import ํ•˜๊ธฐ

    import axios from "axios"

     

    (1) GET ์š”์ฒญ

    - ์š”์ฒญ

    axios.get('์š”์ฒญํ• url')

    ์œ„์˜ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์„œ๋ฒ„์— GET์š”์ฒญ์„ ํ•œ๋‹ค.

     

    - ์š”์ฒญ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ ์ด์šฉํ•˜๊ธฐ

    axios.get('์š”์ฒญํ• url')
    .then(
      ...
    )

     

    .then() ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ์š”์ฒญ ๋ฐ›์€ ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

    (e.g. ์ฝ˜์†” ์ถœ๋ ฅ, state์ €์žฅ ๋“ฑ)

     

    .then((res)=>{
      console.log(res) //์š”์ฒญ์— ๋Œ€ํ•œ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ์˜ ๊ฒฐ๊ณผ ์ถœ๋ ฅ
    })

    .then()์˜ ๋‚ด๋ถ€์—๋Š” ํ•จ์ˆ˜๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.

    ์ด๋•Œ ํ•ด๋‹น ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์š”์ฒญ๋ฐ›์€ ๊ฒƒ์— ๋Œ€ํ•œ ์„œ๋ฒ„์˜ ๊ฒฐ๊ณผ๋ฅผ ์ „๋‹ฌ ๋ฐ›๋Š”๋‹ค.

     

    // ๊ฒฐ๊ณผ ๋‹ด์„ state ์ƒ์„ฑ
    const [result, setResult] = useState([]);
    
    ...
    
    
    .then((res)=>{
      let copy = [...result, ...res.data];
      setResult(copy);
    })

    Array์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค๋ฉด ์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋‹ค.

     

     

    - ์š”์ฒญ ์‹คํŒจ ์ฒ˜๋ฆฌ

    ๋งŒ์•ฝ axios๋ฅผ ํ†ตํ•ด ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ์ „ ๊ณผ์ • ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ

    .catch()๋ฅผ ์ด์šฉํ•˜๋ฉด ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

    .catch((err)=>{
      ...
    })

     

     

    (2) POST ์š”์ฒญ

    axios.post('์š”์ฒญํ• url', {})

    post ์š”์ฒญ์€ ์œ„์™€ ๊ฐ™์ด ์ž‘์„ฑํ•œ๋‹ค.

     

    ์ด๋•Œ url๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š”๋ฐ, ๋ฐ์ดํ„ฐ๋Š” Object ์ž๋ฃŒํ˜• ๋“ฑ์„ ์ „๋‹ฌํ•œ๋‹ค.

     

    ์˜ˆ์‹œ

    axios.post('url', {
    	name: "Kassid",
    	level:"99"
    })

     

     

    post ์š”์ฒญ๋„ ๋˜ํ•œ .then() .catch()๋ฅผ ์ด์šฉํ•ด ๊ฐ ์ƒํ™ฉ์— ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

     

    (3) ๋™์‹œ์— ์—ฌ๋Ÿฌ ์š”์ฒญ ๋ณด๋‚ด๊ธฐ

    ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ์š”์ฒญ์„ ์„œ๋ฒ„์—๊ฒŒ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋‹ค.

    ์ด๋Š” Promise๋ฅผ ํ™œ์šฉํ•œ๋‹ค.

    Promise.all([ ์š”์ฒญ1, ์š”์ฒญ2, ... ])

     

     

    ์˜ˆ์‹œ

    Promise.all([axios.get("url1"), axios.post('url2', {name:"Kassid"})])

     

    ์ด๋•Œ์—๋„ .then(), .catch() ๊ฐ€๋Šฅ!

     

     

     

    โ€ป ์›๋ž˜ ์„œ๋ฒ„์™€์˜ ํ†ต์‹ ์—๋Š” ๋ฌธ์ž ์ž๋ฃŒํ˜•๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค!

    ์‚ฌ์‹ค ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ๋•Œ์—๋Š” object๋‚˜ array ๋“ฑ์˜ ์ž๋ฃŒํ˜•์€ ์ด์šฉํ•  ์ˆ˜ ์—†๋‹ค.
    ํ•˜์ง€๋งŒ ์œ„์—์„œ ๋ณด์•˜๋˜ ์˜ˆ์‹œ๋“ค์„ ๋ณด๋ฉด ์ž˜ ์ด์šฉํ•˜๊ณ  ์žˆ๋‹ค.

    ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” JSON ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. JSON์€ ๋ฌธ์ž์ทจ๊ธ‰์„ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„ ํ†ต์‹ ์—๋„ ์ž์œ ๋กญ๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
          "{"name" : " "Kassid" "}" -> ์ด๋Ÿฌํ•œ ํ˜•์‹

    ๋”ฐ๋ผ์„œ ์„œ๋ฒ„๋กœ ๋ถ€ํ„ฐ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๊ฐ€ array ํ˜น์€ object ๋ผ๋ฉด JSON์ด๋‹ค.
    ์ด๋•Œ axios ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” JSON์„ array, object ๋“ฑ์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ฃผ๊ธฐ ๋–„๋ฌธ์—
    ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ๋Š” ๋”ฐ๋กœ ๋ณ€ํ™˜ ์ž‘์—… ์—†์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

     

     

    โ€ป ์„œ๋ฒ„์—์„œ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ html์— ๋ Œ๋”๋งํ•  ๋•Œ ์ฃผ์˜ํ•  ์ 

    ์„œ๋ฒ„์—์„œ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ state์— ๋‹ด์•„์ค€ ํ›„ html์— ๊ฝ‚์•„๋„ฃ์–ด์ค„ ๋•Œ
    state๊ฐ€ ๋น„์–ด์žˆ๋‹ค! ๋ผ๊ณ  ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

    ์ด๋Š” axios ์š”์ฒญ ๋ณด๋‹ค html ๋ Œ๋”๋ง์ด ๋น ๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
    ๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์—๋Š” if ๋ฌธ ๋“ฑ์„ ์ด์šฉํ•ด state์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ด๊ธด ํ›„์— ๋””์Šคํ”Œ๋ ˆ์ด ๋˜๋„๋ก ํ•˜๋ฉด ๋œ๋‹ค!

     

    ๋Œ“๊ธ€