-
๋ธ๋ผ์ฐ์ ์ ์๋ ์๋ฆฌ(๋ณด์ด๋ ๊ณณ) - AJAX, SSR๊ณผ CSRcodeStates front-end/node(server) 2023. 1. 30. 19:35๋ฐ์ํ
๐ ๋ธ๋ผ์ฐ์ ์ ์๋ ์๋ฆฌ(๋ณด์ด๋ ๊ณณ)
๐ AJAX(Asynchronous JavaScript And XMLHttpRequest)
๋น๋๊ธฐ์ ์๋ฐ์คํฌ๋ฆฝํธ์ XML
์น ํ์ด์ง์ ํ์ํ ๋ถ๋ถ์ ํ์ํ ๋ฐ์ดํฐ๋ง ๋น๋๊ธฐ์ ์ผ๋ก ๋ฐ์์ ํ๋ฉด์ ๊ทธ๋ ค๋ผ ์ ์๋ ๊ธฐ๋ฒ
๋ณดํต ์นํ์ด์ง๋ ๋ฌธ์ ๊ฐ์ฒด๋ผ๋ ๊ฒ์ผ๋ก ๊ตฌ์ฑ -> HTML
<HTML> <HEAD> <TITLE>ํํ ํฌ ํฐ์คํ ๋ฆฌ</TITLE> </HEAD> <BODY> <P>์ฌ๊ธฐ๋ ํํ ํฌ ํฐ์คํ ๋ฆฌ ๊ณต๊ฐ์ ๋๋ค</P> <IMG SRC="hwan.jpg"></IMG> </BODY> </HTML>
์ค์ ๋ธ๋ผ์ฐ์ ์ ์ฒ๋ฆฌ ๊ณผ์ (๋ฌธ์ ๊ฐ์ฒด ๋ชจ๋ธ)
html -> head -> title -> text:"ํํ ํฌ ํฐ์คํ ๋ฆฌ" -> body -> text:"์ฌ๊ธฐ๋ ํํ ํฌ ํฐ์คํ ๋ฆฌ ๊ณต๊ฐ์ ๋๋ค" -> img -> src="hwan.jpg"
์ด๋ฏธ์ง๋ฅผ ๋ฐ๊พธ๋ ค๋ฉด ์ด๋ฏธ์ง๋ง ๋ถํดํ์ฌ ์กฐ์ ๊ฐ๋ฅํ์ง๋ง ์นํ์ด์ง์ ์๋ก ๋ณด์ฌ์ค์ผ ํ๋ ๋ด์ฉ์ด ์๋ฒ์์ ์์ผ ํ ๊ฒฝ์ฐ,
์๋ฒ์ ๊ทธ ๋ด์ฉ์ ์์ฒญํด๋๊ณ ๋ค๋ฅธ ์์ ์ ํ๋ค. ์ํ๋ ๋ด์ฉ์ด ๋์ฐฉํ๋ฉด ๊ทธ ๋ ์ ๋ฐ์ดํธํ๋ค
์ถ์ฒ : https://sungmooncho.com/2012/12/04/gmail-and-ajax/ ์ดํด๋ฅผ ๋๊ธฐ ์ํด ๋ ๋ค๋ฅธ ์๋ฅผ ๋ค์ด๋ณด๊ฒ ๋ค. ์ํฌ๋ฅผ ์ฃผ๋ฌธํด๋๊ณ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด๋ณด์. ํ ํ๊ฐ๊ฐ ํ์ค์์ ๊ทธ๋ฆผ์ ๊ทธ๋ฆฌ๊ณ ์๋ค๊ณ ํ์. ๋ ธ๋์ ๋ฌผ๊ฐ์ด ๋จ์ด์ก๋ค. ์ ํ๋ก ๋ ธ๋์ ๋ฌผ๊ฐ์ ์ถ๊ฐ ์ฃผ๋ฌธํ๋ค. ์ด ๊ฒฝ์ฐ, ํ๊ฐ๋ ๋ ๊ฐ์ง ์ ํ์ ํ ์ ์๋ค. ํ๋๋ ๋ฌผ๊ฐ์ด ์ฌ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ด๋ค. ์ด๊ฒ์ด ๋ฐ๋ก “๋๊ธฐ(Synchronous)” ๋ฐฉ์์ด๋ค. ๋ ํ๊ฐ์ง๋, ๋ ธ๋์ ๋ฌผ๊ฐ์ด ํ์ํ ์ผ์ ๊ทธ๋๋ก ๋๊ณ ๊ฐ์ง ๋ฌผ๊ฐ์ผ๋ก ๊ทธ๋ฆผ์ ๋ค๋ฅธ ๋ถ๋ถ์ ๊ทธ๋ฆฌ๋ค๊ฐ, ์ํฌ๊ฐ ๋์ฐฉํ๋ฉด ๊ทธ ๋ ๋ ธ๋ ๋ฌผ๊ฐ์ผ๋ก ํ์ํ ์์ ์ ํ๋ ๊ฒ์ด๋ค. ์ด๊ฒ์ด “๋น๋๊ธฐ(Asynchronous)” ๋ฐฉ์์ด๋ค. Ajax์์ A์ ์ฝ์๊ฐ ๋ฐ๋ก Aynchronous(๋น๋๊ธฐ ๋ฐฉ์)๋ฅผ ์๋ฏธํ๋ค.
ํ์ด์ง ์ ์ฒด๋ฅผ ์๋ก ๋ก๋ํ๋ ๊ฒ์ด ๋๊ธฐ ๋ฐฉ์์ด๋ค
๊ทธ๋ฌ๋ ํ์ด์ง ์ ์ฒด๋ฅผ ์๋ก ๋ก๋ํ์ง ์ผ๋ถ ์์ ๋ง ๋ก๋ํ๋ ๊ฒ์ด ๋น๋๊ธฐ ๋ฐฉ์์ด๋ค
Ajax ์ฌ์ฉ๋ฐฉ๋ฒ
Ajax๋ ๋ฐ์ ๋ฐฉ๋ฒ๋ค๋ก ๊ตฌํ ํ ์ ์๋ค
- jQuery Ajax
- axios ์ค์น
- fetch()
๋ฆฌ์กํธ ๊ฐ๋ฐํ๊ฒฝ์์๋ axios ํน์ fetch()๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ค
Fetch ์์
// Fetch๋ฅผ ์ฌ์ฉ fetch('http://52.78.213.9:3000/messages') .then (function(response) { return response.json(); }) .then(function (json) { ... });
๐ SSR vs CSR
SSR(Server Side Rendering)
์น ํ์ด์ง๋ฅผ ๋ธ๋ผ์ฐ์ ์์ ๋ ๋๋งํ์ง ์๊ณ ์๋ฒ์์ ๋ ๋๋ง
- ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ์ url๋ก get ์์ฒญ
- ์๋ฒ๋ ์ ํด์ง ์น ํ์ด์ง ํ์ผ์ ๋ธ๋ผ์ฐ์ ๋ก ์ ์ก
- ์๋ฒ์ ์น ํ์ด์ง๊ฐ ๋ธ๋ผ์ฐ์ ์ ๋์ฐฉํ๋ฉด ๋ ๋๋ง
์น ํ์ด์ง์ ๋ด์ฉ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๊ฐ ํ์ํ ๊ฒฝ์ฐ,
์๋ฒ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์จ ๋ค์, ์น ํ์ด์ง๋ฅผ ์์ ํ ๋ ๋๋ง ๋ ํ์ด์ง๋ก ๋ณํํ ํ์
๋ธ๋ผ์ฐ์ ์ ์๋ต์ผ๋ก ๋ณด๋ธ๋ค. ์น ํ์ด์ง๋ฅผ ์ดํด๋ณด๋ ์ฌ์ฉ์๊ฐ, ๋ธ๋ผ์ฐ์ ์ ๋ค๋ฅธ ๊ฒฝ๋ก๋ก ์ด๋ํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
๋ธ๋ผ์ฐ์ ๊ฐ ๋ค๋ฅธ ๊ฒฝ๋ก๋ก ์ด๋ํ ๋๋ง๋ค ์๋ฒ๋ ๊ฐ์ ์์ ์ ๋ค์ ์ํ
CSR(Client Side Rendering)
CSR์ ํด๋ผ์ด์ธํธ์์ ํ์ด์ง๋ฅผ ๋ ๋๋ง
- ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ )์ ์์ฒญ์ ์๋ฒ๋ก ๋ณด๋ด๋ฉด
- ์๋ฒ๋ ์น ํ์ด์ง ๊ณจ๊ฒฉ์ด ๋ ๋จ์ผ ํ์ด์ง(jsํ์ผ๊ณผ ํจ๊ป)๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ๋ณด๋
- ํด๋ผ์ด์ธํธ๋ ์ ๋ฌ๋ jsํ์ผ ์นํ์ด์ง ์์ ํ ๋ ๋๋ง ๋ ํ์ด์ง๋ก ๋ฐ๊พผ๋ค
์น ํ์ด์ง์ ํ์ํ ๋ด์ฉ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ๋ฐ์ดํฐ์ธ ๊ฒฝ์ฐ์๋ ๋ธ๋ผ์ฐ์ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋
๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ์น ํ์ด์ง์ ๋ ๋๋ง์ ํด์ผ ํ๋๋ฐ ์ด๊ณณ์ API๊ฐ ์ฌ์ฉ๋๋ค.
์น ํ์ด์ง๋ฅผ ๋ ๋๋งํ๋ ๋ฐ์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ API ์์ฒญ์ผ๋ก ํด์ํ๊ณ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ค๋ฅธ ๊ฒฝ๋ก๋ก ์ด๋ํ๋ฉด
CSR์์๋ SSR๊ณผ ๋ค๋ฅด๊ฒ, ์๋ฒ๊ฐ ์น ํ์ด์ง์ ํ์ผ์ ์ ๊ณตํ๊ณ
๋ธ๋ผ์ฐ์ ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์์ฒญํ ๊ฒฝ๋ก์ ๋ฐ๋ผ ํ์ด์ง๋ฅผ ๋ค์ ๋ ๋๋งํ๋ค
SSR ์ฌ์ฉ
- SEO(Search Engine Optimization) ๊ฐ ์ฐ์ ์์์ธ ๊ฒฝ์ฐ, ์ผ๋ฐ์ ์ผ๋ก SSR(Server Side Rendering) ์ ์ฌ์ฉ
- ์น ํ์ด์ง์ ์ฒซ ํ๋ฉด ๋ ๋๋ง์ด ๋น ๋ฅด๊ฒ ํ์ํ ๊ฒฝ์ฐ, ๋จ์ผ ํ์ผ์ ์ฉ๋์ด ์์ SSR ์ด ์ ํฉ
- ์น ํ์ด์ง๊ฐ ์ฌ์ฉ์์ ์ํธ์์ฉ์ด ์ ์ ๊ฒฝ์ฐ, SSR ์ ํ์ฉํ ์ ์๋ค.
CSR ์ฌ์ฉ
- SEO ๊ฐ ์ฐ์ ์์๊ฐ ์๋ ๊ฒฝ์ฐ, CSR์ ์ด์ฉํ ์ ์๋ค.
- ์ฌ์ดํธ์ ํ๋ถํ ์ํธ ์์ฉ์ด ์๋ ๊ฒฝ์ฐ, CSR ์ ๋น ๋ฅธ ๋ผ์ฐํ ์ผ๋ก ๊ฐ๋ ฅํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณต
- ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ํ๋ ๊ฒฝ์ฐ, CSR์ ์ด์ฉํด ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ(๋น ๋ฅธ ๋์ ๋ ๋๋ง ๋ฑ)์ ์ ๊ณตํ ์ ์๋ค.
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}`) );
๋ฐ์ํ'codeStates front-end > node(server)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Mini-Node Server (0) 2023.02.08 CORS ๊ฐ์ (0) 2023.02.06 REST API - ๋๋ง์ ์ธ์ด๋ก ๋ธ๋ก๊น ํด๋ณด๊ธฐ (0) 2023.01.31 ๋ธ๋ผ์ฐ์ ์ ์๋ ์๋ฆฌ(๋ณด์ด์ง ์๋ ๊ณณ) - URL/URI, IP, port, domain, DNS (0) 2023.01.30 HTTP/๋คํธ์ํฌ ๊ธฐ์ด (0) 2023.01.30