Ajax(Asynchronous JavaScript and XML)

✒️ 2025-05-23 14:49 내용 수정


참고 자료 : TCPSchool ajax intro, TCPSchool ajax server response, TCPSchool ajax header response

Javascript를 이용한 백그라운드 비동기 통신


장단점

  1. 장점

    • 웹 페이지 전체를 다시 로딩하지 않아도 웹 페이지 일부분만을 갱신할 수 있도록 해준다.
    • 웹 페이지가 로드된 후에 서버로 데이터를 주고 받을 수 있다.
    • 백그라운드 영역에서 서버로 데이터를 보낼 수 있다.
  2. 단점

    • Ajax는 클라이언트가 서버에 데이터를 요청하는 클라이언트 풀링 방식을 사용하기 때문에 서버 푸시 방식의 실시간 서비스는 만들 수 없다.
      • 클라이언트 풀링 : 사용자가 직접 원하는 정보를 서버에게 요청하여 얻는 방식
      • 서버 푸시 : 사용자가 요청하지 않아도 서버가 알아서 자동으로 특정 정보를 제공하는 방식
    • 바이너리 데이터를 보내거나 받을 수 없다.
    • Ajax 스크립트가 포함되지 않은 서버로 Ajax 요청을 보낼 수 없다.
    • 클라이언트의 PC로 Ajax 요청을 보낼 수 없다.

동작 원리

구성 요소 역할
HTML, CSS 웹 페이지의 표현
HTML, CSS(Cascading Style Sheet)
DOM 모델 데이터를 접근하거나 화면 구성을 동적으로 조작
문서 객체 모델(Document Object Model)
JSON, XML 데이터 교환
JSON(JavaScript Object Notation)
XMLHttpRequest 객체 웹 서버와의 비동기식 통신
JavaScript 모든 기술들을 결합하여 사용자의 작업 흐름을 제어
JavaScript

ajax 1.png

ajax 2.png


XMLHttpRequest 객체

var xhr = null;

function createRequest() {
	if (xhr != null) {
		return;
	}
	if (window.ActiveXObject) {
		xhr = new ActiveXObject("Microsoft.XMLHTTP");
	} else {
		xhr = new XMLHttpRequest();
	}
}

서버 요청 메소드

메소드 설명
open(전달방식, URL주소, 비동기화여부) 서버로 보낼 Ajax 요청의 형식 설정
전달 방식 : "GET", "POST"
비동기화 여부는 true면 비동기화, false면 동기화
send() Ajax 요청을 서버로 전달(전달 방식이 GET일 때)
send("문자열") Ajax 요청을 서버로 전달(전달 방식이 POST일 때)
  1. GET : 주소에 데이터를 추가하여 전달

    • 브라우저에 HTTP 요청이 캐시되어 저장됨
    • query string에 데이터를 포함시켜 전송하기 때문에 길이 제한이 있음
    • 보안상 취약점이 존재하여 주의해야 한다.
  2. POST : 데이터를 별도로 첨부하여 전달

    • 브라우저에 HTTP 요청이 캐시되지 않으며, 브라우저 히스토리에도 남지 않음
    • query string와 별도로 HTTP 요청 데이터를 전송하므로 길이 제한이 없음
    • GET보다 보안성이 높음
    • POST로 전송 시 request에 MIME type을 설정해야 하므로 html의 form의 기본 Context-Type인 application/x-www-form-urlencoded 형태(key=value&key=value)를 지정해야 함
      • setRequestHeader("Content-Type", "application/x-www-form-urlencoded") 설정 필요
      • Content-Type 헤더의 기본 값은 "text/html"로 설정되어 있어 사용하려는 파일 형태에 따라 변경할 필요가 있다.
      • 참고 자료 :
// 전송 메소드는 커스텀하여 만들 수 있음
// custom 가능
// url : 목적지
// param : 파라미터
// callback : 처리 후 돌아올 위치
// method : 전송방식(GET, POST)
function sendRequest(url, param, callback, method) {

	// HttpRequest 생성
	createRequest();

	// 전송 타입 구분
	// method 전달 시 대소문자을 섞어 쓰지 않도록 주의
	var httpMethod = (method != 'POST' && method != 'post') ? 'GET' : 'POST';

	// 파라미터 구분
	// 비어있는지 확인
	var httpParam = (param == null || param == '') ? null : param;

	// 접근 url
	var httpURL = url;

	// 요청 방식이 GET이고 전달할 파라미터가 있다면 새 url 경로 제작
	// query string에 param을 넣어 전달
	if (httpMethod == 'GET' && httpParam != null) {
		httpURL = httpURL+'?'+httParam;
	}

	// 서버로 보낼 Ajax 요청 형식
	xhr.open(httpMethod, httpURL, true);

	xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

	// 작업이 완료된 후 호출할 callback 메소드 지정
	xhr.onreadystatechange=callback;

	// Ajax 요청을 서버로 전달
	// GET이면 send(), POST면 send("문자열")
	xhr.send(httpMethod == 'POST' ? httpParam : null);
}

서버 응답 확인

  1. readyState : XMLHttpRequest 객체의 현재 상태를 나타냄
상태 설명
UNSENT (0) XMLHttpRequest 객체가 생성됨
OPENED (1) opne() 메소드가 성공적으로 실행됨
HEADERS_RECEIVED (2) 모든 요청에 대한 응답 도착
LOADING (3) 요청한 데이터 처리중
DONE (4) 요청한 데이터의 처리가 완료되어 응답할 준비가 됨
  1. status : 서버의 문서 상태를 나타냄
상태 설명
200 서버에 문서가 존재함
404 서버에 문서가 존재하지 않음
  1. onreadystatechange : XMLHttpRequest 객체의 readyState property의 값이 변할 때마다 자동으로 호출될 함수를 설정
    • 원하는 함수를 작성하여 XMLHttpRequest.onreadystatechange = 함수로 설정 가능
    • 서버에서 응답이 도착할 때까지 readyState property의 값에 따라 여러 번 호출될 수 있다.
  2. onload : 로드가 완료되면 자동으로 호출할 함수를 설정
// xhr = new XMLHttpRequest()
function resultFn() {
	if (xhr.readyState == 4 && xhr.status == 200) { // Done, 서버에 문서가 존재함
		// 도착한 데이터를 읽어오기
		var data = xhr.responseText;
	}
}