thumbnail
๋น„๋™๊ธฐ ํ†ต์‹ ์„ ์œ„ํ•œ AJAX, XML, JSON
Front-End
2023.07.18.

โญ๏ธ ์—ญ๋Œ€๊ธ‰ ๊ณ ๋‚œ๊ณผ ์—ญ๊ฒฝ์˜ ๋‚ 

AJAX(Asynchronous Javascript And Xml)?

AJAX๋Š” ์›น ํŽ˜์ด์ง€๋ฅผ ๋ฆฌ๋กœ๋“œํ•˜์ง€ ์•Š๊ณ ๋„ ์„œ๋ฒ„์™€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž๋Š” ์›น ํŽ˜์ด์ง€๋ฅผ ๋น ๋ฅด๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฒ€์ƒ‰์ฐฝ์— ๊ฒ€์ƒ‰์–ด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๊ฒ€์ƒ‰์–ด์™€ ๊ด€๋ จ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„์—์„œ ๊ฐ€์ ธ์˜ค๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์›น ํŽ˜์ด์ง€์— ๋™์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํŽ˜์ด์ง€์˜ ๋กœ๋”ฉ ์‹œ๊ฐ„์ด ๋‹จ์ถ•๋˜๋ฉฐ, ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ๊ฐœ์„ ๋ฉ๋‹ˆ๋‹ค.

AJAX๋Š” ์ฃผ๋กœ JavaScript์™€ XML์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„๋˜์—ˆ์ง€๋งŒ, ์ตœ๊ทผ์—๋Š” JSON, HTML, CSS ๋“ฑ ๋‹ค์–‘ํ•œ ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ๋„ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์‹œ๋กœ๋Š”, Gmail์˜ ์ด๋ฉ”์ผ ๋ฏธ๋ฆฌ๋ณด๊ธฐ, Facebook์˜ ๋Œ“๊ธ€ ์—…๋ฐ์ดํŠธ, Google Maps์˜ ์‹ค์‹œ๊ฐ„ ๊ฒ€์ƒ‰์–ด ์ž๋™์™„์„ฑ ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

XML?

XML์€ Extensible Markup Language์˜ ์•ฝ์ž๋กœ, ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋งˆํฌ์—… ์–ธ์–ด์ž…๋‹ˆ๋‹ค. HTML๊ณผ ๋น„์Šทํ•œ ๋ฌธ๋ฒ•์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ, ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์ด HTML์˜ ๋ชฉ์ ๊ณผ ๋‹ฌ๋ฆฌ, ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. XML์€ ๋ฐ์ดํ„ฐ์˜ ๊ตฌ์กฐ์™€ ์˜๋ฏธ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ๋Š” ์›น์ƒ์—์„œ ์‰ฝ๊ฒŒ ๊ตํ™˜๋˜๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

โ†’ ์ƒˆ๋กœ์šด ๋งˆํฌ์—… ์–ธ์–ด๋ฅผ ๋งŒ๋“œ๋Š” ๊ธฐ์ˆ 

๐ŸŒ ๋™๊ธฐํ†ต์‹ ์—์„œ ์„œ๋ฒ„์˜ ์‘๋‹ต ๋ฐ์ดํ„ฐ๋Š” ํ•ญ์ƒ ํ™”๋ฉด ์ „์ฒด๋ฅผ ๊ฐฑ์‹ ํ•˜๊ธฐ ์œ„ํ•œ ๋ชจ๋“  ์ปจํ…์ธ ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

๐ŸŒ ๋น„๋™๊ธฐํ†ต์‹ ์—์„œ์˜ ์„œ๋ฒ„์˜ ์‘๋‹ต์€ ํ•ญ์ƒ ๋ฐ์ดํ„ฐ ์ž…๋‹ˆ๋‹ค.
๋ฐ์ดํ„ฐ์˜ ํ˜•์‹์€ ๋‹จ์ˆœ ํ…์ŠคํŠธ(CSV) ์ด๊ฑฐ๋‚˜, JSON ๋˜๋Š” XML ํ˜•์‹์ž…๋‹ˆ๋‹ค.

JSON(JavaScript Object Notation)?

JSON์€ JavaScript Object Notation์˜ ์•ฝ์ž๋กœ, ๊ฒฝ๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ ๊ตํ™˜ ํ˜•์‹์ž…๋‹ˆ๋‹ค. ์‚ฌ๋žŒ์ด ์ฝ๊ณ  ์“ฐ๊ธฐ ์‰ฝ๊ณ , ๊ธฐ๊ณ„๊ฐ€ ๋ถ„์„ํ•˜๊ณ  ์ƒ์„ฑํ•˜๊ธฐ ์‰ฌ์šด ํ˜•์‹์„ ๊ฐ–์ถ”๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. JSON์€ XML๊ณผ ๋Œ€์กฐ์ ์œผ๋กœ ๋” ์ ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋ฉฐ, JavaScript์—์„œ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐฉ์‹๊ณผ ์œ ์‚ฌํ•˜์—ฌ JavaScript์—์„œ ์‰ฝ๊ฒŒ ํŒŒ์‹ฑํ•˜๊ณ  ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์™€์„œ ๋™์ ์œผ๋กœ ์›น ํŽ˜์ด์ง€๋ฅผ ์—…๋ฐ์ดํŠธํ•  ๋•Œ, JSON์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, RESTful API์—์„œ๋„ JSON์„ ์ž์ฃผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

JSON ์˜ˆ์‹œ:

{
    "name": "John Smith",
    "age": 30,
    "city": "New York"
}

์œ„์˜ ์˜ˆ์‹œ๋Š” ์ด๋ฆ„, ๋‚˜์ด, ๋„์‹œ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” JSON ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐ์ฒด๋Š” JavaScript์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const person = {
    name: "John Smith",
    age: 30,
    city: "New York"
};

โ‡’ Data / String

โ‡’ JSON ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฌธ์ž์—ด์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์•”์‹œ์  ๊ฐ์ฒด์ƒ์„ฑ ํ‘œ๊ธฐ๋ฒ•์„ ๊ทธ๋Œ€๋กœ ์ด์šฉํ•˜์—ฌ ์ž‘์„ฑ

โ‡’ JSON ๋ฐ์ดํ„ฐ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

<script>
    var persons = [
        {
            name: '์†ํฅ๋ฏผ',
            gender: '๋‚จ์ž',
            age: 31,
            field: '์ถ•๊ตฌ'

        },
        {
            name: '๋ฅ˜ํ˜„์ง„',
            gender: '๋‚จ์ž',
            age: 37,
            field: '์•ผ๊ตฌ'
        },
        {
            name: '๊น€์—ฐ์•„',
            gender: '์—ฌ์ž',
            age: 34,
            field: 'ํ”ผ๊ฒจ'
        }
    ]
    var personsJSON = JSON.stringify(persons);
    var personsObj = JSON.parse(personsJSON);

    function init() {
        document.querySelector('.jsonStr').innerHTML = personsJSON;

        alert(personsObj[1].name);
    }

    window.addEventListener('load', init)
</script>

๋น„๋™๊ธฐ ํ†ต์‹ ์—์„œ ์„œ๋ฒ„์˜ ์‘๋‹ต์„ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•

๋น„๋™๊ธฐ ํ†ต์‹ ์—์„œ ์„œ๋ฒ„์˜ ์‘๋‹ต์„ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์‘๋‹ต์ด ๋„์ฐฉํ•˜๋ฉด, ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ํ•ด๋‹น ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ , ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜์—์„œ๋Š” ์„œ๋ฒ„์˜ ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์„œ ํ•„์š”ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, JavaScript์—์„œ AJAX๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„์™€ ๋น„๋™๊ธฐ ํ†ต์‹ ์„ ํ•œ๋‹ค๋ฉด, XMLHttpRequest ๊ฐ์ฒด์˜ onreadystatechange ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„์˜ ์‘๋‹ต์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋Š” ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์‘๋‹ต์ด ๋„์ฐฉํ•  ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜์—์„œ๋Š” XMLHttpRequest ๊ฐ์ฒด์˜ readyState์™€ status ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„์˜ ์‘๋‹ต์„ ํ™•์ธํ•˜๊ณ , ํ•„์š”ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
    if (this.readyState === 4 && this.status === 200) {
        // ์„œ๋ฒ„์˜ ์‘๋‹ต์„ ํ™•์ธํ•˜๊ณ  ํ•„์š”ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
        console.log(this.responseText);
    }
};
xhttp.open("GET", "example.com/api/data", true);
xhttp.send();

์œ„์˜ ์ฝ”๋“œ๋Š” GET ๋ฐฉ์‹์œผ๋กœ example.com/api/data์— ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ , ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์‘๋‹ต์ด ๋„์ฐฉํ•˜๋ฉด ์ด๋ฅผ ์ฝ˜์†”์— ์ถœ๋ ฅํ•˜๋Š” ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

Thank You for Visiting My Blog, Have a Good Day ๐Ÿ˜†
ยฉ 2023 Developer JaeHyeon, Powered By Gatsby.