AJAX에 알아보기 전에 동기와 비동기 통신에 대하여 알아보자.
말 그대로 '동시에 일어난다'는 뜻을 가진 동기식 통신은 클라이언트가 요청(Request)을 보내면 얼마나 시간이 걸리든 해당 요청을 처리하고 응답(Response)를 받으며, 그 동안은 실행부가 대기하는 것이다. 이 말은 요청을 보낸 스레드(Thread)가 응답이 도착하기 전까지는 아무것도 하지 못하는 Block 상태가 되는 것을 의미한다.
그렇다면 동기식 방식에 대한 특징을 한번 알아보자.
최근 많이 사용하는 카카오페이를 통해 알아보자.
위 상황에서 만약 A가 돈을 보냈고, B가 금액 등을 확인하지 않고 데이터를 처리하도록 작업이 실행되면 금액부족 등의 여러가지 되돌릴 수 없는 상황이 발생할 수도 있다. 그렇기 때문에 요청 결과에 대한 응답을 기다려면서 특정 업무에 대한 확정을 짓고 다음 작업을 실행하는 동기식 통신 방식을 사용하는 것이다.
동기식과는 반대로 동시에 수행하지 않는다는 뜻을 가진다. 이 말은 요청을 보내고 응답은 해당 요청이 완료되면 언제든 받아도 상관없다고 보면 되겠다. 즉 해당 요청은 요청에 대한 응답이 가능할때 알아서 완료하고 실행부는 가던 길을 가겠다는 것이다.
자바스크립트(JavaScript)에서는 기본적으로 싱글스레드 방식이며, 이러한 싱글스레드가 비동기 통신이 가능한 이유는 V8엔진 덕분이다. V8 엔진은 크롬(Chrome)과 Node.js에 내장되어 있으며, 자바스크립트가 특정 요청을 만나면 실행부는 흐름에 따라 계속 흘러가며, V8엔진으로 인해 호스팅환경이 해당 요청을 받아 응답을 수행하는 것이다.
위 그림을 보면 중앙의 이벤트루프(Event Loop)가 요청이 들어오면 실행부를 대신해 해당 요청을 처리하다가 좌측 박스의 콜백함수(Callback)를 만나면 요청에 대한 응답 동작을 수행한다. 이러한 이유 때문에 요청을 기다리지 않고 다른 작업을 처리 할 수 있는 Non-Block 상태를 달성한다.
비동기식 통신은 대표적으로 채팅 앱을 예시로 들 수 있다.
이렇듯 요청에 처리에 필요한 시간에 따라 응답 시점을 달라질 수 있는 환경에서 비동기 통신을 많이 사용하며, 순수한 데이터만 Background에서 전달하는 경우에도 비동기를 사용하여 필요한 위치에 데이터를 전달하는 역할을 하기도 한다.
동기식과 비동기식은 위에서 살펴본 바와 같이 명확한 장점 및 단점을 가지고 있다. 요청에 대한 응답결과를 확인해야한다면 동기식을, 요청에 대한 응답결과의 시점이 중요하지 않다면 비동기식을 사용하면 될 것이다.
결론적으로 서비스의 특징을 파악하여 해당 서비스에 적합한 방식을 선정하는 것이 중요하다고 생각된다.
이제 본격적으로 AJAX에 대해서 알아보자.
Asynchronous JavaScript And XML로 웹 애플리케이션 개발에 사용되는 기술 그룹의 일종이다.
AJAX는 프로그래밍 언어는 아니다. 그렇다면 AJAX가 지원하는 기능은 어떤 것들이 있는지 우선은 간략하게 알아보자.
AJAX가 지원하는 기능에 대해서는 이제 대략 알겠다. 근데 왜 AJAX가 필요한 것일까? 이 질문에 대한 대답을 구하기 위해 HTTP에 대한 이야기를 잠시 하겠다.
HTTP의 대전제는 다음과 같다.
"URL 및 부가정보를 통해 사용자가 원하는 페이지를 서버에 요청(Request)한다. 그리고 서버는 해당 요청(Response)에 응답한다."
위에서 설명한 것을 보면 '아~ URL이나 부가정보를 통해서 요청하면 되는구나'라고 생각할 수 있다. 하지만 이 부분에 대해서 곰곰히 생각해보면 사용자는 서버로부터 새로운 정보를 받기 위해서는 반드시 URL 및 부가정보를 통해서만 요청하고 응답을 받을 수 있다. 즉, 새로운 URL을 요청하면 응답은 사용자가 요청한 URL에 대한 페이지를 응답하는 것이다. 이 때문에 HTTP에서는 서버에 요청을 하고 응답을 받을 때 부득이하게 새로고침이 발생하는 것이다.
AJAX는 위에서 설명한 HTTP의 한계를 극복하기 위해서 HTTP를 효과적으로 이용하는 기술이다. AJAX는 통신규약은 아니다. 단지 서버와 효과적으로 소통하기 위한 기술이다. 그렇다면 기존의 HTTP와 AJAX가 어떻게 다른지 그림을 통해 알아보자.
위 그림은 기존의 HTTP 방식에 따라 요청에 대한 응답을 처리하는 과정이다. HTTP를 생성하여 클라이언트에게 응답한 뒤 서버는 클라이언트와의 네트워크 연결을 끊는다. 클라이언트는 응답을 받으면 기존 페이지에서 응답받은 페이지로 이동이 이루어지면서 해당 페이지는 reloading이 발생하는 것이다. 여기서 생각해보자. 그림에서처럼 검색 결과(순수한 데이터)만 가져와서 갱신하는 것과 페이지 자체를 갱신하는 것에 대한 컴퓨터 자원 사용의 차이는 상당할 것이다. 페이지 내에 사진 등이 포함되어 있다면 더욱 심할 것이다.
다음은 AJAX를 통한 요청에 대한 응답처리 과정을 보자.
요청이 전달되면서 XMLHttpRequest라는 요청객체를 통해 웹 서버에서 요청을 받고, 요청에 대한 처리를 실행한다. 응답시에도 동일하게 위의 요청객체를 통해 응답정보를 클라이언트에게 전달하는데 이 때 페이지 전체를 전달하는 것이 아닌 순수 데이터만 전달하며, 순수데이터들을 통해 DOM(DocumentObjectModel)만 수정을 하는 것이다.
두가지 방식에 대해 알면 알수록 차이가 보일 것이고, 기존의 HTTP보다 AJAX를 사용하는 것이 얼마나 편리한지 이해가 될 것이다. 결론적으로 AJAX는 동일한 웹페이지 내에서 페이지의 이동없이 DOM만을 수정하는 것이다.
그럼 다시 한번 AJAX의 기능들을 나열해볼테니 읽어보자.
AJAX는 웹 페이지가 로드된 후 웹서버로부터 데이터를 읽어드리면서 웹 페이지의 일부분(DOM)에만 표시를 할 수도 있으며, 백그라운드 영역에서 클라이언트의 눈에 보이지않게 서버와 통신한다. 이때 서버와 통신이 가능한 데이터 형태는 다음과 같다.
비동기 통신과 AJAX에 대해서 알아보았으니 자바스크립트의 XMLHttpRequest 객체의 사용에 대해서 간단하게 알아보자.
⚡️기본문법
let xhttp = new XMLHttpRequest(); //요청객체 생성
//readyState 속성이 변경 될 때 콜백함수를 정의
xhttp.onreadystatechange = function(){
//콜백함수 발동 조건 지정
if(this.readyState == 4 && this.status == 200){
//응답받은 결과를 출력
console.log(this.responseText);
}
}
xhttp.open("전송방식(get,post)", "URL 또는 부가정보 입력"); //요청준비
xhttp.send(); //이 시점에서 서버로 전송
하나씩 차근차근 알아보자.
더욱 많은 메서드 및 필드들이 있지만 사용해본 부분에 대해서만 설명을 해보았다. 자세한 내용은 아래 링크를 참고하자.
기본적인 사용외에 jQuery를 이용한 방법도 한번 알아보자.
⚡️jQuery 사용
//비동기 AJAX 요청 수행 메서드
$.ajax({
type : "전송방식명(GET/POST)",
url : "URL 주소",
//응답, 상태, XMLHttpRequest객체를 파라미터로 받음
success:function(result, status, xhr){
//응답 결과 출력
console.log(result);
}
});
jQuery는 기본문법을 줄여놓은 형태로 JSON형태로 요청 수행 메서드를 선언하면 된다. success는 해당 요청이 처리된 경우 응답을 하는 함수로 콜백함수를 지정하여 요청에 대한 결과값을 획득했을때 수행할 로직을 구성하면된다.
⚡️응답결과 JSON으로 변환
$.ajax({
type : "전송방식명(GET/POST)",
url : "URL 주소",
//응답, 상태, XMLHttpRequest객체를 파라미터로 받음
success:function(result, status, xhr){
//응답 결과 변환
let json = JSON.parse(result);
console.log(json);
}
});
위와 같이 요청에 대한 결과(result)를 JSON 내장객체를 이용해 parsing 해준다면 json객체를 반환받을 수 있다. 이것으로 웹 페이지의 일부분(DOM)에 출력할 데이터로 사용할 수 있다.
이것으로 비동기 통신과 HTTP의 한계를 보완한 기능인 AJAX에 대해서 알아보았다.
AJAX의 자세한 사용 예제(직원 리스트 출력)에 대해서 궁금하다면 아래 링크를 방문해주기를 바란다.
https://inpa.tistory.com/entry/JS-%F0%9F%93%9A-Ajax-%EA%B8%B0%EC%B4%88-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC
https://99geo.tistory.com/65
https://www.w3schools.com/jquery/ajax_ajax.asp