JS - AJAX

99Β·2024λ…„ 10μ›” 28일

JS(μžλ°”μŠ€ν¬λ¦½νŠΈ)

λͺ©λ‘ 보기
5/11
post-thumbnail

πŸ“– AJAX(Asynchronous Javascript And XML)λž€

AJAXλž€ asynchronous Javascript and XML μž…λ‹ˆλ‹€. μš”μ¦˜μ€ XML 보닀 HTMLμ΄λ‚˜ JSON을 더 많이 μ“°μ§€λ§Œ, 개발 λ‹Ήμ‹œ xml이 μ£Όλ₯˜λΌμ„œ 이름이 κ·Έλ ‡κ²Œ 된 κ²ƒμž…λ‹ˆλ‹€.

기쑴의 μ›Ήμ—μ„œλŠ” ν•œ 번 νŽ˜μ΄μ§€λ₯Ό λ‘œλ”©ν•˜λ©΄ λ‹€λ₯Έ νŽ˜μ΄μ§€λ₯Ό λ‘œλ”©ν•˜κΈ° μœ„ν•΄μ„œ 링크λ₯Ό 타고 λ„˜μ–΄κ°€μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€. κ·Έλ ‡κ²Œ 되면 ν”νžˆ λ§ν•˜λŠ” νŽ˜μ΄μ§€ κΉœλΉ‘μž„μ΄ λ°œμƒν•©λ‹ˆλ‹€.

AJAX λŠ” μ›ΉνŽ˜μ΄μ§€ 전체λ₯Ό λ‹€μ‹œ λ‘œλ”©ν•˜μ§€ μ•Šκ³ λ„, μ›ΉνŽ˜μ΄μ§€μ˜ μΌλΆ€λΆ„λ§Œμ„ κ°±μ‹ ν•  수 있게 ν•΄μ€λ‹ˆλ‹€. Ajaxλ₯Ό μ΄μš©ν•˜λ©΄ λ°±κ·ΈλΌμš΄λ“œ μ˜μ—­μ—μ„œ μ„œλ²„μ™€ ν†΅μ‹ ν•˜μ—¬, κ·Έ κ²°κ³Όλ₯Ό μ›ΉνŽ˜μ΄μ§€μ˜ μΌλΆ€λΆ„μ—λ§Œ ν‘œμ‹œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

이처럼 λΉ„λ™κΈ°μ μœΌλ‘œ μ„œλ²„μ— μš”μ²­μ„ ν•˜μ—¬ νŽ˜μ΄μ§€ μ „ν™˜ 없이도 μƒˆλ‘œμš΄ 데이터λ₯Ό κ°€μ Έμ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

AJAXλ₯Ό ν†΅ν•œ μ›Ή λΈŒλΌμš°μ €μ™€ μ›Ή μ„œλ²„ κ°„μ˜ 톡신 μ ˆμ°¨λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  1. μ‚¬μš©μžμ— μ˜ν•œ μš”μ²­ μ΄λ²€νŠΈκ°€ λ°œμƒ
  2. μš”μ²­ μ΄λ²€νŠΈκ°€ λ°œμƒν•˜λ©΄ 이벀트 ν•Έλ“€λŸ¬μ— μ˜ν•΄ μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ 호좜
  3. μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” XMLHttpRequest 객체λ₯Ό μ‚¬μš©ν•˜μ—¬ μ„œλ²„λ‘œ μš”μ²­μ„ 보냄
  4. μ„œλ²„λŠ” 전달받은 XMLHttpRequest 객체λ₯Ό κ°€μ§€κ³  μš”μ²­μ„ 처리
  5. μ„œλ²„λŠ” μ²˜λ¦¬ν•œ κ²°κ³Όλ₯Ό HTML, XML λ˜λŠ” JSON ν˜•νƒœμ˜ 응닡 데이터λ₯Ό 생성 μ›ΉλΈŒλΌμš°μ €μ— 전달
  6. μ΄λ•Œ μ „λ‹¬λ˜λŠ” 응닡은 μƒˆλ‘œμš΄ νŽ˜μ΄μ§€λ₯Ό 전보 λ³΄λ‚΄λŠ” 것이 μ•„λ‹ˆλΌ ν•„μš”ν•œ λ°μ΄ν„°λ§Œμ„ 전달함
  7. μ„œλ²„λ‘œλΆ€ν„° 전달받은 데이터λ₯Ό κ°€μ§€κ³  μ›ΉνŽ˜μ΄μ§€μ˜ μΌλΆ€λΆ„λ§Œμ„ κ°±μ‹ ν•˜λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό 호좜. 결과적으둜 μ›ΉνŽ˜μ΄μ§€μ˜ μΌλΆ€λΆ„λ§Œμ΄ λ‹€μ‹œ λ‘œλ”©λ˜μ–΄ ν‘œμ‹œλ¨



πŸ“– XMLHttpRequest 객체

XMLHttpRequest κ°μ²΄λŠ” λΈŒλΌμš°μ €μ™€ μ„œλ²„ κ°„μ˜ 데이터λ₯Ό κ΅ν™˜ν•  수 μžˆλ„λ‘ λ„μ™€μ£ΌλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ 객체둜, AJAX μš”μ²­μ„ 톡해 λΉ„λ™κΈ°μ μœΌλ‘œ 데이터λ₯Ό μ„œλ²„μ— μš”μ²­ν•˜κ³ , 응닡을 받을 수 μžˆμŠ΅λ‹ˆλ‹€. μ›Ή λΈŒλΌμš°μ €κ°€ λ°±κ·ΈλΌμš΄λ“œμ—μ„œ κ³„μ†ν•΄μ„œ μ„œλ²„μ™€ 톡신할 수 μžˆλŠ” 것은 λ°”λ‘œ 이 객체λ₯Ό μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

1. κΈ°λ³Έ μ‚¬μš© 방법

  1. XMLHttpRequest 객체 생성
  2. μš”μ²­ μ€€λΉ„ (openλ©”μ„œλ“œ μ‚¬μš©)
  3. μš”μ²­ 전솑 (sendλ©”μ„œλ“œ μ‚¬μš©)
  4. 응닡 처리 (onreadystatechangeλ˜λŠ” load이벀트)

2. 기본 예제

μ•„λž˜λŠ” XMLHttpRequestλ₯Ό μ‚¬μš©ν•΄ μ„œλ²„λ‘œ GET μš”μ²­μ„ 보내고 응닡을 μ²˜λ¦¬ν•˜λŠ” μ˜ˆμ œμž…λ‹ˆλ‹€.

// 1. XMLHttpRequest 객체 생성
const xhr = new XMLHttpRequest();

// 2. μš”μ²­ μ€€λΉ„ (GET μš”μ²­ 방식, URL, 비동기 μ—¬λΆ€)
xhr.open("GET", "https://api.example.com/data", true);

// 3. 응닡 처리
xhr.onreadystatechange = function() {
  if (xhr.readyState === 4) { // μš”μ²­ μ™„λ£Œ
    if (xhr.status === 200) { // 성곡
      const data = JSON.parse(xhr.responseText);
      console.log("Response data:", data);
    } else {
      console.error("Error:", xhr.statusText);
    }
  }
};

// 4. μš”μ²­ 전솑
xhr.send();


3. μ£Όμš” 속성

  • xhr.readyState : μš”μ²­μ˜ μƒνƒœλ₯Ό λ‚˜νƒ€λ‚΄λŠ” κ°’μœΌλ‘œ, λ‹€μŒκ³Ό 같은 μƒνƒœκ°€ μžˆμŠ΅λ‹ˆλ‹€.
    0: UNSENT - μš”μ²­μ΄ μ΄ˆκΈ°ν™” λ˜μ§€ μ•ŠμŒ
    1: OPEND - open()이 호좜된 μƒνƒœ
    2: HEADERS_RECEIVED - μš”μ²­μ΄ μˆ˜μ‹ λ˜κ³ , 응닡 헀더가 쀀비됨
    3: LOADING - 응닡 본문을 λ°›κ³  μžˆλŠ” μƒνƒœ
    4: DONE - μš”μ²­μ΄ μ™„λ£Œλ˜κ³  응닡이 μ€€λΉ„λœ μƒνƒœ
  • xhr.status : μ„œλ²„ μ‘λ‹΅μ˜ HTTP μƒνƒœ μ½”λ“œ (200, 404, 500 λ“±)
    200 : μ„œλ²„μ— λ¬Έμ„œκ°€ μ‘΄μž¬ν•¨, 404 : μ„œλ²„μ— λ¬Έμ„œκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠμŒ
  • xhr.responseText : μ„œλ²„λ‘œλΆ€ν„° 받은 응닡 데이터λ₯Ό λ¬Έμžμ—΄ ν˜•νƒœλ‘œ λ°˜ν™˜ ν•©λ‹ˆλ‹€.
  • xhr.responseXML : XML ν˜•νƒœλ‘œ 응닡을 받을 λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.


4. POST μš”μ²­ 예제

POST μš”μ²­μ€ μ„œλ²„μ— 데이터λ₯Ό 전솑할 λ•Œ 주둜 μ‚¬μš©λ©λ‹ˆλ‹€.

// 1. XMLHttpRequest 객체 생성
const xhr = new XMLHttpRequest();

// 2. μš”μ²­ μ€€λΉ„ (POST μš”μ²­ 방식)
xhr.open("POST", "https://api.example.com/data", true);
xhr.setRequestHeader("Content-Type", "application/json"); // 헀더 μ„€μ •

// 3. 응닡 처리
xhr.onreadystatechange = function() {
  if (xhr.readyState === 4 && xhr.status === 200) {
    const response = JSON.parse(xhr.responseText);
    console.log("Response:", response);
  }
};

// 4. μš”μ²­ 전솑
const data = JSON.stringify({ name: "Alice", age: 30 });
xhr.send(data);

5. XMLHttpRequest와 Fetch API 비ꡐ

XMLHttpRequestλŠ” 였래된 λ°©μ‹μ΄μ§€λ§Œ, μ΅œμ‹  μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” Fetch APIκ°€ λŒ€μ²΄ κΈ°λŠ₯을 μ œκ³΅ν•˜μ—¬ μ½”λ“œκ°€ 더 κ°„κ²°ν•΄μ‘ŒμŠ΅λ‹ˆλ‹€. XMLHttpRequestλŠ” 콜백 기반이라 μ½”λ“œκ°€ λ³΅μž‘ν•΄μ§ˆ 수 μžˆμ§€λ§Œ, Fetch APIλŠ” Promise 기반으둜 비동기 처리λ₯Ό 보닀 κ°„λ‹¨ν•˜κ²Œ λ§Œλ“­λ‹ˆλ‹€.




πŸ“– 제이쿼리 AJAX

μš”μ¦˜ λŒ€λΆ€λΆ„μ€ ajax μš”μ²­μ„ λ³΄λ‚Όλ•Œ fetch()λ‚˜ axios 라이브러리λ₯Ό μ‚¬μš©ν•˜μ§€λ§Œ, λͺ‡λͺ‡ 전톡이 μžˆλŠ” 기업에선 λ ˆκ±°μ‹œ ν”„λ‘œμ νŠΈ λ•Œλ¬Έμ— jQuery AJAXλ₯Ό μ‚¬μš©ν•˜κ³€ ν•©λ‹ˆλ‹€.

1. $.ajax()

jQuery의 $.ajax()λ©”μ„œλ“œλŠ” AJAX μš”μ²­μ„ μ‰½κ²Œ λ§Œλ“€ 수 μžˆλ„λ‘ λ„μ™€μ£ΌλŠ” λ©”μ„œλ“œ μž…λ‹ˆλ‹€. GET, POST와 같은 HTTP λ©”μ„œλ“œλ₯Ό μ„€μ •ν•˜κ³ , μš”μ²­μ— ν•„μš”ν•œ 데이터λ₯Ό μ„œλ²„λ‘œ 보내고, 응닡을 λ°›μ•„μ„œ μ²˜λ¦¬ν•˜λŠ” λ°©μ‹μœΌλ‘œ μ‚¬μš©λ©λ‹ˆλ‹€.



2. κΈ°λ³Έ 문법

$.ajax({
	url : "μš”μ²­ν•  URL",
  	method : "GET", //λ˜λŠ” "POST", 기본값은 "GET"
  	data : {key1 : "value1", key2 : "value2"}, // μ„œλ²„λ‘œ 보낼 데이터
    success : function(response){
  		// μš”μ²­μ΄ μ„±κ³΅ν–ˆμ„ λ•Œ 싀행될 μ½”λ“œ
	},
    error : function(xhr, status, error){
    	// μš”μ²­μ΄ μ‹€νŒ¨ν–ˆμ„ λ•Œ 싀행될 μ½”λ“œ
    }
});


3. μ£Όμš” μ˜΅μ…˜

  • url : μš”μ²­ν•  μ„œλ²„μ˜ URL을 μ§€μ •ν•©λ‹ˆλ‹€.
  • method : HTTP μš”μ²­ 방식을 μ„€μ •ν•©λ‹ˆλ‹€."GET", "POST", "PUT", "DELETE" 등을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • data : μ„œλ²„λ‘œ 보낼 데이터λ₯Ό 객체 ν˜•μ‹μœΌλ‘œ μž‘μ„±ν•©λ‹ˆλ‹€.
  • success : μš”μ²­μ΄ μ„±κ³΅ν–ˆμ„ λ•Œ μ‹€ν–‰ν•  콜백 ν•¨μˆ˜μž…λ‹ˆλ‹€.
  • error : μš”μ²­μ΄ μ‹€νŒ¨ν–ˆμ„ λ•Œ μ‹€ν–‰ν•  콜백 ν•¨μˆ˜μž…λ‹ˆλ‹€.
  • dataType : μ„œλ²„μ—μ„œ 받을 응닡 λ°μ΄ν„°μ˜ ν˜•μ‹μ„ μ§€μ •ν•©λ‹ˆλ‹€. "json", "xml", "html", "text" 등이 μžˆμŠ΅λ‹ˆλ‹€.


4. GET μš”μ²­ 예제

μ•„λž˜λŠ” GETμš”μ²­μ„ μ‚¬μš©ν•΄ μ„œλ²„μ—μ„œ 데이터λ₯Ό κ°€μ Έμ˜€λŠ” μ˜ˆμ œμž…λ‹ˆλ‹€.

$.ajax({
	url : "/example/media/request.ajax", // ν΄λΌμ΄μ–ΈνŠΈκ°€ HTTP μš”μ²­μ„ 보낼 μ„œλ²„μ˜ URL μ£Όμ†Œ
  	data : {name : "JJS"}, //  HTTP μš”μ²­κ³Ό ν•¨κ»˜ μ„œλ²„λ‘œ 보낼 데이터
  	method: "GET", // HTTP μš”μ²­ 방식(GET, POST)
  	dataType: "json", // μ„œλ²„μ—μ„œ 보내쀄 λ°μ΄ν„°μ˜ νƒ€μž…
  	success : function(response){
    	console.log("μ„±κ³΅ν•˜μ˜€μŠ΅λ‹ˆλ‹€.",response);
    },
  	error : function(xhr, status, error){
    	console.error("μ‹€νŒ¨ν•˜μ˜€μŠ΅λ‹ˆλ‹€.", status, error);
    }
});


5. POST μš”μ²­ 예제

$.ajax({
	url : 'http://example.com/api/user/1',
  	method : 'POST', // POST μš”μ²­
  	data : {name : 'JJS'}, //λ˜λŠ” data : formData.serialize(), HTTP μš”μ²­κ³Ό ν•¨κ»˜ 보낼 데이터
  	success : function(response){
		console.log('μ„±κ³΅ν•˜μ˜€μŠ΅λ‹ˆλ‹€.');
	},
    error : function(error){
    	console.error('μ‹€νŒ¨ν•˜μ˜€μŠ΅λ‹ˆλ‹€.', error);
    }
});


6. μΆ”κ°€ μ˜΅μ…˜ : beforeSend, complete

  • beforeSend : μš”μ²­μ΄ μ„œλ²„λ‘œ 보내지기 전에 μ‹€ν–‰λ©λ‹ˆλ‹€. 주둜 λ‘œλ”© μ• λ‹ˆλ©”μ΄μ…˜μ„ ν‘œμ‹œν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.
  • complete : μš”μ²­μ΄ μ™„λ£Œλ˜λ©΄ 성곡 여뢀와 상관없이 μ‹€ν–‰λ©λ‹ˆλ‹€. λ‘œλ”© μ• λ‹ˆλ©”μ΄μ…˜μ„ μ’…λ£Œν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.
$.ajax({
	url : "https://api.example.com/data",
  	method : "GET",
  	beforeSend : function(){
    	console.log("Loading...");
    },
  	complete : function(){
    	console.log("Request finished.");
    },
  	success : function(){
    	console.log("Success: ", response);
    },
  	error : function(xhr, status, error){
    	console.error("Error:", status, error);
    },
})
profile
99

0개의 λŒ“κΈ€