웹 애플리케이션 개발에서 클라이언트와 서버 간의 데이터 통신 방식은 매우 중요한 요소이다.
특히 AJAX와 WebSocket은 웹 애플리케이션에서 데이터를 주고받는 대표적인 기술로, 각각의 특징과 사용 방식이 다르다. 각각의 정의와 사용방식에 대해 알아보겠다.
AJAX(Asynchronous JavaScript and XML)
자바스크립트를 사용하여 브라우저가 서버에게 비동기 방식으로 데이터를 요청하고, 서버가 응답한 데이터를 수신하여 웹페이지를 새로고침 없이 동적으로 갱신하는 프로그래밍 방식
기본적으로 XMLHttpRequest 객체 또는 fetch API를 사용하여 서버에 요청(Request)을 보내고 응답(Response)을 받는 방식으로 동작한다.
이전의 웹페이지는 완전한 HTML 코드를 서버로부터 전송받아 웹페이지 전체를 렌더링하는 방식으로 동작했다.
따라서 화면이 전환되면, 서버로부터 새로운 HTML을 전송 받아 웹페이지 전체를 처음부터 다시 렌더링(MPA)했다.
이는 아래와 같은 이유로 성능 면에서 불리했다.
이와 같은 배경에서 AJAX의 등장으로 더이상 웹페이지에서 변경할 필요가 없는 부분을 다시 렌더링하지 않아도 됐고, 서버로부터 필요한 데이터만 전송받아 변경해야 하는 부분만 한정적으로 렌더링하는 방식이 가능하게 됐다.
결론적으로, AJAX 웹 브라우저에서 빠른 성능과 부드러운 화면 전환이 가능해졌다.
GET, POST, PUT, DELETE)을 통해 서버와 데이터를 주고받을 수 있음.fetch("https://api.example.com/data")
.then((response) => response.json()) // JSON 형식으로 변환
.then((data) => console.log(data))
.catch((error) => console.error("Error:", error));
WebSocket
클라이언트와 서버 간의 양방향, 실시간 통신을 지원하는 프로토콜
기존의 HTTP 기반 요청-응답 방식과 달리, 한 번 연결이 설정되면 추가 요청 없이 서버와 클라이언트가 데이터를 주고받을 수 있다.
const socket = new WebSocket("wss://example.com/socket");
// 연결 성공 이벤트
socket.onopen = () => {
console.log("WebSocket 연결 성공!");
socket.send("클라이언트에서 서버로 메시지 전송");
};
// 서버로부터 메시지를 받았을 때 실행
socket.onmessage = (event) => {
console.log("서버로부터 메시지:", event.data);
};
// 연결 종료 이벤트
socket.onclose = () => {
console.log("WebSocket 연결 종료");
};
// 오류 발생 이벤트
socket.onerror = (error) => {
console.log("WebSocket 오류 발생:", error);
};
| 비교 항목 | AJAX (XHR, fetch API) | WebSocket |
|---|---|---|
| 데이터 전송 방식 | 요청(Request)에 대한 응답(Response) 방식 | 양방향 실시간 통신 |
| 연결 유지 | 요청이 있을 때마다 새로운 HTTP 연결 생성 | 한 번 연결 후 지속적인 연결 유지 |
| 사용 프로토콜 | HTTP(S) | WebSocket (ws://, wss://) |
| 실시간 데이터 전송 | 지원하지 않음 (Polling 필요) | 실시간 데이터 Push 가능 |
| 오버헤드 | HTTP 요청 헤더 포함 (비효율적) | 한 번 연결 후 지속 사용 (낮은 오버헤드) |
| 주요 활용 사례 | REST API, 일반적인 CRUD 작업 | 채팅, 실시간 주식 데이터, 라이브 스트리밍 |
대부분의 웹 애플리케이션에서는 AJAX와 WebSocket을 함께 사용하여 최적의 성능을 구현한다.
fetch API 또는 axios로 초기 데이터를 불러온다.// 초기 데이터는 AJAX로 가져옴
fetch("/api/messages")
.then((res) => res.json())
.then((messages) => {
console.log("초기 메시지 로드:", messages);
});
// 이후 실시간 데이터는 WebSocket으로 처리
const socket = new WebSocket("wss://example.com/socket");
socket.onmessage = (event) => {
console.log("실시간 메시지 수신:", event.data);
};
👉 AJAX는 CRUD 요청과 일반 API 요청에 적합하며,
👉 WebSocket은 실시간 채팅, 라이브 데이터 스트리밍 같은 경우에 적합하다.