Sam Baek, The Dev's Corner

๐Ÿ“ฒ AJAX :์„œ๋ฒ„์™€ ์š”์ฒญ ๊ทธ๋ฆฌ๊ณ  ์‘๋‹ต

25 Jun 2023

AJAX์™€ ์„œ๋ฒ„


AJAX๋Š” Asynchronous JavaScript And Xml์˜ ์•ฝ์ž๋กœ
์„œ๋ฒ„์™€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ธฐ์ˆ ์„ ์˜๋ฏธํ•œ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ์ด ๋ง์ด ์กฐ๊ธˆ์€ ์ƒ์†Œํ•ด๋ณด์ผ์ง€๋„ ๋ชจ๋ฅธ๋‹ค.
โ€˜๋น„๋™๊ธฐ์ โ€™ ์ด๋ผ๋Š” ๋ง๊ณผ โ€˜์„œ๋ฒ„โ€™๋ผ๋Š” ๋ง๋ถ€ํ„ฐ ์–ด๋ ค์›Œ๋ณด์—ฌ์„œ ๊ทธ๋Ÿด๊นŒ.

๊ทธ๋ž˜์„œ ์„œ๋ฒ„์— ๋Œ€ํ•ด์„œ ๋จผ์ € ๊ฐ„๋žตํ•˜๊ฒŒ ์ •๋ฆฌํ•˜๊ณ ์ž ํ•œ๋‹ค.
์„œ๋ฒ„๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญ(Request)ํ•˜๋ฉด ์š”์ฒญํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด์ฃผ๋Š”(Response) ํ”„๋กœ๊ทธ๋žจ์ด๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ์„œ๋ฒ„์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•  ๋•Œ๋Š” ์•„๋ฌด๋Ÿฐ ๋ฐฉ๋ฒ•์œผ๋กœ๋‚˜ ์š”์ฒญํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ
์ •ํ•ด์ง„ ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ์„œ ์š”์ฒญ์„ ํ•ด์•ผ์ง€ ์„œ๋ฒ„๋Š” ํ•ด๋‹น ์š”์ฒญ์— ๋Œ€ํ•ด ์‘๋‹ต์„ ํ•œ๋‹ค.
์ฆ‰, ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•  ๋• ๋ฐ์ดํ„ฐ์˜ ์ •ํ™•ํ•œ URL์„ ์•Œ์•„์•ผ ํ•˜๊ณ 
ํ•ด๋‹น URL๋กœ GET ์š”์ฒญ์„ ํ•ด์•ผ์ง€๋งŒ ์„œ๋ฒ„๋Š” ํ•ด๋‹น ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ์‘๋‹ตํ•œ๋‹ค.

URL๊ณผ GET method


๋ณดํ†ต ์„œ๋ฒ„์˜ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๋Š” URL์€ ์„œ๋ฒ„์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•Œ๊ณ  ์žˆ์–ด ๋ช…์‹œํ•˜๊ฑฐ๋‚˜
์ „๋‹ฌ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ณ  ๋ณธ์ธ์ด ์„œ๋ฒ„์˜ ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ๋”๋”์šฑ ์•Œ๊ณ  ์žˆ์„ ๊ฒƒ์ด๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๋‚จ์€๊ฑด ํ•ด๋‹น URL๋กœ GET์š”์ฒญ์„ ํ•˜๋Š” ๊ฒƒ์ธ๋ฐ
GET์š”์ฒญ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.
์ฒซ ๋ฒˆ์งธ๋กœ๋Š” ์ฃผ์†Œ์ฐฝ์— ํ•ด๋‹น URL๊ณผ ์ •๊ทœํ‘œํ˜„์‹์„ ์ด์šฉํ•ด ์ง์ ‘ ์ž…๋ ฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๊ณ 
๋‘ ๋ฒˆ์งธ๋Š” form ํƒœ๊ทธ์— action๊ณผ type์„ ์ž‘์„ฑํ•ด ๋ฒ„ํŠผ์œผ๋กœ ๋‚ ๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ๋‘ ๋ฐฉ๋ฒ• ๋ชจ๋‘ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•  ๋•Œ๋งˆ๋‹ค ํŽ˜์ด์ง€๊ฐ€ ์ƒˆ๋กœ๊ณ ์นจ๋˜๋Š” ์น˜๋ช…์ ์ธ ์•„์‰ฌ์›€์ด ์žˆ๋‹ค.
์˜ˆ์ปจ๋Œ€, ์ธ์Šคํƒ€๊ทธ๋žจ ํ”ผ๋“œ๋ฅผ ๋ฐ์ดํ„ฐ๋กœ ๋ฐ›์•„์˜จ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๋•Œ ์›น์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ฌ ๋•Œ๋งˆ๋‹ค
์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋กœ ๊ณ ์น˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ค„ ๊ฒƒ์ด๊ณ  ๊ต‰์žฅํžˆ ๋ถ€์ž์—ฐ์Šค๋Ÿฌ์šด ๋™์ž‘์œผ๋กœ ๋ณด์ผ ๊ฒƒ์ด๋‹ค.
๋ฆฌ์•กํŠธ๋กœ SPA๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ด์œ ๋‹ค. ์นดํ…Œ๊ณ ๋ฆฌ๋งˆ๋‹ค ์ƒˆ๋กœ๊ณ ์นจ๋˜๋Š” ๊ฒƒ์ด ์ƒ๊ฐ๋ณด๋‹ค ๊ณค๋ž€ํ•˜๋‹ค.
๊ทธ๋ž˜์„œ ๋‚˜์˜จ ๋ฐฉ๋ฒ•์ด ์„ธ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์ด๋‹ค.
์„ธ ๋ฒˆ์งธ๋Š” AJAX๋ฅผ ์‚ฌ์šฉํ•ด GET์š”์ฒญ์„ ๋‚ ๋ฆฌ๋Š” ๊ฒƒ์ด๋‹ค.
๊ฒฐ๊ตญ AJAX์˜ ํ•ต์‹ฌ์€ ์ƒˆ๋กœ๊ณ ์นจ ์—†์ด๋„ ์„œ๋ฒ„์—๊ฒŒ GET ์š”์ฒญ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒ๋‹นํ•œ JS์ฝ”๋“œ์ด๋‹ค.

AJAX ์ž‘์„ฑ


  1. ์ •ํ†ต

    var ajax = new XMLHttpRequest();
     ajax.onreadystatechange = function () {
         if (this.readyState == 4 && this.status == 200) {
             console.log(ajax.responseText)
         }
     };
     ajax.open("GET", "URL", true);
     ajax.send();
    
  2. ํ˜„๋Œ€

    // fetch().then(() = > {}).then(() = > {}).catch(() = > {})
    fetch('URL')
    .then((res) = > {
        if(!res.ok){
        throw new Error('Error Msg');
        }
        return res.json();
    })
    .then((result) = > {
        console.log(result);
    })
    .catch((err) = > {
        console.log(err);
    })
    
  3. JQUERY + AJAX

    $.ajax ({
    // URL์€ ํ•„์ˆ˜ ์š”์†Œ์ด๋ฏ€๋กœ ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” Property์ž…๋‹ˆ๋‹ค.
    url : "url", // ์š”์ฒญ์ด ์ „์†ก๋  URL ์ฃผ์†Œ
    type : "GET", // http ์š”์ฒญ ๋ฐฉ์‹ (default: โ€˜GETโ€™)
    async : true,  // ์š”์ฒญ ์‹œ ๋™๊ธฐํ™” ์—ฌ๋ถ€. ๊ธฐ๋ณธ์€ ๋น„๋™๊ธฐ(asynchronous) ์š”์ฒญ (default: true)
    cache : true,  // ์บ์‹œ ์—ฌ๋ถ€
    timeout : 3000, // ์š”์ฒญ ์ œํ•œ ์‹œ๊ฐ„ ์•ˆ์— ์™„๋ฃŒ๋˜์ง€ ์•Š์œผ๋ฉด ์š”์ฒญ์„ ์ทจ์†Œํ•˜๊ฑฐ๋‚˜ error ์ฝœ๋ฐฑ์„ ํ˜ธ์ถœ.(๋‹จ์œ„: ms)
    data  : {key : value}, // ์š”์ฒญ ์‹œ ํฌํ•จ๋˜์–ด์งˆ ๋ฐ์ดํ„ฐ
    processData : true, // ๋ฐ์ดํ„ฐ๋ฅผ ์ปจํ…ํŠธ ํƒ€์ž…์— ๋งž๊ฒŒ ๋ณ€ํ™˜ ์—ฌ๋ถ€
    contentType : "application/json", // ์š”์ฒญ ์ปจํ…ํŠธ ํƒ€์ž…
    dataType : "json", // ์‘๋‹ต ๋ฐ์ดํ„ฐ ํ˜•์‹ (๋ช…์‹œํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ ์ถ”์ธก)
    beforeSend : function () {
    	// XHR Header๋ฅผ ํฌํ•จํ•ด์„œ HTTP Request๋ฅผ ํ•˜๊ธฐ์ „์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
    },
    success : function(data, status, xhr) {
    	// ์ •์ƒ์ ์œผ๋กœ ์‘๋‹ต ๋ฐ›์•˜์„ ๊ฒฝ์šฐ์—๋Š” success ์ฝœ๋ฐฑ์ด ํ˜ธ์ถœ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
    	// ์ด ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์—์„œ๋Š” ์‘๋‹ต ๋ฐ”๋””, ์‘๋‹ต ์ฝ”๋“œ ๊ทธ๋ฆฌ๊ณ  XHR ํ—ค๋”๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    },
    error	: function(xhr, status, error) {
    	// ์‘๋‹ต์„ ๋ฐ›์ง€ ๋ชปํ•˜์˜€๋‹ค๊ฑฐ๋‚˜ ์ •์ƒ์ ์ธ ์‘๋‹ต์ด์ง€๋งŒ ๋ฐ์ดํ„ฐ ํ˜•์‹์„ ํ™•์ธํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—
    	// error ์ฝœ๋ฐฑ์ด ํ˜ธ์ถœ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    	// ์˜ˆ๋ฅผ ๋“ค์–ด, dataType์„ ์ง€์ •ํ•ด์„œ ์‘๋‹ต ๋ฐ›์„ ๋ฐ์ดํ„ฐ ํ˜•์‹์„ ์ง€์ •ํ•˜์˜€์ง€๋งŒ,
    	// ์„œ๋ฒ„์—์„œ๋Š” ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐํ˜•์‹์œผ๋กœ ์‘๋‹ตํ•˜๋ฉด  error ์ฝœ๋ฐฑ์ด ํ˜ธ์ถœ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
    },
    complete : function(xhr, status) {
    	// success์™€ error ์ฝœ๋ฐฑ์ด ํ˜ธ์ถœ๋œ ํ›„์— ๋ฐ˜๋“œ์‹œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
    	// try - catch - finally์˜ finally ๊ตฌ๋ฌธ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
    }
    })
    .done(function(data, textStatus, xhr) {
    	// ์„ฑ๊ณต ํ›„์ฒ˜๋ฆฌ
    })
    .fail(function(xhr, textStatus, errorThrown) {
    	// ์‹คํŒจ ํ›„์ฒ˜๋ฆฌ
    })
    .always(function(data|xhr, textStatus, xhr|errorThrown) {
    	// ์„ฑ๊ณต ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ํ•ญ์ƒ ๋งˆ์ง€๋ง‰์— ์‹คํ–‰
    })
    // success / error ํ˜•ํƒœ
    $.ajax({
    	url: 'URL',
    	type: 'POST',
    	data: yourData,
    	datatype: 'json',
    	success: function (data, textStatus, xhr) { },
    	error: function (xhr, textStatus, errorThrown) { },
    	complete: function(xhr, status) { }
    });
    
    // .done() / .fail() ํ˜•ํƒœ
    $.ajax({
    url: 'URL',
    type: 'POST',
    data: yourData,
    datatype: 'json'
    })
    .done(function(data, textStatus, xhr) { })
    .fail(function(xhr, textStatus, errorThrown) { })
    .always(function(data|xhr, textStatus, xhr|errorThrown) { })
    .then(function(data, textStatus, xhr|errorThrown) { });
    
  4. Axios ํ˜„์žฌ ๋‚ด๊ฐ€ ๋ฆฌ์•กํŠธ๋กœ ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

axios({
    url: 'url',
    method: 'method'
})
.then((res) => {
    if(res.status === 200){
        // the code to run
    }
})
.catch((err) => {
    console.log(err);
})

CORS ์—๋Ÿฌ


AJAX๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋ฉด ์ƒ๊ฐ๋ณด๋‹ค ๋นˆ๋ฒˆํ•˜๊ฒŒ CORS ์—๋Ÿฌ๋ฅผ ๋งˆ์ฃผํ•  ์ˆ˜ ์žˆ๋‹ค.
CORS์—๋Ÿฌ๋Š” ๋‹ค๋ฅธ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋‚ ๋ฆฌ๋Š” ๊ฒฝ์šฐ ๋ฐœ์ƒํ•˜๋Š”๋ฐ,
๋ณด์•ˆ ์ด์Šˆ ๊ด€๋ จ๋œ ๊ฒƒ์ด๋ผ ์‚ฌ์ „์— ์ฐจ๋‹จํ•ด๋‘” ๊ฒƒ์ด๋‹ค.
๋ณด์•ˆ ์ด์Šˆ ๊ด€๋ จ์ด๋‹ˆ ๋„์ง€ ์•Š๋Š” ๊ฒƒ์ด ๋‹น์—ฐ ์ข‹๊ฒ ์ง€๋งŒ
ํ˜น์—ฌ๋ผ๋„ ๊บผ์•ผํ•œ๋‹ค๋ฉด ํ—ค๋”์—

Access-Control-Allow-Origin

์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜

var cors = require('cors');
app.use(cors());

๋กœ CORS ์ •์ฑ… ๊ธฐ๋Šฅ์„ ๋„๋ฉด ๋œ๋‹ค.