Search
Duplicate

๋น„๋™๊ธฐ ์š”์ฒญ

๋น„๋™๊ธฐ ์š”์ฒญ

๋™๊ธฐ์‹

์—ฌ๋Ÿฌ ์ž‘์—…์ด ์„œ๋กœ์˜ ํƒ€์ด๋ฐ(๋™๊ธฐ)์„ ๋งž์ถ”์–ด ์ˆœ์„œ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š” ๋ฐฉ์‹
์š”์ฒญ ํ›„, ์‘๋‹ต์ด ์˜ฌ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.

๋น„๋™๊ธฐ์‹

์„œ๋กœ์˜ ๋™์ž‘ ํƒ€์ด๋ฐ(๋™๊ธฐ)์„ ๋งž์ถ”์ง€ ์•Š๊ณ  ๊ฐ์ž ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๋ฐฉ์‹
์š”์ฒญ ํ›„, ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค์Œ ์š”์ฒญ์„ ๋˜ ํ•œ๋‹ค.

๋™๊ธฐ์‹

๋™๊ธฐ์‹ ๋น„์œ 
์‹ฑํฌ๋กœ๋‚˜์ด์ฆˆ๋Š” ๋ชจ๋“  ๋™์ž‘์„ ๋งž์ถฐ์•ผ ํ•˜๋Š” ๋™๊ธฐ์‹ ์Šคํฌ์ธ 

๋น„๋™๊ธฐ์‹

๋น„๋™๊ธฐ์‹ ๋น„์œ 
์ถ•๊ตฌ๋Š” ๊ฐ์ž ํƒ€์ด๋ฐ๋Œ€๋กœ ์›€์ง์ด๋Š” ๋น„๋™๊ธฐ์‹ ์Šคํฌ์ธ ๋‹ค.

AJAX (Asynchronous JavaScript And XML)

ํŽ˜์ด์ง€ ์ „์ฒด ์ƒˆ๋กœ๊ณ ์นจ ์—†์ด ์„œ๋ฒ„์™€ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ์ฃผ๊ณ ๋ฐ›์•„ ํ™”๋ฉด ์ผ๋ถ€๋งŒ ๊ฐฑ์‹ ํ•˜๋Š” ๊ธฐ์ˆ 
XML์ด๋ผ๋Š” ์ด๋ฆ„์ด ์žˆ์ง€๋งŒ, ์š”์ฆ˜์€ JSON์„ ์ฃผ๋กœ ์‚ฌ์šฉ

AJAX๊ฐ€ ๋“ฑ์žฅํ•œ ์ด์œ 

๋™๊ธฐ์‹ ์š”์ฒญ

sequenceDiagram
    participant User as ์‚ฌ์šฉ์ž
    participant Browser as ๋ธŒ๋ผ์šฐ์ €
    participant Server as ์„œ๋ฒ„

    User->>Browser: ํผ ์ œ์ถœ (์˜ˆ: ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ ํด๋ฆญ)
    Browser->>Server: HTTP ์š”์ฒญ ์ „์†ก
    Server->>Server: ์š”์ฒญ ์ฒ˜๋ฆฌ
    Server-->>Browser: ์ „์ฒด HTML ํŽ˜์ด์ง€ ์‘๋‹ต
    User->>Browser: ํŽ˜์ด์ง€ ์ „์ฒด ์ƒˆ๋กœ๊ณ ์นจ
    Browser->>Server: ํŽ˜์ด์ง€ ์š”์ฒญ
    Server-->>Browser: ์ „์ฒด HTML ํŽ˜์ด์ง€ ์‘๋‹ต
Mermaid
๋ณต์‚ฌ
๋ฌธ์ œ์ :
โ€ข
ํ™”๋ฉด ๊นœ๋นก์ž„
โ€ข
๋А๋ฆฐ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜
โ€ข
๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ์ „์†ก
ํŒŒ์ผ ๋ชฉ๋ก์—์„œ ํŒŒ์ผ ์‚ญ์ œ ๋˜๋Š”, ๋Œ“๊ธ€ ๋“ฑ๋ก ๊ธฐ๋Šฅ ๋“ฑ์€ ํŽ˜์ด์ง€ ์ „์ฒด๋ฅผ ๋‹ค์‹œ ๋กœ๋“œํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ํ™”๋ฉด์˜ ์ผ๋ถ€๋งŒ ๊ฐฑ์‹ ๋˜์–ด์•ผ ํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ๋™๊ธฐ์‹ ๋ฐฉ์‹์—์„œ๋Š” ํŽ˜์ด์ง€ ์ „์ฒด๋ฅผ ์š”์ฒญํ•ด์„œ ๋‹ค์‹œ ๋กœ๋“œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น„๋™๊ธฐ์‹ ๋ฐฉ์‹์— ๋น„ํ•˜์—ฌ ๋น„ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.

AJAX ๋ฐฉ์‹

sequenceDiagram
    participant User as ์‚ฌ์šฉ์ž
    participant Browser as ๋ธŒ๋ผ์šฐ์ €
    participant Server as ์„œ๋ฒ„

    User->>Browser: ์ด๋ฒคํŠธ ๋ฐœ์ƒ (์˜ˆ: ๋ฒ„ํŠผ ํด๋ฆญ)
    Browser->>Server: AJAX ์š”์ฒญ ์ „์†ก
    Server->>Server: ์š”์ฒญ ์ฒ˜๋ฆฌ
    Server-->>Browser: ๋ฐ์ดํ„ฐ(JSON) ์‘๋‹ต
    Browser->>Browser: JavaScript๋กœ DOM ์กฐ์ž‘
    Browser->>User: ํ™”๋ฉด ์ผ๋ถ€๋งŒ ๋ณ€๊ฒฝ (์ƒˆ๋กœ๊ณ ์นจ ์—†์Œ)
Mermaid
๋ณต์‚ฌ
์žฅ์ :
โ€ข
๋น ๋ฅธ ๋ฐ˜์‘
โ€ข
UX ํ–ฅ์ƒ
โ€ข
ํŠธ๋ž˜ํ”ฝ ๊ฐ์†Œ
์ข‹์•„์š”, ์žฅ๋ฐ”๊ตฌ๋‹ˆ, ์•„์ดํ…œ ์‚ญ์ œ ๋“ฑ์˜ ๊ธฐ๋Šฅ์€ ๋น„๋™๊ธฐ์‹ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด ํŽ˜์ด์ง€์˜ ์ผ๋ถ€๋งŒ ๊ฐฑ์‹ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

AJAX ํ•ต์‹ฌ ๊ฐœ๋… ์ •๋ฆฌ

๊ฐœ๋…
์„ค๋ช…
๋น„๋™๊ธฐ
์š”์ฒญ ํ›„ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Œ
๋…ผ๋ธ”๋กœํ‚น
ํ™”๋ฉดยท๋‹ค๋ฅธ ์ž‘์—… ๋ฉˆ์ถ”์ง€ ์•Š์Œ
JSON
์„œ๋ฒ„ ํด๋ผ์ด์–ธํŠธ ๋ฐ์ดํ„ฐ ํ˜•์‹
๋ถ€๋ถ„ ๊ฐฑ์‹ 
DOM ์ผ๋ถ€๋งŒ ๋ณ€๊ฒฝ

AJAX ๋™์ž‘ ํ๋ฆ„ (์ค‘์š” )

sequenceDiagram
    participant User as 1. ์‚ฌ์šฉ์ž
    participant JS as 2. JavaScript
    participant Server as 3. ์„œ๋ฒ„
    participant DOM as 5. DOM

    User->>JS: ์ด๋ฒคํŠธ ๋ฐœ์ƒ (ํด๋ฆญ, ์ž…๋ ฅ)
    JS->>Server: AJAX ์š”์ฒญ ์ „์†ก
    Server->>Server: ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ
    Server-->>JS: JSON ์‘๋‹ต ๋ฐ˜ํ™˜
    JS->>DOM: DOM ์กฐ์ž‘ํ•˜์—ฌ ํ™”๋ฉด ๊ฐฑ์‹ 
Mermaid
๋ณต์‚ฌ
1. ์‚ฌ์šฉ์ž ์ด๋ฒคํŠธ ๋ฐœ์ƒ (ํด๋ฆญ, ์ž…๋ ฅ) 2. JavaScript๊ฐ€ AJAX ์š”์ฒญ ์ „์†ก 3. ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ 4. JSON ์‘๋‹ต ๋ฐ˜ํ™˜ 5. JS๊ฐ€ DOM์„ ์กฐ์ž‘ํ•˜์—ฌ ํ™”๋ฉด ๊ฐฑ์‹ 
Plain Text
๋ณต์‚ฌ

AJAX ์‚ฌ์šฉ ์ „/ํ›„ ๋น„๊ต

AJAX ๋ฏธ์‚ฌ์šฉ (๋™๊ธฐ์‹ ์š”์ฒญ)

<form action="/board" method="post"> <button>๋“ฑ๋กํ•˜๊ธฐ</button> </form>
HTML
๋ณต์‚ฌ
โ€ข
์„ฑ๊ณต ์‹œ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ (์ „์ฒด ํŽ˜์ด์ง€๋ฅผ ๋กœ๋“œ)
โ€ข
์‹คํŒจ ์‹œ ๋“ฑ๋ก ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ (์ „์ฒด ํŽ˜์ด์ง€๋ฅผ ๋กœ๋“œ)

AJAX ์‚ฌ์šฉ (๋น„๋™๊ธฐ์‹ ์š”์ฒญ)

fetch("/board", { method: "POST", body: JSON.stringify(data) });
JavaScript
๋ณต์‚ฌ
โ€ข
์„ฑ๊ณต ์‹œ ๊ฒฝ๊ณ ์ฐฝ ์ถœ๋ ฅ ํ›„, ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ์ด๋™(JavaScript)
โ€ข
์‹คํŒจ ์‹œ ๊ฒฝ๊ณ ์ฐฝ๋งŒ ํ‘œ์‹œ
โ€ข
ํŽ˜์ด์ง€ ์œ ์ง€
fetch ํ•จ์ˆ˜
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋‚ด์žฅ ํ•จ์ˆ˜๋กœ, ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” AJAX ์š”์ฒญ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

AJAX ๊ตฌํ˜„ ๋ฐฉ๋ฒ• 3๊ฐ€์ง€

โ‘  XMLHttpRequest

const xhr = new XMLHttpRequest(); xhr.open("GET", "/data"); xhr.send(); xhr.onload = function() { if (xhr.status === 200) { console.log(xhr.responseText); } }; xhr.onerror = function() { console.error("์š”์ฒญ ์‹คํŒจ"); };
JavaScript
๋ณต์‚ฌ
๊ฐ€์žฅ ๊ธฐ์ดˆ์ ์ธ ๋ฐฉ์‹์ด์ง€๋งŒ, ๊ฐ์ฒด์™€ ํ•จ์ˆ˜ ์ด๋ฆ„์ด ๊ธธ์–ด์„œ ๊ฐ€๋…์„ฑ์ด ๋น„๊ต์  ๋‚ฎ๊ธฐ ๋•Œ๋ฌธ์— ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

โ‘ก fetch API (ํ‘œ์ค€, ์ถ”์ฒœ )

fetch(`/api/board/${id}`) .then(res => { if (!res.ok) { throw new Error('HTTP error! status: ' + res.status); } return res.json(); }) .then(data => { console.log(data); // ์„ฑ๊ณต ์‹œ ์ฒ˜๋ฆฌ }) .catch(error => { console.error('์š”์ฒญ ์‹คํŒจ:', error); // ์‹คํŒจ ์‹œ ์ฒ˜๋ฆฌ });
JavaScript
๋ณต์‚ฌ
then: ์‘๋‹ต ์„ฑ๊ณต ์‹œ ์ฒ˜๋ฆฌ
catch: ๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜ ๋˜๋Š” ์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ ์ฒ˜๋ฆฌ
res.ok: HTTP ์ƒํƒœ ์ฝ”๋“œ๊ฐ€ 200-299 ๋ฒ”์œ„์ธ์ง€ ํ™•์ธ

โ‘ข jQuery AJAX (๋ ˆ๊ฑฐ์‹œ)

$.ajax({ url: `/api/board/${id}`, type: 'GET', // ์š”์ฒญ ์„ฑ๊ณต success: function(data) { console.log(data); }, // ์š”์ฒญ ์‹คํŒจ error: function(xhr, status, error) { console.error('์š”์ฒญ ์‹คํŒจ:', status); console.error('์ƒํƒœ ์ฝ”๋“œ:', xhr.status); console.error('์—๋Ÿฌ:', error); } });
JavaScript
๋ณต์‚ฌ
success: ์š”์ฒญ ์„ฑ๊ณต ์‹œ ์ฒ˜๋ฆฌ (data: ์„œ๋ฒ„ ์‘๋‹ต ๋ฐ์ดํ„ฐ)
error: ์š”์ฒญ ์‹คํŒจ ์‹œ ์ฒ˜๋ฆฌ
โ€ข
xhr: XMLHttpRequest ๊ฐ์ฒด (์ƒํƒœ ์ฝ”๋“œ, ์‘๋‹ต ํ—ค๋” ๋“ฑ ํฌํ•จ)
โ€ข
status: ์—๋Ÿฌ ํƒ€์ž… ๋ฌธ์ž์—ด ("timeout", "error", "abort" ๋“ฑ)
โ€ข
error: HTTP ์ƒํƒœ ๋ฉ”์‹œ์ง€ ("Not Found", "Internal Server Error" ๋“ฑ)
jQuery๋Š” ๋ ˆ๊ฑฐ์‹œ ๋ฐฉ์‹์ด๋ฏ€๋กœ fetch API ์‚ฌ์šฉ์„ ๊ถŒ์žฅ

์„œ๋ฒ„ ์‘๋‹ต ์˜ˆ์‹œ (JSON)

{ "id": 1, "title": "๊ฒŒ์‹œ๊ธ€ ์ œ๋ชฉ", "writer": "aloha", "content": "AJAX ์— ๋Œ€ํ•˜์—ฌ ์•Œ์•„๋ด…๋‹ˆ๋‹ค." }
JSON
๋ณต์‚ฌ
AJAX๋Š” HTML์ด ์•„๋‹ˆ๋ผ โ€œ๋ฐ์ดํ„ฐโ€๋ฅผ ๋ฐ›๋Š”๋‹ค

AJAX ๋Œ€ํ‘œ ํ™œ์šฉ ์‚ฌ๋ก€

์•„์ด๋”” ์ค‘๋ณต ์ฒดํฌ
์‹ค์‹œ๊ฐ„ ๊ฒ€์ƒ‰
๋Œ“๊ธ€ ์ž‘์„ฑ
์ข‹์•„์š” / ์กฐํšŒ์ˆ˜ ์ฆ๊ฐ€
์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ˆ˜๋Ÿ‰ ๋ณ€๊ฒฝ
์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ

AJAX vs Form Submit

๊ตฌ๋ถ„
Form
AJAX
ํŽ˜์ด์ง€ ์ƒˆ๋กœ๊ณ ์นจ
UX
๋‚˜์จ
์ข‹์Œ
์ฒ˜๋ฆฌ ๋ฐฉ์‹
๋™๊ธฐ
๋น„๋™๊ธฐ
ํ™”๋ฉด ์ œ์–ด
์–ด๋ ค์›€
์ž์œ ๋กœ์›€

Spring / JSP์™€ AJAX ์—ฐ๊ณ„

Controller (Spring)

@GetMapping("/board/{id}") @ResponseBody public Board getBoard(@PathVariable("id") String id) { return new Board(id, "์ œ๋ชฉ", "์ž‘์„ฑ์ž", "๋‚ด์šฉ"); }
Java
๋ณต์‚ฌ

AJAX ๊ตฌํ˜„ ๋ฐฉ๋ฒ• ๋น„๊ต

โ‘  XMLHttpRequest

const xhr = new XMLHttpRequest(); xhr.open("GET", `/board/${id}`); xhr.send(); xhr.onload = function() { if (xhr.status === 200) { const board = JSON.parse(xhr.responseText); document.querySelector("#title").innerText = board.title; } };
JavaScript
๋ณต์‚ฌ

โ‘ก fetch API

fetch(`/board/${id}`) .then(res => res.json()) .then(board => { document.querySelector("#title").innerText = board.title; }) .catch(error => { console.error('์š”์ฒญ ์‹คํŒจ:', error); });
JavaScript
๋ณต์‚ฌ

โ‘ข jQuery $.ajax

$.ajax({ url: `/board/${id}`, type: 'GET', success: function(board) { $("#title").text(board.title); }, error: function(xhr, status, error) { console.error('์š”์ฒญ ์‹คํŒจ:', error); } });
JavaScript
๋ณต์‚ฌ