웹페이지에서 일부분만 바꾸고 싶다면 어떻게 해야 할까?
그럴 때 우리는 AJAX
를 사용한다.
AJAX
는 Asynchronous JavaScript And XMLHttpRequest의 약자로,JavaScript
, DOM
, Fetch
, XMLHttpRequest
, HTML
등의 다양한 기술을 사용하는 웹 개발 기법이다.AJAX
의 가장 큰 특징은, 웹 페이지에 필요한 부분에 필요한 데이터만 비동기적으로 받아와 화면에 그려낼 수 있다는 것이다.html
에 의해서 유저에게 필요한 페이지가 렌더링 된다.AJAX
가 사용된다.Fetch
를 이용해 서버로부터 새로운 채용 공고를 가져와 화면에 렌더링한다.AJAX
를 사용하여 비동기적으로 데이터를 서버에서 받아와 브라우저에 렌더링하는 것이며, 이러한 기법을 AJAX
라고 한다.AJAX
의 두 가지 핵심 기술은 JavaScript와 DOM
, 그리고 Fetch
이다.<form>
태그를 이용해 서버에 데이터를 전송해야 했으며, 서버는 요청에 대한 응답으로 새로운 웹 페이지를 제공해 주어야 했다.Fetch
를 사용하면, 페이지를 이동하지 않아도 서버로부터 필요한 데이터를 받아올 수 있다.Fetch
는 비동기적인 방식을 사용해 브라우저가 서버와 통신하며 페이지를 계속해서 사용할 수 있게 한다.JavaScript
에서 DOM
을 사용해 조작할 수 있기 때문에 필요한 데이터만 가져와 DOM
에 적용시켜 새로운 페이지로 이동하지 않고 기존 페이지에서 필요한 부분만 변경할 수 있다.Fetch
의 등장 이전에는 표준화된 XHR
을 사용하였다.XHR
은 Cross-Site
이슈 등의 불편함이 있었고,Fetch
는 promise
지원 등의 장점을 가지고 있어 많은 사람들이 Fetch
를 사용하게 되었다.Fetch
는 XHR
의 단점을 보완한 새로운 Web API
이며, XML
보다 가볍고 JavaScript
와 호환되는 JSON
을 사용한다.
아래는 Fetch
와 XHR
의 사용 예제이다.
Fetch
예제// Fetch를 사용
fetch('http://52.78.213.9:3000/messages')
.then (function(response) {
return response.json();
})
.then(function (json) {
...
});
XMLHttpRequest
예제 // XMLHttpRequest를 사용
var xhr = new XMLHttpRequest();
xhr.open('get', 'http://52.78.213.9:3000/messages');
xhr.onreadystatechange = function(){
if(xhr.readyState !== 4) return;
// readyState 4: 완료
if(xhr.status === 200) {
// status 200: 성공
console.log(xhr.responseText); // 서버로부터 온 응답
} else {
console.log('에러: ' + xhr.status); // 요청 도중 에러 발생
}
}
xhr.send(); // 요청 전송
HTML
을 완성하여 보내주지 않아도 웹페이지를 만들 수 있다.AJAX
를 사용했으나, XHR
이 표준화되면서부터 브라우저에 상관없이 AJAX를 사용할 수 있게 되었다.AJAX
를 사용하면 필요한 일부분만 렌더링하기 때문에 빠르고 더 많은 상호작용이 가능한 애플리케이션을 만들 수 있다.HTML
파일을 받아와야 했기 때문에 한 번에 보내야 하는 데이터의 크기가 컸다. 그러나 AJAX
에서는 필요한 데이터를 텍스트 형태(JSON
, XML
등)로 보내면 되기 때문에 비교적 데이터의 크기가 작다.SEO(Search Engine Optimization)에 불리
JAX
방식의 웹 애플리케이션은 처음 받는 HTML
파일에는 데이터를 채우기 위한 틀만 작성되어 있기 때문에 검색 사이트에서 정보를 긁어가기 어렵습니다.뒤로가기 버튼 문제
AJAX
에서는 이전 상태를 기억하지 않기 때문에 뒤로가기 등의 기능을 구현하기 위해서는 별도로 History API
를 사용해야 합니다.웹 개발에서 SSR
(Server Side Rendering)과 CSR
(Client Side Rendering)의 차이점을 아는 것은 매우 중요하다. SSR
과 CSR
의 정의와 차이점에 대해 알아보자.
SSR
은 웹 페이지를 서버에서 렌더링하는 방식이다.URI
로 GET
요청을 보내면, 서버는 해당 웹 페이지 파일을 전송하고, 웹 페이지가 브라우저에서 렌더링된다.Server Side Rendering
이라고 한다.CSR
은 웹 개발에서 사용되는 클라이언트 사이드 렌더링 방식 중 하나로, 클라이언트(웹 브라우저)에서 페이지를 렌더링한다. (SSR
과 반대되는 개념으로 여겨짐)JavaScript
파일을 보낸다.Fetch
와 같은 API
를 사용해 데이터를 가져와서 렌더링한다.SSR
과 CSR
의 주요 차이점은 페이지가 렌더링되는 위치이다.SSR
은 서버에서 페이지를 렌더링하고, CSR
은 브라우저(클라이언트)에서 페이지를 렌더링한다.CSR
은 사용자가 다른 경로를 요청할 때마다 페이지를 새로고침 하지 않고, 동적으로 라우팅을 관리합니다.SSR
은 SEO(Search Engine Optimization)가 우선순위이고,SSR
은 웹 페이지의 초기 구성이 빠르게 이루어져야 하는 경우에 적합하다.CSR
은 SEO가 우선순위가 아니거나, 사이트에 풍부한 상호작용이 있는 경우에 사용된다.CSR
은 빠른 라우팅으로 강력한 사용자 경험을 제공하며,SSR
방식을 도입했다.html
파일에 내용이 똑같이 담긴 상태인 것을 볼 수 있다.SSR
방식을 사용하고 있다.SSR
의 대표적인 단점인 많은 사용자가 클릭할 때마다 전체 웹사이트를 다시 서버에서 받아오기 때문에 발생하는 서버 과부하 이슈가 있음에도 불구하고, CSR
에 비해 초기 로딩 속도가 빠르기 때문에 구독자가 신문기사를 빠르게 읽을 수 있다는 장점이 있다.SSR
을 이용하고 있다.html
파일을 받아와서 렌더링을 한다.html
파일 안에 해당 내용이 그대로 담겨있는 상태이기 때문에 검색엔진 크롤러가 내용을 수집하기 용이하다.CSR
을 사용하고 있다.SSR
과는 달리 CSR
에서는 서버에서 클라이언트에 필요한 데이터만 넘겨주기 때문에 서버 부담이 적다.SPA
를 기반으로 화면의 일부만 변경해주기 때문에 빠른 렌더링으로 사용자 경험을 향상시킬 수 있다.CSR
은 아래의 예시처럼 기존에는 html
이 빈 페이지이기 때문에 검색엔진 최적화에 불리한 특징이 있었다.SSR
을 사용하는 것을 더 권장하고 있다.const express = require("express");
const app = express();
const infoArr = [
"csr과 차이점이 느껴지나요?",
"ssr이란?",
"HTML은 어디서 조작될까요?",
"Server Side Rendering",
"검색엔진 최적화(Search Engine, Optimization)에 상대적으로 유리하다.",
"초기로딩 속도가 빠르다.",
"TTV(Time To View)와 TTI(Time To Interact)의 시간 공백이 있을 수 있다."
];
app.get("/", (req, res) => {
res.send(
"<html><body><h1>" +
infoArr[Math.floor(Math.random() * infoArr.length)] +
"</h1><h1>SSR</h1>" +
"<h2>Server Side Rendering이란 무엇인가?</h2>" +
"</body></html>"
);
});
app.listen(8080);
const express = require("express");
const app = express();
const port = process.env.PORT || 5000;
const infoArr = [
"ssr과 차이점이 느껴지나요?",
"csr이란?",
"SPA를 기반으로",
"화면의 일부만 바꿔주는 것",
"HTML은 어디서 조작될까요?",
"Client Side Rendering",
"AJAX를 통해서 서버로부터 필요한 데이터만 받습니다."
];
app.get(`/`, (req, res) =>
res.send(infoArr[Math.floor(Math.random() * infoArr.length)])
);
app.get(`/csr`, (req, res) =>
res.send(infoArr[Math.floor(Math.random() * infoArr.length)])
);
app.listen(port, () =>
console.log(`Example app listening at http://localhost:${port}`)
);