ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • axios์™€ fetch, ๊ทธ๋ฆฌ๊ณ  Next๋Š” ์™œ fetch ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ• ๊นŒ?
    ์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ 2024. 1. 14. 23:42

    ์ตœ๊ทผ์— ํšŒ์‚ฌ์—์„œ Next14๋กœ ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๊ฒŒ ๋˜๋ฉด์„œ, ๊ณต์‹๋ฌธ์„œ์—์„œ ์„ค๋ช…ํ•˜๊ณ  ์žˆ๋Š” native fetch API๋ฅผ ํ™•์žฅํ•œ fetch๋ฅผ ์‚ฌ์šฉํ• ์ง€, axios ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ• ์ง€์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์— ๋ถ€๋”ชํžˆ๊ฒŒ ๋˜์—ˆ๋‹ค. ๋งจ ์ฒ˜์Œ์— fetch๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ axios๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ์„ ๋•Œ, ์ •๋ง ์ •๋ง ํŽธ๋ฆฌํ•จ์„ ๋Š๊ผˆ์—ˆ๋Š”๋ฐ, ๋‘˜ ์‚ฌ์ด์— ์ •ํ™•ํžˆ ์–ด๋–ค ์ฐจ์ด๊ฐ€ ์žˆ๋Š”์ง€ ์ž์„ธํžˆ ์•Œ์ง€ ๋ชปํ•ด ๊ธฐ์ˆ  ๊ฒฐ์ •์„ ๋ชป ๋‚ด๋ฆฌ๊ณ  ์žˆ๋Š” ์ž์‹ ์„ ๋ฐœ๊ฒฌํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ๊ทธ๋ฆฌํ•˜์—ฌ ๋‘˜ ์‚ฌ์ด ์ฐจ์ด์ ์„ ์‚ดํŽด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.

    Axios๋ž€ ?

    Axios๋Š” node.js์™€ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์œ„ํ•œ Promise ๊ธฐ๋ฐ˜ HTTP ํด๋ผ์ด์–ธํŠธ ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋™ํ˜• ์ž…๋‹ˆ๋‹ค(๋™์ผํ•œ ์ฝ”๋“œ๋ฒ ์ด์Šค๋กœ ๋ธŒ๋ผ์šฐ์ €์™€ node.js์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค). ์„œ๋ฒ„ ์‚ฌ์ด๋“œ์—์„œ๋Š” ๋„ค์ดํ‹ฐ๋ธŒ node.js์˜ http ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๊ณ , ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €)์—์„œ๋Š” XMLHttpRequests๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    Fetch API๋ž€?

    Fetch API๋Š” ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ํฌํ•จํ•œ ๋ฆฌ์†Œ์Šค ์ทจ๋“์„ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, XMLHttpRequest๋ณด๋‹ค ๊ฐ•๋ ฅํ•˜๊ณ  ์œ ์—ฐํ•œ ๋Œ€์ฒด์ œ์ž…๋‹ˆ๋‹ค.

     

    ๊ฐ๊ฐ Axios ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ณต์‹๋ฌธ์„œ์™€ mdn์—์„œ ๊ฐ€์ ธ์˜จ ์ •์˜์ด๋‹ค. ์—ฌ๊ธฐ์„œ ์ง‘์ค‘ํ•ด์„œ ๋ณผ ๊ฒƒ์€, axios๋Š” ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ XMLHttpRequests๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๋˜์–ด์žˆ์œผ๋ฉฐ, Fetch API๋Š” XMLHttpRequest๋ณด๋‹ค ๊ฐ•๋ ฅํ•˜๊ณ  ์œ ์—ฐํ•œ ๋Œ€์ฒด์žฌ๋ผ๋Š” ์ ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด, fetch๋Š” XMLHttpRequests๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” Axios๋ณด๋‹ค ๋” ๋‚ซ๋‹ค๋Š” ๋œป์ผ๊นŒ?

    ์ด๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด์„œ๋Š” XMLHttpRequest๊ฐ€ ์ •ํ™•ํžˆ ๋ฌด์—‡์ด๊ณ , fetch๋Š” ์–ด๋–ค ์ ์—์„œ ๊ทธ๋ณด๋‹ค ๊ฐ•๋ ฅํ•˜๊ณ  ์œ ์—ฐํ•œ ๋Œ€์ฒด์žฌ์ธ์ง€ ์‚ดํŽด๋ณผ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

    XMLHttpRequest๋ž€?

    Ajax ์—์„œ ์‚ฌ์šฉ๋˜๋Š” HTTP ํ†ต์‹ ์„ ์œ„ํ•œ ๋ฉ”์„œ๋“œ์™€ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค.

     

    ๊ทธ๋ ‡๋‹ค๋ฉด ๋‹ค์‹œ ์งˆ๋ฌธ์€ Ajax๊ฐ€ ๋ฌด์—‡์ธ์ง€๋กœ ๋„˜์–ด๊ฐ€๊ฒŒ๋œ๋‹ค.

    Ajax๋ž€?

    AJAX (Asynchronous JavaScript์™€ XML)๋Š” XMLHttpRequest ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•ด ๋ณต์žกํ•˜๊ณ  ๋™์ ์ธ ์›นํŽ˜์ด์ง€๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์ด๋‹ค.

     

    Ajax๊ฐ€ ๋“ฑ์žฅํ•˜๊ธฐ ์ด์ „๊นŒ์ง€, ์ฆ‰ ์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ, ๋น„๋™๊ธฐ์  ํ†ต์‹  ๋ฐฉ๋ฒ•์ด ๋‚˜์˜ค๊ธฐ ์ „๊นŒ์ง€๋Š” ์›น ํŽ˜์ด์ง€์— ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์žˆ์„ ๋•Œ์—, htmlํƒœ๊ทธ๋กœ ์‹œ์ž‘ํ•ด์„œ htmlํƒœ๊ทธ๋กœ ๋๋‚˜๋Š” ์™„์ „ํ•œ HTML์„ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ „์†ก๋ฐ›์•„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ๋ Œ๋”๋งํ•ด ์ฃผ๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ–ˆ์—ˆ๋‹ค.

     

    ์ด๋Ÿด ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ์ ์ด ์žˆ์—ˆ๋‹ค.

     

    1) ๋ณ€๊ฒฝํ•  ํ•„์š” ์—†๋Š” ๋ถ€๋ถ„๊นŒ์ง€ ๋‹ค์‹œ ๋ฐ›์•„์•ผ ํ•˜๋Š” ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ํ†ต์‹ ์ด ๋ฐœ์ƒํ–ˆ๊ณ ,
    2) ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ํ™”๋ฉด์ด ์ˆœ๊ฐ„์ ์œผ๋กœ ๊นœ๋นก์ด๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ–ˆ์œผ๋ฉฐ

    3) ๋น„๋™๊ธฐ๊ฐ€ ์•„๋‹Œ ๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์‘๋‹ต์ด ์žˆ์„ ๋•Œ๊นŒ์ง€ ๋‹ค์Œ ์ฒ˜๋ฆฌ๊ฐ€ ๋ธ”๋กœํ‚น๋œ๋‹ค.

     

    Ajax๊ฐ€ ๋“ฑ์žฅํ•จ์œผ๋กœ์จ ์ด ํŒจ๋Ÿฌ๋‹ค์ž„์„ ํš๊ธฐ์ ์œผ๋กœ ์ „ํ™˜ํ–ˆ๋‹ค.

     

    1) ๊ฐฑ์‹ ์ด ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ์ „์†ก๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ํ†ต์‹ ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ ,

    2) ์ „์ฒด๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜์ง€ ์•Š๊ณ , ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์žฌ๋ Œ๋”๋งํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊นœ๋นก์ž„ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉฐ,

    3) ํด๋ผ์ด์–ธํŠธ ์„œ๋ฒ„๊ฐ„์˜ ํ†ต์‹ ์ด ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ธ ์ดํ›„ ๋ธ”๋กœํ‚น์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ฒŒ ๋˜์—ˆ๋‹ค.

     

    XMLHttpRequest๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

    const xhr = new XMLHttpRequest(); // XMLHttpRequest ๊ฐ์ฒด์˜ ์ƒ์„ฑ
    
    xhr.open('GET', '/users'); // HTTP ์š”์ฒญ ์ดˆ๊ธฐํ™”
    
    xhr.setRequestHeader('content-type', 'application/json'); // HTTP ์š”์ฒญ ํ—ค๋” ์„ค์ •
    
    xhr.send(); // HTTP ์š”์ฒญ ์ „์†ก
    
    // POST ํ†ต์‹  (๋ชธ์ฒด๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ง๋ ฌํ™” ํ•˜์—ฌ ์ „์†ก)
    
    xhr.open('POST', '/users');
    xhr.setRequestHeader('content-type', 'application/json'); // HTTP ์š”์ฒญ ํ—ค๋” ์„ค์ •
    xhr.send(JSON.stringify({id:1, content: 'HTML', completed: false}); 
    

    fetch API์™€ ๊ฐ€์žฅ ๋‘๋“œ๋Ÿฌ์ง€๋Š” XMLHttpRequest์˜ ์ฐจ์ด๋Š” ์—ฌ๊ธฐ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š”๋ฐ, HTTP ์‘๋‹ต ์ฒ˜๋ฆฌ์‹œ XMLHttpRequest๋Š” ์ด ๊ฐ์ฒด๊ฐ€ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ์ด๋ฒคํŠธ๋ฅผ ์บ์น˜ํ•œ๋‹ค.(์ฆ‰ callback์„ ํ™œ์šฉํ•œ๋‹ค.) XMLHttpRequest๋Š” onreadystatechange, onload, onerror๊ฐ™์€ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ–๋Š”๋ฐ, ์ด ์ค‘์—์„œ HRRP ์š”์ฒญ์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” readyState ํ”„๋กœํผํ‹ฐ ๊ฐ’์ด ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ ๋ฐœ์ƒํ•˜๋Š”readystatechange ์ด๋ฒคํŠธ๋ฅผ ์บ์น˜ํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด HTTP ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

     

     

    ์œ„์ฒ˜๋Ÿผ xhr ๊ฐ์ฒด๋ฅผ ๋งŒ๋“  ํ›„, ์•„๋ž˜์ฒ˜๋Ÿผ ์š”์ฒญ์„ ๋ณด๋‚ธ ํ›„ ์‘๋‹ต์„ ๋ฐ›์•„๋ณด์•˜๋‹ค.

     

     

    readyState๊ฐ€ 1์—์„œ DONE ์ƒํƒœ์ธ 4๋กœ ๋ฐ”๋€Œ์—ˆ๊ณ , status ๊ฐ’์ด 200์œผ๋กœ ๋ณ€ํ–ˆ์œผ๋ฉฐ response์— ๊ฐ’์ด ๋“ค์–ด์˜จ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

     

     

    ์ตœ์ข…์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด status ๋ถ„๊ธฐ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ํ˜น์€ HTTP ์š”์ฒญ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋œ ๊ฒฝ์šฐ๋งŒ ๋ฐœ์ƒํ•˜๋Š” onload ์ด๋ฒคํŠธ๋ฅผ ํ†ตํ•ด ์‘๋‹ต์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

    xhr.onload = () => {
          if(xhr.status ===200){
            console.log(JSON.parse(xhr.response));
          }else{
               console.error('Error', xhr.status, xhr.statusText)
          }
    };

     

    ์œ„์™€ ๊ฐ™์ด onload ๋ฉ”์„œ๋“œ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝœ๋ฐฑ์„ ๋‹ฌ์•„๋‘๊ณ  ์š”์ฒญ์„ ๋ณด๋‚ด์ž, ์‘๋‹ต์ด ์™„๋ฃŒ๋˜๋Š” ๋Œ€๋กœ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ์ฝœ๋ฐฑ์ด ์‹คํ–‰๋˜์—ˆ๋‹ค.

    Ajax ํ†ต์‹ ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ ๊ฒƒ์€ ์ข‹์ง€๋งŒ, ๋ญ”๊ฐ€ ๋ฒˆ๊ฑฐ๋กญ๋‹ค. ๊ทธ๋ ‡๊ฒŒ Fetch API๊ฐ€ ๋“ฑ์žฅํ–ˆ๋‹ค.

     

     

    ๊ทธ๋ ‡๋‹ค๋ฉด ๋‹ค์‹œ,

    Fetch API๋Š” XMLHttpRequest๋ณด๋‹ค ๋ฌด์—‡์ด ๋” ์ข‹์€๊ฐ€?

    1. ๊ฐ„๊ฒฐํ•˜๊ณ  ๋‹จ์ˆœํ•œ ๋ฌธ๋ฒ•
    2. Promise๋ฅผ ๋ฆฌํ„ดํ•˜๊ธฐ ๋•Œ๋ฌธ์— callback์„ ํ™œ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋˜๋ฉฐ, ํ”„๋กœ๋ฏธ์Šค ์ฒด์ด๋‹์„ ํ†ตํ•ด ๋น„๋™๊ธฐ ์‘๋‹ต์„ ๋” ์ง๊ด€์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.
    3. Headers, Request, Response๋ฅผ ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
    Request
    
    const request = new Request('https://jsonplaceholder.typicode.com/users')
    
    console.log(request.url) // https://jsonplaceholder.typicode.com/users
    console.log(request.method) // GET (HTTP method)
    console.log(request.credentials) // same-origin
    Response
    
    const res = await fetch(request)
    
    console.log(res.ok) // true (boolean)
    console.log(res.status) // 200  (HTTP status)
    console.log(res.url) // https://jsonplaceholder.typicode.com/users
    
    const json = await res.json() // ๋ณธ๋ฌธ์„ JSON์œผ๋กœ ๊ตฌ๋ฌธ ๋ถ„์„
    const text = await res.text() // ๋ณธ๋ฌธ์„ ํ…์ŠคํŠธ๋กœ ๊ตฌ๋ฌธ ๋ถ„์„
    const formData = await res.formData() // ๋ณธ๋ฌธ์˜ ํผ๋ฐ์ดํ„ฐ ํ‘œํ˜„
    Header
    
    const headers = new Headers()
    headers.append('Content-Type', 'text/xml')
    
    const request = new Request('https://jsonplaceholder.typicode.com/users', { headers })
    
    const res = await fetch(request)
    console.log(res.headers.get('Content-Type')) // application/json; charset=UTF-8

     

    ์ด๋Ÿฌํ•œ ์ฃผ์š” ์ฐจ์ด์ ๋“ค์ด ์žˆ์ง€๋งŒ, nextjs์—์„œ ๊ตณ์ด fetch๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ ๊ฒƒ์€ caching์— ๋Œ€ํ•œ ์ œ์–ด๋ฅผ ๋” ๋ชจ๋˜ํ•˜๊ณ  ๊ฐ„๊ฒฐํ•œ ๋ฐฉ์‹์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

     

    ๊ทธ๋ ‡๋‹ค๋ฉด ์ถ”๊ฐ€๋กœ, XMLHttpRequest์™€ fetch API์˜ ์บ์‹ฑ ๋ฐฉ์‹์„ ์•Œ์•„๋ณด์ž.

    XMLHttpRequest์˜ ์บ์‹ฑ ๋ฐฉ์‹

    ํ—ค๋”์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์บ์‹ฑ์— ๋Œ€ํ•œ ์˜ต์…˜๋“ค์„ ๋‹ฌ ์ˆ˜ ์žˆ๋‹ค.

    var xhr = new XMLHttpRequest();
    xhr.open("GET", "https://example.com/api/data", true);
    xhr.setRequestHeader("Cache-Control", "no-cache");
    xhr.setRequestHeader("Pragma", "no-cache");
    
    xhr.onreadystatechange = function () {
      if (xhr.readyState === 4 && xhr.status === 200) {
        // Handle the response
      }
    };
    
    xhr.send();

    fetch API์˜ ์บ์‹ฑ ๋ฐฉ์‹

    Request ๊ฐ์ฒด์˜ cache ํ”„๋กœํผํ‹ฐ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋˜๋ฉฐ, XMLHttpRequest๋ณด๋‹ค ํ›จ์”ฌ ํญ๋„“์€ ์˜ต์…˜์„ ์ œ๊ณตํ•œ๋‹ค.

    • default : ๋ธŒ๋ผ์šฐ์ €๋Š” HTTP ์บ์‹œ์—์„œ ์ผ์น˜ํ•˜๋Š” ์š”์ฒญ์„ ์ฐพ๋Š”๋‹ค.
          - ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์ด ์žˆ๊ณ , ์ƒˆ ํ•ญ๋ชฉ์ธ ๊ฒฝ์šฐ ์บ์‹œ์—์„œ ๋ฐ˜ํ™˜
          - ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์ด ์žˆ๊ณ , ์˜ค๋ž˜๋œ ํ•ญ๋ชฉ์ด๋ฉด ๋ธŒ๋ผ์šฐ์ €๋Š” ์›๊ฒฉ ์„œ๋ฒ„์— ์กฐ๊ฑด๋ถ€ ์š”์ฒญ์„ ํ•จ, ์„œ๋ฒ„๊ฐ€ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜๋‹ค๊ณ  ํ‘œ์‹œํ•˜. ๋ฉด, ์บ์‹œ์—์„œ ๋ฆฌ์†Œ์Šค ๋ฐ˜ํ™˜, ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค๋ฉด ๋ฆฌ์†Œ์Šค๊ฐ€ ์„œ๋ฒ„์—์„œ ๋‹ค์šด๋กœ๋“œ๋˜๊ณ  ์บ์‹œ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋จ.
          - ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์ด ์—†์œผ๋ฉด, ๋ธŒ๋ผ์šฐ์ €๋Š” ์ •์ƒ ์š”์ฒญ ํ›„ ๋‹ค์šด๋กœ๋“œ๋œ ๋ฆฌ์†Œ์Šค๋กœ ์บ์‹œ๋ฅผ ์—…๋ฐ์ดํŠธํ•จ.
    • no-store : ๋ธŒ๋ผ์šฐ์ €๋Š” ์บ์‹œ๋ฅผ ์‚ดํŽด๋ณด์ง€ ์•Š๊ณ  ์›๊ฒฉ ์„œ๋ฒ„์—์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ ธ์˜ค๋ฉฐ, ๋‹ค์šด๋กœ๋“œ๋œ ๋ฆฌ์†Œ์Šค๋กœ ์บ์‹œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์Œ.
    • reload : ๋ธŒ๋ผ์šฐ์ €๋Š” ์บ์‹œ๋ฅผ ์‚ดํŽด๋ณด์ง€ ์•Š๊ณ  ์›๊ฒฉ ์„œ๋ฒ„์—์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ ธ์˜ค๋ฉฐ, ๋‹ค์šด๋กœ๋“œ ๋œ ๋ฆฌ์†Œ๋ฅด๋กœ ์บ์‹œ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•จ.
    • no-cache : ๋ธŒ๋ผ์šฐ์ €๋Š” HTTP ์บ์‹œ์—์„œ ์ผ์น˜ํ•˜๋Š” ์š”์ฒญ์„ ์ฐพ์Œ. ์ƒˆ ์š”์ฒญ์ด๋“  ์˜ค๋ž˜๋œ ์š”์ฒญ์ด๋“  ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์ด ์žˆ์œผ๋ฉด ๋ธŒ๋ผ์šฐ์ €๋Š” ์›๊ฒฉ ์„œ๋ฒ„์— ์กฐ๊ฑด๋ถ€ ์š”์ฒญ์„ ๋ณด๋ƒ„. ์„œ๋ฒ„๊ฐ€ ๋ฆฌ์†Œ์Šค ๋ณ€๊ฒฝ์ด ๋˜์ง€ ์•Š์•˜๋‹ค๊ณ  ํ•˜๋ฉด ์บ์‹œ์—์„œ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ฐ˜ํ™˜๋จ. ๋ณ€๊ฒฝ์ด ๋˜์—ˆ๋‹ค๋ฉด ๋ฆฌ์†Œ์Šค๊ฐ€ ์„œ๋ฒ„์—์„œ ๋‹ค์šด๋กœ๋“œ๋˜๊ณ  ์บ์‹œ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋จ. 

     

    ์ฝ”๋“œ๋กœ ์‚ดํŽด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด cache ํ”„๋กœํผํ‹ฐ์— ์›ํ•˜๋Š” ์˜ต์…˜์„ ๋„ฃ์–ด์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

    fetch("https://example.com/api/data", {
      method: "GET",
      cache: "no-cache" // Specify caching behavior
    })
      .then(function (response) {
        if (response.ok) {
          // Handle the response
        }
      })
      .catch(function (error) {
        // Handle errors
      });
    

     

    ๋ฐ”๋กœ ์ด๋Ÿฐ ์บ์‹ฑ ์˜ต์…˜๋“ค ๋•Œ๋ฌธ์— NextJs๋Š” fetch API๋ฅผ ํ™•์žฅํ•ด์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด Axios์—๋„ ์ด๋Ÿฐ ์บ์‹ฑ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ๋“ค์ด ์žˆ์„๊นŒ? ์•„๋‹ˆ! ์—†๋‹ค!! Axios๋Š” ์ •์˜์—์„œ๋„ ์จ์žˆ๋“ฏ, ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” XMLHttpRequest๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ์ƒ์„ธ ์บ์‹ฑ ์˜ต์…˜๋“ค์„ ์ฒ˜๋ฆฌํ•ด์ฃผ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ณ„๋„์˜ ํŒจํ‚ค์ง€ ์„ค์น˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

     

     

    ๊ทธ๋ ‡๋‹ค๋ฉด ๊ทธ ๋™์•ˆ ์šฐ๋ฆฌ๋Š” ์–ด๋–ค ์ด์ ๋•Œ๋ฌธ์— Axios๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ์„๊นŒ?

    • ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ„๋„ serialize, deserialize ํ•  ํ•„์š”๊ฐ€ ์—†์ด ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    • baseUrl์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • default header๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • request, response interceptor๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

    ์œ„ ๊ธฐ๋Šฅ๋“ค์€ fetch API๊ฐ€ ํ•ด์ค„ ์ˆ˜ ์—†๋Š” ๊ฒƒ๋“ค์ด๊ธฐ์—, ๋‹ค์Œ๊ณผ ๊ฐ™์ด axios ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ axiosClient๋ฅผ ๋งŒ๋“  ํ›„ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.

     

    // axios.ts

    import axios, { AxiosRequestConfig, AxiosError, AxiosHeaders } from 'axios';

    const axiosClient = axios.create({
    baseURL: 'http://localhost:8080',
    timeout: 8000,
    headers: {
    // eslint-disable-next-line @typescript-eslint/naming-convention
    'Content-type': 'application/json',
    },
    });

    axiosClient.interceptors.request.use(
    (config: AxiosRequestConfig) => {
    if (config.headers === undefined) {
    config.headers = {};
    }

    const token = localStorage.getItem('token');
    if (token) {
    (config.headers as AxiosHeaders).set('Authorization', token);
    }

    return config;
    },
    (error: AxiosError) => Promise.reject(error),
    );

    export default axiosClient;

     

     

     

    ๊ทธ๋Ÿฌ๋‚˜ ๊ณต๋ถ€๋ฅผ ํ•ด๋ณด๋‹ˆ, ์บ์‹ฑ ๊ธฐ๋Šฅ๋“ค ๋•Œ๋ฌธ์— ๊ณต์‹๋ฌธ์„œ๊ฐ€ fetch ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

    https://nextjs.org/docs/app/building-your-application/data-fetching/fetching-caching-and-revalidating#fetching-data-on-the-server-with-fetch

     

    ๊ทธ๋ ‡๋‹ค๋ฉด, ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ์—์„œ ๋‚ด๊ฐ€ axios์—์„œ ๋ˆ„๋ ธ๋˜ ์ด์ ๋“ค์„ fetch๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ๋„ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ์„๊นŒ? ์ด ๋ถ€๋ถ„์€ ํ•ด๊ฒฐํ•œ ํ›„ ์ด์–ด์„œ ๊ธ€์„ ์จ๋ณด๊ธฐ๋กœ ํ•œ๋‹ค.

     

     

    ์ฐธ๊ณ 

    https://dawonny.tistory.com/286

    https://blog.deercorp.com/next-js-app-router-and-fetch-library/

    https://developer.mozilla.org/ko/docs/Web/API/Request/cache

    ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive

     

    Request: cache ์†์„ฑ - Web API | MDN

    Request ์ธํ„ฐํŽ˜์ด์Šค์˜ cache ์ฝ๊ธฐ ์ „์šฉ ์†์„ฑ์—๋Š” ์š”์ฒญ์˜ ์บ์‹œ ๋ชจ๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์š”์ฒญ์ด ๋ธŒ๋ผ์šฐ์ €์˜ HTTP ์บ์‹ฑ๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

    developer.mozilla.org

     

    Next.js App Router๋กœ ์ œํ’ˆ ๋งŒ๋“ค๊ธฐ: ์ด์ œ ๋” ์ด์ƒ Axios๋ฅผ ์“ฐ์ง€ ์•Š๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค

    ์•ˆ๋…•ํ•˜์„ธ์š”, ๋””์–ด์ฝ”ํผ๋ ˆ์ด์…˜์˜ ๊น€๋ช…์žฌ์ž…๋‹ˆ๋‹ค. ํ† ์ดํ”„๋กœ์ ํŠธ๊ฐ€ ์•„๋‹Œ ์‹ค์ œ ์ œํ’ˆ์— Next.js App Router๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์…จ๋‚˜์š”? ์ด๋ฒˆ์— ์ €ํฌ ํšŒ์‚ฌ์—์„œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ƒˆ๋กœ ์„ธํŒ…ํ•  ํ•„์š”๊ฐ€ ์ƒ๊ฒผ๊ณ  ์ €๋Š” ๊ณผ

    blog.deercorp.com

     

    [React] Ajax, Axios, Fetch (feat. Axios ์‚ฌ์šฉ๋ฒ•)

    HTTP ์š”์ฒญ์„ ๋ณด๋‚ด๋Š”๋ฐ์— Ajax, Axios, fetch ๋“ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. Axios์™€ Fetch๋Š” ๊ฒฐ๊ตญ Ajax ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋˜๋Š” API๋กœ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ 3๊ฐœ์˜ ๊ฐ„๋‹จํ•œ ๊ฐœ๋…์„ ์•Œ์•„๋ณด๊ณ , Axios ์˜ ์‚ฌ์šฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์ž์„ธ

    dawonny.tistory.com

     

    ๋Œ“๊ธ€

Designed by Tistory.