๋น๋๊ธฐ ์์ฒญ
๋๊ธฐ์
์ฌ๋ฌ ์์
์ด ์๋ก์ ํ์ด๋ฐ(๋๊ธฐ)์ ๋ง์ถ์ด ์์๋๋ก ๋์ํ๋ ๋ฐฉ์
๋น๋๊ธฐ์
์๋ก์ ๋์ ํ์ด๋ฐ(๋๊ธฐ)์ ๋ง์ถ์ง ์๊ณ ๊ฐ์ ๋
๋ฆฝ์ ์ผ๋ก ๋์ํ๋ ๋ฐฉ์
๋๊ธฐ์
์ฑํฌ๋ก๋์ด์ฆ๋ ๋ชจ๋ ๋์์ ๋ง์ถฐ์ผ ํ๋ ๋๊ธฐ์ ์คํฌ์ธ
๋น๋๊ธฐ์
์ถ๊ตฌ๋ ๊ฐ์ ํ์ด๋ฐ๋๋ก ์์ง์ด๋ ๋น๋๊ธฐ์ ์คํฌ์ธ ๋ค.
AJAX (Asynchronous JavaScript And XML)
ํ์ด์ง ์ ์ฒด ์๋ก๊ณ ์นจ ์์ด ์๋ฒ์ ํ์ํ ๋ฐ์ดํฐ๋ง ์ฃผ๊ณ ๋ฐ์ ํ๋ฉด ์ผ๋ถ๋ง ๊ฐฑ์ ํ๋ ๊ธฐ์
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
๋ณต์ฌ
โข 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
๋ณต์ฌ
โข
xhr: XMLHttpRequest ๊ฐ์ฒด (์ํ ์ฝ๋, ์๋ต ํค๋ ๋ฑ ํฌํจ)
โข
status: ์๋ฌ ํ์
๋ฌธ์์ด ("timeout", "error", "abort" ๋ฑ)
โข
error: HTTP ์ํ ๋ฉ์์ง ("Not Found", "Internal Server Error" ๋ฑ)
์๋ฒ ์๋ต ์์ (JSON)
{
"id": 1,
"title": "๊ฒ์๊ธ ์ ๋ชฉ",
"writer": "aloha",
"content": "AJAX ์ ๋ํ์ฌ ์์๋ด
๋๋ค."
}
JSON
๋ณต์ฌ
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
๋ณต์ฌ







