자바스크립트를 사용하여 브라우져가 서버에게 비동기 방식으로 데이터를 요청하고, 서버가 응답한 데이터를 수신해서 웹페이지를 동적으로 갱신하는 프로그래밍 방식
XMLHttpRequest 객체를 기반으로 동작한다XMLHttpRequest 은 HTTP 비동기 통신을 위한 메서드와 프로퍼티를 제공한다

클라이언트와 서버 간의 HTTP 통신을 위한 텍스트 데이터 포맷
자바스크립트에 종속되지 않는 언어 독립형 데이터 포맷으로, 대부분의 프로그래밍 언어에서 사용
// ✅ JSON 메서드 총정리
const obj = { name: "min", age: 27 };
// 1️⃣ 객체 → JSON 문자열 변환
const jsonString = JSON.stringify(obj);
// '{"name":"min","age":27}'
// 2️⃣ JSON 문자열 → 객체 변환
const parsedObj = JSON.parse(jsonString);
// { name: "min", age: 27 }
// 3️⃣ 들여쓰기 옵션 (가독성 향상)
const pretty = JSON.stringify(obj, null, 2);
/*
{
"name": "min",
"age": 27
}
*/
// 4️⃣ 특정 키만 직렬화 (replacer)
const partial = JSON.stringify(obj, ["name"]);
// '{"name":"min"}'
// 5️⃣ 변환 시 함수 적용 (replacer 함수)
const custom = JSON.stringify(obj, (key, value) => {
if (key === "age") return value + 1;
return value;
});
// '{"name":"min","age":28}'
// 6️⃣ JSON.parse 두 번째 인자 reviver (역직렬화 시 값 가공)
const revived = JSON.parse('{"score": 100}', (key, value) => {
if (key === "score") return value + 50;
return value;
});
// { score: 150 }
// 7️⃣ 깊은 복사 활용
const deepCopy = JSON.parse(JSON.stringify(obj));
// obj를 완전히 복사 (참조 분리)
// 8️⃣ 예외 처리 (try...catch)
try {
JSON.parse("잘못된 JSON");
} catch (e) {
console.error("유효하지 않은 JSON 형식입니다:", e.message);
}
// 9️⃣ 순환 참조 객체 방지 예시
const a = {};
a.self = a;
// JSON.stringify(a); // ❌ TypeError
const safeStringify = (value) => {
const seen = new WeakSet();
return JSON.stringify(value, (key, val) => {
if (typeof val === "object" && val !== null) {
if (seen.has(val)) return "[Circular]";
seen.add(val);
}
return val;
});
};
console.log(safeStringify(a));
// '{"self":"[Circular]"}'
// ✅ 요약
// stringify(obj, replacer?, space?) → JSON 문자열 변환
// parse(jsonString, reviver?) → JS 객체로 변환
// ✅ XMLHttpRequest 주요 메서드 & 프로퍼티 총정리
// 1️⃣ 기본 구조
const xhr = new XMLHttpRequest(); // 인스턴스 생성
// 2️⃣ 메서드
xhr.open("GET", "https://jsonplaceholder.typicode.com/posts/1", true);
// → (method, url, async) : 요청 초기화
xhr.setRequestHeader("Content-Type", "application/json");
// → 요청 헤더 설정
xhr.send();
// → 요청 전송 (GET은 보통 send() 빈 상태, POST는 body 포함)
xhr.abort();
// → 요청 중단
xhr.overrideMimeType("application/json");
// → 응답의 MIME 타입 강제 지정
// 3️⃣ 프로퍼티
console.log(xhr.readyState);
// → 요청 상태 (0~4)
// 0: UNSENT, 1: OPENED, 2: HEADERS_RECEIVED, 3: LOADING, 4: DONE
console.log(xhr.status);
// → HTTP 상태 코드 (예: 200, 404, 500 등)
console.log(xhr.statusText);
// → 상태 텍스트 ("OK", "Not Found" 등)
console.log(xhr.responseText);
// → 응답 본문 (문자열)
console.log(xhr.responseXML);
// → XML 응답이 있을 때 XML DOM 객체로 반환
console.log(xhr.responseURL);
// → 요청이 최종적으로 도달한 URL
console.log(xhr.responseType);
// → 응답 타입 설정 ("", "text", "json", "blob", "arraybuffer" 등)
xhr.timeout = 5000;
// → 요청 제한 시간 (ms 단위)
xhr.withCredentials = true;
// → CORS 요청 시 쿠키 포함 여부
// 4️⃣ 이벤트 핸들러
xhr.onload = function() {
console.log("✅ 요청 완료:", xhr.responseText);
};
xhr.onerror = function() {
console.error("❌ 요청 오류 발생");
};
xhr.onprogress = function(e) {
if (e.lengthComputable) {
console.log(`📡 진행률: ${(e.loaded / e.total) * 100}%`);
}
};
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
console.log("🎯 응답 완료:", xhr.responseText);
}
};
// 5️⃣ 응답 예시 (POST 요청)
const xhr2 = new XMLHttpRequest();
xhr2.open("POST", "https://jsonplaceholder.typicode.com/posts", true);
xhr2.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
xhr2.onload = () => console.log("✅ 응답:", xhr2.responseText);
xhr2.send(JSON.stringify({ title: "min", body: "frontend", userId: 1 }));
/*
📌 요약 정리
──────────────────────────────
메서드:
open(), send(), setRequestHeader(), abort(), overrideMimeType()
프로퍼티:
readyState, status, statusText, responseText, responseXML, responseURL,
responseType, timeout, withCredentials
이벤트:
onload, onerror, onprogress, onreadystatechange
──────────────────────────────
*/
| 구분 | XMLHttpRequest | fetch |
|---|---|---|
| 등장 시기 | 2000년대 초 (Ajax 시대) | ES6 (2015년) 이후 |
| API 스타일 | 콜백 기반 (event-driven) | Promise 기반 (modern) |
| 비동기 처리 | onreadystatechange 등으로 상태 체크 | async/await 로 간결하게 |
| 응답 처리 | xhr.responseText, xhr.responseXML | .json(), .text(), .blob() 등 체이닝 |
| CORS 제어 | 제한적 (withCredentials) | 명시적 (mode, credentials 옵션) |
| Stream 처리 | 불가능 | 가능 (Response body 스트림 사용 가능) |
| 타임아웃 설정 | xhr.timeout 지원 | 직접 AbortController로 제어해야 함 |
| 에러 처리 | HTTP 에러도 onload 호출됨 (직접 status 검사 필요) | HTTP 에러도 reject로 throw됨 (try/catch 처리 가능) |
| Request / Response 객체 구조화 | ❌ 단순 속성 나열 | ✅ 구조화된 객체 (Request, Response, Headers 클래스) |