
์ต๊ทผ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ ๋๋ง(CSR)๊ณผ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง(SSR)์ ๋ํด ๊ณ ๋ฏผํ๊ณ ํ์ตํ๋ ๊ณผ์ ์ ์์ฑํ๋ ค ํฉ๋๋ค.
ํญ์ ๋ฆฌ์กํธ๋ ๋ทฐ๋ก๋ง js๋ฅผ ์ฌ์ฉํด๋ดค์ง, ํ ํ๋ฆฟ ์์ง์ ์ฌ์ฉํ ๋ฐ๋๋ผ js๋ก์ ์น ํ์ด์ง ๊ตฌํ์ ์ฒ์์ด๋ผ ๋ง์ด ๋ฏ์ค๊ธฐ๋ ํ๊ณ , ์ด๋ ต๊ธฐ๋ ํ ๊ฒ ๊ฐ์ต๋๋ค.
๋จผ์ ์ฒ์์๋ CSR๊ณผ SSR์ ์ฐจ์ด๋ฅผ โํ์ด์ง๊ฐ ๊น๋ฐ์ด๋์งโ ์ฌ๋ถ๋ก ๋จ์ํ๊ฒ ์๊ฐํ์์ต๋๋ค.
ํ์ง๋ง ์ค์ ๋ก๋ ํจ์ฌ ๋ ๊น๊ณ ๋ณต์กํ ๊ฐ๋ ๋ค์ด ์กด์ฌํ๋ค๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค.
๊ทธ๋์ ์ด๋ฒ ๊ธ์์๋ ์ ๊ฐ ์ง์ ์์ฑํ ์ฝ๋์์ ๊ณ ๋ฏผํ๋ ๋ถ๋ถ์ CSR๊ณผ SSR์ ์ฐจ์ด์ ์ ์ค์ฌ์ผ๋ก ์ ๋ฆฌํด๋ณด์์ต๋๋ค.
(์ด๋ฐ ์์ผ๋ก ๊ธ์ ์จ๋ณธ ์ ์ด ์์๋๋ฐ, ์์ผ๋ก๋ ์ ๊ฐ ํ๋ ๊ณ ๋ฏผ๋ค์ ์ด๋ ๊ฒ ๋งค๊ฑฐ์ง ํ์(?)์ผ๋ก ํฌ์คํ ํด๋ณด๋ ค๊ณ ํฉ๋๋ค.ใ ใ )
์ด๋ฒ์ ๊น๊ฒ ๊ณ ๋ฏผํด๋ณด๊ธฐ ์ ๊น์ง๋ง ํด๋ CSR๊ณผ SSR์ ๋ํด ์์ฃผ ๊ฐ๋จํ๊ฒ ์ดํดํ๊ณ ์์์ต๋๋ค.
(์ฌ์ค ๋ฒจ๋ก๊ทธ์ CSR๊ณผ SSR์ ๋ํด์๋ ์ ๋ฆฌํด๋ ์ ์ด ์์๊ณ , ๊ณต๋ถํด๋ณธ ์ ์ด ์์๊ธฐ์ ๋ค ์๊ณ ์๋ค๊ณ ์๊ฐํ์ต๋๋คโฆ)
๋ฌผ๋ก ๋ ๋๋ง์ ํด์ฃผ๋ ์ฃผ์ฒด๊ฐ ํด๋ผ์ด์ธํธ/์๋ฒ๋ก ๊ฐ๊ฐ ๋ค๋ฅด๋ค๋ ๊ฒ์ ์๊ณ ์์์ง๋ง, ๊ฐ์ฅ ํฐ ํน์ง์ด ์๊ธฐ์ ์๋์ ๊ฐ์ด ์๊ฐํ๊ณ ์์์ต๋๋ค.
์ด๋ ๊ฒ ์๋ก๊ณ ์นจ(๊น๋ฐ์) ์ ๋ฌด๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ ๋๋ง ๋ฐฉ์์ ํ๋จํ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ ์น์ฌ์ดํธ์์ ์นด๋๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ญ์ ํ ๋ ํ์ด์ง๊ฐ ๊น๋ฐ์ด๋ฉด "์, ์ด๊ฑด SSR์ด๊ตฌ๋"๋ผ๊ณ ๋จ์ํ ํ๋จํ์ต๋๋ค.
์ ๊ฐ ๊ตฌํํ ์นด๋๋ฅผ ์ถ๊ฐํ๋ ๊ธฐ๋ฅ์ ์๋ก ๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
์๋๋ ํด๋ผ์ด์ธํธ์์ ์นด๋๋ฅผ ์ถ๊ฐํ๋ ๋ฒํผ์ ํด๋ฆญ ํ์ ๋์ ์ฝ๋์ ๋๋ค.
const addButtons = document.querySelectorAll('.add-todo');
addButtons.forEach(button => {
const columnId = button.getAttribute('data-column-id');
const cardContainer = button.closest('.column').querySelector('.column-card-container');
button.addEventListener('click', function() {
loadAppendCardTemplate(cardContainer, columnId);
});
});
์ด ์ฝ๋๋ .add-todo ํด๋์ค๋ฅผ ๊ฐ์ง ๋ชจ๋ ๋ฒํผ์ ํด๋ฆญ ์ด๋ฒคํธ๋ฅผ ์ถ๊ฐํฉ๋๋ค.
๊ฐ ๋ฒํผ์ ํด๋ฆญํ ๋๋ง๋ค loadAppendCardTemplate ํจ์๋ฅผ ํธ์ถํ์ฌ ์๋ก์ด ์นด๋ ํ
ํ๋ฆฟ(mustache ์ฌ์ฉ)์ ๋ถ๋ฌ์ ํด๋น ์์น์ ์ถ๊ฐํฉ๋๋ค.
๋ง์ฝ ์๋ก์ด ์นด๋ ํ
ํ๋ฆฟ์์ ์นด๋ ์ถ๊ฐ๋ฅผ ์๋ฃํ๋ ๋ฒํผ์ ๋๋ฅด๋ฉด, ์นด๋๋ฅผ ์๋ฒ์ ์ถ๊ฐํ๋ API๋ฅผ ํธ์ถํ๊ณ ,
์ถ๊ฐ๊ฐ ์๋ฃ๋๋ฉด ํด๋ผ์ด์ธํธ๋ ํ์ด์ง๋ฅผ ์๋ก๊ณ ์นจํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ์ต๋๋ค.
(๋ง์ฝ ์๋ก๊ณ ์นจ์ ํ์ง ์์ผ๋ฉด, api ํธ์ถ์ ํตํด db์ ์ถ๊ฐ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค์ง ์๊ธฐ์ ์๋ก๊ณ ์นจ ํ๋ ์์ ์ ์ถ๊ฐํด์ฃผ์์ต๋๋ค.)
// ์นด๋๋ฅผ ์ถ๊ฐํ๋ API ํธ์ถ
fetch('/api/addCard', {
method: 'POST',
body: JSON.stringify(cardData),
headers: {
'Content-Type': 'application/json'
}
})
.then(response => response.json())
.then(data => {
if (data.success) {
location.reload(); // ํ์ด์ง ์๋ก๊ณ ์นจ
}
})
.catch(error => console.error('Error:', error));
๊ทธ๋์ ์ด ์ฝ๋์์ ์นด๋๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์ถ๊ฐ๋๋ฉด location.reload()๋ก ํ์ด์ง๋ฅผ ์๋ก๊ณ ์นจํ์ฌ ์ ์ฒด UI๋ฅผ ์
๋ฐ์ดํธํด์ค๋๋ค.
์๋ก๊ณ ์นจ์ด ๋ฐ์ํ๋ฉด์ ํ์ด์ง๊ฐ ๊น๋ฐ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ฅ ์ฒ์์๋, ์ ๋ ์ด ๋ฐฉ์์ด SSR์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค.
์๋ก๊ณ ์นจ์ ํ์ง ์์ผ๋ฉด ๋ฐ์ดํฐ๊ฐ ๋ฐ์๋์ง ์๊ธฐ ๋๋ฌธ์, ๊ทธ๋ฌ๋๊น ์๋ก๊ณ ์นจ์ ๊ผญ ํด์ค์ผ ํ๊ธฐ ๋๋ฌธ์ SSR์ด๋ผ๊ณ ํ๋จํ๋ ๊ฒ์ ๋๋ค.
ํ์ง๋ง SSR์ ๋ํด ๋ ๊น์ด ๊ณต๋ถํ๋ฉด์ ์ ๊ฐ ์๋ชป ์ดํดํ๊ณ ์์๋ค๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค.
SSR์ ์๋ฒ์์ ์์ ํ ๋ ๋๋ง๋ HTML์ ์์ฑํ์ฌ ํด๋ผ์ด์ธํธ๋ก ๋ณด๋ด๋ ๋ฐฉ์์ ์๋ฏธํฉ๋๋ค.
์ด๊ฒ ๊ธฐ๋ณธ ์ ์์ธ๋ฐ, ์ ๋ โํ์ด์ง ๊น๋ฐ๊ฑฐ๋ฆผโ์๋ง ์ง์คํ์ฌ ๋ณธ์ง์ ์ธ ์ ์๋ฅผ ์๊ณ ์์๋ ๊ฒ์ด์์ต๋๋ค.
๊ฒฐ๊ตญ SSR์, ์๋ฒ์์ ์ด๋ฏธ ๋ชจ๋ HTML์ ๊ตฌ์ฑํ ํ, ๊ทธ ์์ฑ๋ HTML์ ํด๋ผ์ด์ธํธ๋ก ์ ์กํ๋ ๊ฒ์ ๋๋ค.
ํด๋ผ์ด์ธํธ์์๋ ์๋ฒ์์ ๋ฐ์ HTML์ ์ด๋ ํ ์์ ๋ ์์ด ๊ทธ๋๋ก ๋ธ๋ผ์ฐ์ ์ ๋ ๋๋งํด์ผ SSR์ ๋๋ค.
๊ทธ๋์ ๊ฒฐ๋ก ์ ์ผ๋ก ์ ๊ฐ ์ง ์ฝ๋๋ SSR์ ์๋๊ฒ ๋ค๋ ํ๋จ์ ํ๊ฒ ๋์์ต๋๋ค.
์์์ SSR์ ์๋๊ฒ ๋ค๋ ํ๋จ์ ํ ๋ค, ๊ทธ๋ผ CSR์ธ๊ฐ? ํ๋ ์๋ฌธ์ ๊ฐ๊ฒ ๋์์ต๋๋ค.
์ ์ฝ๋์์ ์ฌ์ฉํ ๋ฐฉ์์ ๊ฐ์ฅ ๋จผ์ ํด๋ผ์ด์ธํธ์์ main.html์ ๋ก๋ํ๊ณ ,
์ ์ ์ ์์ ์ ๋ฐ๋ผ Mustache ํ์ผ์ ํด๋ผ์ด์ธํธ์์ ์ง์ ๋ ๋๋งํ๋ ๋ฐฉ์์ด์์ต๋๋ค.
์นด๋ ์ถ๊ฐ ๋ฒํผ์ ๋๋ฅด๋ฉด ์นด๋ ์ถ๊ฐ ํ
ํ๋ฆฟ์ ๋ ๋๋งํ๊ณ , ์ถ๊ฐ ํ์ธ ๋ฒํผ์ ๋๋ฅด๋ฉด ์๋ฒ๋ก POST ์์ฒญ์ ๋ณด๋ธ ํ ์ฑ๊ณต ์ ๋ฐ์ดํฐ๋ฅผ ์ค์๊ฐ์ผ๋ก ๋ฐ์ํ๊ธฐ ์ํด location.reload()๋ฅผ ํตํด ํ์ด์ง๋ฅผ ์๋ก๊ณ ์นจํ์ต๋๋ค.
๋ฌผ๋ก ์นด๋ ์ถ๊ฐ ํ์ธ ๋ฒํผ์ ๋๋ ์ ๋ (api๋ฅผ ํธ์ถํด์ ๋ฐ์ดํฐ๊ฐ ํ๋ฉด์์ ๋ณ๊ฒฝ๋์ด์ผ ํ ๋)๋ ์๋ก๊ณ ์นจ์ ํ์ง๋ง, ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์์ด ํ๋ฉด๋ง ๋ณ๊ฒฝํด๋ ๋๋ ๊ฒฝ์ฐ์๋ ์๋์ ๊ฐ์ด .innerHTML์ ํตํด ํ๋ฉด์ mustache ํ์ผ์ ๋ด์ฉ์ ์ถ๊ฐํด์ค๋๋ค.
์ด ๊ณผ์ ์์ ํด๋ผ์ด์ธํธ๋ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๊ณ ํ์ด์ง ์ผ๋ถ๋ฅผ ๋์ ์ผ๋ก ๋ณ๊ฒฝํด์ค๋๋ค.
function fetchColumnsAndRender() {
fetch('/api/columns')
.then(response => response.json())
.then(data => {
fetch('../components/column.mustache')
.then(response => response.text())
.then(template => {
const renderedColumns = data.columns.map(column => {
return Mustache.render(template, column);
}).join('');
const contentSection = document.querySelector('.content');
// innerHTML += ์ ํตํด ํ๋ฉด์ ์ถ๊ฐ
contentSection.innerHTML = renderedColumns;
})
.then(data => {
loadDeleteModal();
})
.then(data => {
registerCardEventListeners();
registerMoveCardEventListeners();
})
.catch(error => console.error('Error loading template:', error));
})
.catch(error => console.error('Error loading columns from API:', error));
}
์ฆ, HTML์ ์ผ๋ถ๋ฅผ ํด๋ผ์ด์ธํธ ์ธก์์ JavaScript๋ฅผ ํตํด ๋ณ๊ฒฝํ๋ ๊ฒ์ ๋๋ค.
๊ทธ๋์ ์ด ๋ฐฉ์์ CSR์ ๊ฐ๊น๋ค๋ ๊ฒฐ๋ก ์ ๋ด๋ ธ์ต๋๋ค.
(CSR : ํด๋ผ์ด์ธํธ ์ธก์์ JavaScript๋ฅผ ์ฌ์ฉํ์ฌ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์๋ฒ๋ก๋ถํฐ ๊ฐ์ ธ์ค๊ณ , HTML์ ๋์ ์ผ๋ก ๋ ๋๋งํ๋ ๋ฐฉ์)
๊ทธ๋ฐ๋ฐ ์๋ฌด๋ฆฌ ์๊ฐํด๋ด๋ CSR์ ๊ฐ์ฅ ํฐ ํน์ง์ด์ ์ ์ผํ(?) ์ฅ์ ์ด ์๋ก๊ณ ์นจ์ ํ์ง ์์ ํ๋ฉด์ด ๊น๋ฐ๊ฑฐ๋ฆฌ์ง ์๋๋ค๋ ๊ฒ์ธ๋ฐ, ์ ์น์ฌ์ดํธ๋ ๊น๋ฐ๊ฑฐ๋ฆฌ๊ณ ์๋ค๋ ๊ฒ์ด์์ต๋๋ค.
๊ทธ๋์, ๋ฌผ๋ก ํด๋ผ์ด์ธํธ๊ฐ ํ์ด์ง๋ฅผ ๋ ๋๋งํ๋ ๊ฒ์ด CSR์ด๋ผ๋ ์ ์๋ ์๊ณ ์์ง๋ง,
๊ณผ์ฐ ๊ฐ์ฅ ํฐ ํน์ง์ธ ๊น๋ฐ๊ฑฐ๋ฆฌ์ง ์๋๋ค๋ ์ ์ ๋ง์กฑํ์ง ๋ชปํ๋๋ฐ, ๊ทธ๊ฑธ CSR์ด๋ผ๊ณ ํ ์ ์์๊น?
ํ๋ ๋๋ ๋ง์ ๋น ์ง๊ฒ ๋์์ต๋๋ค.
์ด ๋๋ ๋ง ๋๋ฌธ์ ์ ๋ง ํ์ฐธ์ ๊ณ ๋ฏผํ๋๋ฐ, ์ฌ์ค ์์ ํ ๋ต์ ์ฐพ์ง๋ ๋ชปํ์ต๋๋ค.
๊ทธ๋ฌ๋ ์ฌ๊ธฐ์ ๋ ๋ค๋ฅธ ์๋ก์ด ์๊ฐ์ด ๋ค์์ต๋๋ค.
๋ง์ฝ ํด๋ผ์ด์ธํธ์์ JavaScript๋ฅผ ํตํด ํ ํ๋ฆฟ์ ๋ ๋๋งํ๊ณ ์๋ค๋ฉด, ์ด๋ ๋ง์น ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ฒ๋ผ ๋์ํ๊ณ ์๋ ๊ฒ ์๋๊น?
SSR์ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง์ ์ฝ์์ ๋๋ค.
๊ทธ๋ฐ๋ฐ ์ ๋ ์์ฐ์ค๋ฝ๊ฒ ์๋ฒ๋ผ๋ ๋จ์ด ๋๋ฌธ์ SSR์์ ์๋ฏธํ๋ ์๋ฒ๊ฐ ๋ฐฑ์๋ ์๋ฒ๋ผ๊ณ ์๊ฐ์ ํ๋๋ฐ,
SSR์ ๊ณต๋ถํ๋ค ๋ณด๋, โ๊ทธ๋ฅ ๋จ์ํ ์๋ฒโ, โ์ฝ๊ฒ ๋งํด ์ธํฐ๋ท์ด ๋๋ ์ปดํจํฐโ๋ผ๊ณ ์๊ฐํด์ผ ํ๋ค๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค.
์ฆ โ์๋ฒ = ์ธํฐ๋ท์ด ๋๋ ์ปดํจํฐโ, โ์๋ฒ โ ๋ฐฑ์๋โ์ธ ๊ฒ์ธ๋ฐ,
์ผ๋ฐ์ ์ผ๋ก ์ฐ๋ฆฌ๊ฐ ์๊ฐํ๋ SSR์ ์๋ฒ์์ HTML์ ์์ฑํด ํด๋ผ์ด์ธํธ๋ก ์ ์กํ๋ ๊ฒ์ ์๋ฏธํ์ง๋ง,
ํด๋ผ์ด์ธํธ์์ Javascript๋ก HTML์ ์กฐ์ํ๋ ๊ฒ๋ ์ผ์ข ์ ์๋ฒ ์ญํ ์ด ์๋๊น?
ํ๋ ์๊ฐ์ด ๋ค์์ต๋๋ค.
javascript๊ฐ html ๋์ ์ ๊ทผํด ์กฐ์ํ๋ ๊ฒ๋ ์๋ฒ๋ก ๋ณผ ์ ์์ง ์๋?
๋ผ๋ ์๋ฌธ์ด ๋ค์์ต๋๋ค.
๋ค์ ๋งํ๋ฉด CSR์ ๋ธ๋ผ์ฐ์ ๋ด์์ JavaScript๊ฐ HTML์ ์์ฑํ๋ ๊ฒ์ด๋ฏ๋ก,
"๋๊ฐ HTML์ ์์ฑํ๋๊ฐ"์ ์ด์ ์ ๋ง์ถ๋ค๋ฉด,
CSR ์ญ์ "์๋ฒ์ฌ์ด๋ ๋ ๋๋ง"์ ๋์ ๋ฒ์ฃผ์ ์ํ ์ ์์ง ์์๊น ํ๋ ์๊ฐ์ด ๋ค์์ต๋๋ค.
๊ทธ๋ฐ๋ฐ ์ด๋ฐ ์๊ฐ๋ค์ ๊ณ์ ํ๋ค๋ณด๋ ๋๋ฌด ๋ฉ๋ฆฌ๊น์ง ์จ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ค์๊ณ ,
CSR ์ญ์ "์๋ฒ์ฌ์ด๋ ๋ ๋๋ง"์ ๋์ ๋ฒ์ฃผ์ ์ํ๋ค๊ณ ํ๋๋ผ๋ ์ด์ฐจํผ ๋ด ์ฝ๋๋ ์ด๋์ ์ํ๋์ง ์ด ๋ ผ์๋ก๋ ์ ์ํ ์ ์๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์ด ์๊ฐ์ ๋ฉ์ถ๊ธฐ๋ก ํ์ต๋๋คโฆ
๊ฒฐ๋ก ์ ์ผ๋ก, ์ ๊ฐ ์ง ์ฝ๋๊ฐ CSR์ธ์ง SSR์ธ์ง ๋ช ํํ๊ฒ ํ๋๋ก ๊ตฌ๋ถํ ์๋ ์์์ต๋๋ค.
SSR๊ณผ CSR์ ํผํฉํ์ฌ ์ฌ์ฉํ ๊ฒ์ด๋ผ๊ณ ํ๋จํ์๊ณ ,
๋ค๋ง CSR์ ์ฌ์ฉํ ๋ถ๋ถ ์ค์์๋ (์๋ฅผ ๋ค์๋ฉด ์นด๋ ์ถ๊ฐ) ๋ ๋๋ง ์ ์๋ก๋ง ๋ฐ์ง์๋ฉด CSR์ด ๋ง์ง๋ง ๊น๋ฐ์์ด ์๋ค๋ CSR์ ์ฅ์ ์ ํ์ฉํ์ง ๋ชปํ๋ค๋ ๊ฒ์ ์ ์ ์์์ต๋๋ค.
ํญ์ ๋ฆฌ์กํธ๋ง ์ฌ์ฉํ๋ค๊ฐ ์ด๋ ๊ฒ ๋ฐ๋๋ผ js๋ก ๊ตฌํํด๋ณด๋, ์์ผ ์ํ ๊ด๋ฆฌ์ ์ค์์ฑ์ ๋ํด ๋ค์๊ธ ๊นจ๋ซ๊ฒ ๋์๊ณ , ๋ ๋๋ถ์ ๊น์ด ์๊ฒ ๊ณต๋ถํด๋ณผ ์๊ฐ์กฐ์ฐจ ํ์ง ๋ชปํ๋ CSR๊ณผ SSR์ ๋ํด์๋ ํ์ตํด๋ณผ ์ ์์์ต๋๋ค.
CSR๊ณผ SSR์ ์ฐจ์ด๋ ๋จ์ํ ํ์ด์ง์ ๊น๋ฐ์ ์ฌ๋ถ๋ ์๋ก๊ณ ์นจ ์ ๋ฌด๋ก๋ง ๊ตฌ๋ถํ ์ ์๋ ๊ฒ์ด ์๋๋ผ
HTML์ ์์ฑํ๊ณ ๋ ๋๋งํ๋ ์ฃผ์ฒด๊ฐ ์ด๋์ ์๋์ง๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋จํด์ผ ํ๋ค๋ ๊ฒ,
์๋ฒ์ ํด๋ผ์ด์ธํธ์ ์ญํ ์ ๋ช ํํ ๊ตฌ๋ถํ๊ณ , ๊ฐ ๋ฐฉ์์ ํน์ฑ๊ณผ ์ฅ์ ์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํ๋ค๋ ๊ฒ,
๊ทธ๋ฆฌ๊ณ SSR์์ ์ง์นญํ๋ ์๋ฒ๋ ๋ฐฑ์๋ ์๋ฒ๊ฐ ์๋๋ผ๋ ๊ฒ์ ์ค์ํ๊ฒ ๊ธฐ์ตํด๋์ด์ผ๊ฒ ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
์ฒ์์ผ๋ก ์ ๊ณ ๋ฏผ ๊ณผ์ ์ ๋งค๊ฑฐ์ง ํ์์ผ๋ก ์์ฑํด๋ณด์๋๋ฐ, ํ์คํ ์ ๊ณ ๋ฏผ์ ๊ธฐ์ตํด๋ ์ ์์ด์ ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
์ต๋ํ ์์ฃผ ์ด๋ฐ ์์ผ๋ก ๋ฅ๋ค์ด๋ธ ํด๋ณด๊ณ , ๊ทธ ๊ฒฝํ๊ณผ ๊ณ ๋ฏผ์ ์์ฑํ ์ ์๋๋ก ํด์ผ๊ฒ ์ต๋๋ค.
์ค๋๋ง์ ๊นํ๋ธ ๊ตฌ๊ฒฝํ๋ค๊ฐ ์ฌ๋ฐ์ด๋ณด์ฌ์ ์ฝ์ด๋ณด๊ณ ๋๊ธ ๋จ๊น๋๋ค.
๊ธ์์ ์ด๋ฏธ ๋ง์ ๊ณ ๋ฏผ์ด ๋๊ปด์ง์ง๋ง SSR๊ณผ CSR์ ์ ํ๋์ง๋ฅผ ์ค์ ์ผ๋ก ์๊ฐํด๋ณด๋ฉด ์กฐ๊ธ ๋ ์ดํด๊ฐ ์ฌ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
1.
์ด๊ธฐ์๋ CSR๊ณผ SSR์ด๋ผ๋ ๊ฐ๋ ์ด ๋๋์ด์์ง๋ ์์์ด์. CSR ์ด๋ผ๋ ๊ฐ๋ ์์ฒด๊ฐ ์์์ฃ . ์๋ฒ์ ๋ธ๋ผ์ฐ์ ๋ผ๋ ๊ฐ๋ ์์ "์๋ฒ", ํนํ ๊ทธ ์ค์์ "์น์๋ฒ"๋ html์ "์๋น"ํด์ฃผ๋ ์ญํ ์ ๋ด๋นํ๊ณ ์๋ ์น๊ตฌ์ ๋๋ค. ๊ทธ๋์ ์๋ฒ๊ฐ html์ ๋ด๋ ค์ฃผ๋ ๊ฒ์ ๋๋ฌด ๋น์ฐํ ์ญํ ์ด์์ด์. ๊ทธ ๋น์ html์ ์ ์ ์ธ html ์ด๋ผ๊ณ ์๊ฐํด๋ ๋ฌด๋ฐฉํฉ๋๋ค.
2.
์น์ฌ์ดํธ์ ์ ์ ๋ง์ ๊ธฐ๋ฅ์ด ์๊ตฌ๋๋ฉด์ cgi๋ผ๋ ๊ฐ๋ ์ด ๋์์ด์. ์น์ฌ์ดํธ๋ ์ด์ ๋จ์ํ ์ ์ ์ธ ์ฌ์ดํธ๊ฐ ์๋๋ผ ์ฌ์ฉ์์ ๋ง๋ ์ ๋ณด๋ฅผ ๋ณด์ฌ์ฃผ๊ฑฐ๋, ์ฌ์ฉ์์ ์์ฒญ์ ๋ฐ๋ฅธ ์๋ต์ ๋ณด์ฌ์ฃผ๋ ์ญํ ์ด ๋ถ์ฌ๋์์ต๋๋ค. ์๋ฒ๋ cgi ๊ธฐ๋ฐ์ ์ฌ๋ฌ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ํ๋ ์์ํฌ๋ค๋ก ํ๋ก๊ทธ๋๋ฐ๋ html์ ๋ด๋ ค์ฃผ๊ธฐ ์์ํ์ด์. ์ด๋๋ถํฐ ์ผ์ข ์ ๋์ ๋ ๋๋ง์ด๋ผ๋ ๊ฐ๋ ์ด ์๊ฒผ๋ค๊ณ ์ดํดํ๋ฉด ํธํ ๊ฒ ๊ฐ์ต๋๋ค.
๊ฐ๋ น, ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํด์ html table ํํ๋ก ๊ฒ์ํ์ ํ์ด์ง๋ฅผ ๋ง๋ค์ด ์ ๊ณตํ๋ค๊ฑฐ๋, ์ฌ์ฉ์์ form ์์ฒญ์ ๋ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋ค๊ฑฐ๋ ํ๋ ๋ฑ์ crud ๋์์ ์นํ์ด์ง๊ฐ ์ ๊ณตํ๊ฒ ๋ ๊ฑฐ์ฃ .
์ด๋๊น์ง๋ง ํด๋ ์ด ๊ธ์ ๋ณธ๋ฌธ์ฒ๋ผ "๊น๋นก"์ด๋ ํ์ด์ง ์ด๋์ ํตํด์๋ง ๋ฐ์ดํฐ ์ฒ๋ฆฌ๊ฐ ์ด๋ฃจ์ด์ก์ด์. ๊ฐ๋ น form ์ ์ก์ด๋ผ๊ฑฐ๋, ํ์ด์ง ์ด๋์ด๋ผ๊ฑฐ๋ ํ๋ ์์ผ๋ก ํ์ด์ง๊ฐ ํต์งธ๋ก ์์ง์ด๋ ๋์์ธ ๊ฑฐ์ฃ .
3.
์น์ฌ์ดํธ๊ฐ ์ ์ ๋ณต์กํด์ง๋ฉด์ ํ์ด์ง๊ฐ ์ด๋ํ์ง ์๊ณ ๋ ์๋ฒ์ ์ํธ์์ฉ์ ํ๊ณ ์ ํ๋ ๋์ฆ๊ฐ ์๊ฒผ์ต๋๋ค. ๊ฐ๋ น ํ์ด์ค๋ถ์ ๋ฌดํ์คํฌ๋กค์ฒ๋ผ์. ๊ธฐ์กด์๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ธ์ด๋ (์ด๋ฏธ ๋งํด๋ฒ๋ฆฐ) ํ๋์ ๊ฐ์ ๊ฒ์ ํตํด ์น์ฌ์ดํธ์ ํจ๊ณผ๋ ๋ธ๋ผ์ฐ์ ์ด๋ฒคํธ ๋ฑ์ ์ฒ๋ฆฌํ ์๋ ์์์ง๋ง, ํ์ด์ง ์ด๋ ์์ด ์๋ฒ์ ์ํธ์์ฉํ์ง ๋ชปํ๊ฑฐ๋ ์.
ajax ๋ผ๋ ๊ธฐ์ ์ด ๋ฑ์ฅํ๋ฉด์ ํจ๋ฌ๋ค์ ์ ํ์ด ์ด๋ฃจ์ด์ก์ต๋๋ค. ajax๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์๋ฒ์ ๋น๋๊ธฐ ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ต ๋ฐ์ ์ ์๋๋ก ๋์์ฃผ๋ ๊ธฐ๋ฅ์ด์์. (๊ณผ๊ฑฐ๋ถํฐ ๋ง์ด ์ฐ์ธ XMLHttpRequest, ์ต๊ทผ ๋ฑ์ฅํ fetch, ๋๋ฆฌ ์ฐ์ด๋ axios ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฐ์๊ฒ ajax๋ฅผ ์ํ ๋๊ตฌ์์.) ์๋ฒ์ ์ํธ์์ฉ ํ๊ธฐ ์ํด์๋ ๊ธฐ์กด์๋ ํ์ด์ง ์์ฒญ์ ํ์ด์ผ ํ๋๋ฐ, ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๋ธ๊น ํด์ ์์ฒญ์ ์ฃผ๊ณ ๋ฐ์ ์ ์๊ฒ ๋ ๊ฑฐ์ฃ .
ajax๊ฐ ๋ฑ์ฅํ ํ์๋ ํ์ด์ง ๋ด ์ผ๋ถ ์์๋ฅผ ์ ๋ฐ์ดํธ ํ๋ ๋์์ ๋์ด์ ์๋ก์ด ํ์ด์ง ์์ฒญ์ ๋ณด๋ผ ํ์๊ฐ ์์ด์ก์ต๋๋ค. ajax๋ก ์๋ฒ์ ์๋ก์ด ์์ฒญ์ ๋ณด๋ด๊ณ , ๊ทธ๊ฑธ ๋ฐ์์ ๋ธ๋ผ์ฐ์ ์์ html์ ๊ทธ๋ฆฌ๋ฉด ๋๋ ๊ฑฐ์์ฃ . ๊ธฐ์กด์๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ก html์ ๊ทธ๋ฆด ์๋ ์์์ง๋ง, ์๋ฒ์ ์๋ต์ ๋ฐ์ ์๋ก์ด "๋ฐ์ดํฐ"๋ฅผ ๊ธฐ๋ฐ์ผ๋ก html์ ๊ทธ๋ฆฐ๋ค๋ ์ ์ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
ajax ํ๋ฉด ๋จ์ํ xml, json ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๊ฑธ๋ก ์๊ฐํ ์ ์์ง๋ง, ์ด๊ธฐ์ ๊ทธ๋ฅ html ์์ฒด๋ฅผ ๋ด๋ ค์ฃผ๋ ์์ผ๋ก๋ ๋ง์ด ๊ตฌํํ๊ณค ํ์์ด์. (์ง๊ธ์ json ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ ค์ฃผ๋ฉด ๋ฏธ์น์ฌ๋ ์๋ฆฌ๋ฅผ ๋ฃ๊ฒ ์ง๋ง์.) ๊ฐ๋ น ํ์ด์ค๋ถ์ ๋ฌดํ์คํฌ๋กค์ ๊ตฌํํ๋ค๊ณ ํ์ ๋, ์๋กญ๊ฒ ์ถ๊ฐ๋ ์๋ฆฌ๋จผํธ๋ค์ ๋ฐ์ดํฐ๋ฅผ ์๋ฒ์์ ๋ด๋ ค์ฃผ๋ ์์ผ๋ก ๊ตฌํํ ์ ๋ ์๊ฒ ์ง๋ง(์ด๊ฒ ์ง๊ธ ๋๋ฆฌ ์ฐ์ด๋ ๋ฐฉ์์ด์ฃ ), ์๋ฒ์์ ๊ทธ๋ฅ ์๋ฆฌ๋จผํธ๋ค์ html๋ก ๊ทธ๋ ค์ html์ ๋ด๋ ค์ฃผ๊ณ ๋ธ๋ผ์ฐ์ ์์ ๊ทธ html์ innerHTML๋ก ๋ง๋ถ์ด๋ ์์ผ๋ก๋ ๊ตฌํํ ์ ์์ต๋๋ค.
-> ๊ทธ๋ ๋ค๋ฉด ์ด๊ฑด CSR์ผ๊น์? SSR์ผ๊น์?
4.
ajax๊ฐ ๋ฑ์ฅํ ์ดํ๋ก html์ ๊ทธ๋ฆฌ๋ ์ญํ ์ด ์๋ฒ์์ ๋ธ๋ผ์ฐ์ ๋ก ๋ง์ด ๋์ด์์ต๋๋ค. ๋ฐ์ดํฐ๊ฐ ์์ด์ผ html์ ๊ทธ๋ฆดํ ๋ฐ, ์ด์ ๋ธ๋ผ์ฐ์ ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ฌ ๋ฐฉ๋ฒ์ด ์๊ฒผ์ผ๋๊น์. ์ด ์๊ธฐ๋ถํฐ ๋ณธ๊ฒฉ์ ์ผ๋ก ๋ธ๋ผ์ฐ์ ์์ html์ ์ ๊ทน์ ์ผ๋ก ๋ฐ๊พธ๋ ์์ผ๋ก ํจ๋ฌ๋ค์ ์ ํ์ด ๋์์ด์.
์์ ๋ธ๋ผ์ฐ์ ์ html ๊ทธ๋ฆฌ๋ ์ ๊ถ์ ๋๊ฒจ๋ฒ๋ฆด ์ ์๋๋ก ๋์์ฃผ๋ ํ๋ ์์ํฌ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ(๋ผ๊ณ ์ฃผ์ฅํ๋..)๋ค๋ ๋ฑ์ฅํ์ด์. AngularJS, React, Vue.js ๊ฐ์ ์น๊ตฌ๋ค์ด์์.
ajax๊ฐ ๋ฑ์ฅํ ํ๋ก ์๋ฐ์คํฌ๋ฆฝํธ๋ก ํ์ด์ง๋ฅผ ์ด์ฌํ ์ ์ดํ๋ฉด์ ์ฌ๋ฌ ๋ฌธ์ ๋ค์ด ์์๊ฑฐ๋ ์.
1. DOM ์์๋ฅผ ์ง์ ๋ฐ๊ฟ๋ฒ๋ฆฌ๊ณ ์์ผ๋ ๊ด๋ฆฌ๊ฐ ์ด๋ ต๋ค. (์ html์ ๊ทธ๋์ ๋๊ฐ ๊ทธ๋ฆฐ๊ฑด๋ฐ? ์ด ์ด๋ฒคํธ๋ ์ ๊ฐ์๊ธฐ ๋ฐ์ธ๋ฉ ๋ ๊ฑด๋ฐ?)
2. ๋ฌด๋ถ๋ณํ๊ฒ html์ ๋ฎ์ด์ฐ๊ณ ํ๋ค๋ณด๋ ํ์ด์ง๊ฐ ๋ฒ๋ฒ ์ธ๋ค. (์ผ๋ฐ์ ์ผ๋ก ๊ฒฝํํ๊ธด ํ๋ค๊ฒ ์ง๋ง)
์๋ก ๋ฑ์ฅํ ๋๊ตฌ๋ค์ ์ด๋ฐ ๋ฌธ์ ๋ฅผ ์ฌ๋ฌ ๋ฐฉ๋ฉด์์ ํด๊ฒฐํ๋ ค๊ณ ํ์ด์.
AngularJS๋ ์๋ฒ์์๋ ํ๋ MVC๋ผ๋ ํจํด์ ๋ธ๋ผ์ฐ์ ๋ก ์ฎ๊ฒจ์ค๋ ์๋๋ฅผ ํ๊ณ ,
React, Vue.js๋ ๋ ๋๋ง ๋ฐฉ๋ฒ ์์ฒด๋ฅผ ์ถ์ํ์์ผ๋ฒ๋ ธ์ด์.
์๋ก์ด ๋๊ตฌ๋ค์ ์ด๋ฐ ๋ฐฉ๋ฒ๋ค๋ก ๋ธ๋ผ์ฐ์ ๊ฐ html์ ๋จ์ํ "์์ "ํ๋ ์ญํ ์์, ์ ๊ทน์ ์ผ๋ก "์์ฐ"ํ๋ ์ญํ ๋ก, ์ฌ์ง์ด๋ ๋ธ๋ผ์ฐ์ ๊ฐ html์ ๊ทธ๋ฆฌ๋ ์ ๊ถ์ ๊ฐ์ ธ๊ฐ๋๋ก ๋ง๋ค์ด๋ฒ๋ ธ์ด์. ์ด์ ๋ ํ์ด์ง ์ด๋ ์ด๋ฒคํธ๊น์ง๋ ๊ฐ์ญํ๊ธฐ ์์ํ๊ฑฐ๋ ์.
์ด๋ฐ ์ผ๋ จ์ ๊ณผ์ ๋ค์ ๊ฑฐ์ณ ์๋ฒ์์๋ html ์์ ํ์ด์ง์ ๋ํ ์ ๋ณด ์์ด ๋จ์ํ ๋ฃจํธ ์๋ฆฌ๋จผํธ๋ฅผ ๋ง๋ค๊ณ ํ๋ ์์ํฌ์ ๋ ๋๋ง ํจ์๋ฅผ ์คํํ๋ html๋ง ๋์ ธ์ฃผ๋ ๊ทน๋จ์ ์ธ ํํ์ ํ์ด์ง๊ฐ ๋ง์ด ์๊ฒจ๋ฌ์ด์.
5.
์ฌ์ค ์ด๊ฑด ๋นํจ์จ์ ์ด๋ผ๊ณ ํ ์ ์์ด์. ์๋ฒ์์๋ ๋จ์ํ ์ฟผ๋ฆฌ ํ ๋ฒ์ผ๋ก ๋๋ ์ ์๋ ๋ฐ์ดํฐ ์กฐํ๋ฅผ, ๋ธ๋ผ์ฐ์ ์์๋ ์๋ฒ์ ajax ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ฒ๊ฐ ์ฟผ๋ฆฌ๋ฅผ ํ๋ก์ํ๋ ๊ตฌ์กฐ๊ฐ ๋์์ผ๋๊น์. (๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด 1 hop์ด ๋ ์๊ธด ๊ฑฐ์ฃ .) ํ์ด์ง๋ ๋น์ฐํ ๋๋ ค์ง๊ฒ ์ฃ . ๋๋ ค์ง๋ ๊ฑธ ๊ฐ์ํ ๋งํผ์ ์ฝ๋ ํ๋ฆฌํฐ ์์น์ด ์์๊ฒ ์ง๋ง ์ฌ์ฉ์๋ ๊ทธ๋ฐ๊ฑฐ ๊ด์ฌ ์์ฃ .
์๋ฒ์์ ๋ ๋๋ง ๋ ํ์ด์ง๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์์ง ์๋ค๋ ๊ฒ ์์ฒด์ ๋ฌธ์ ์ ๋ ์์ด์. ๊ฒ์ ๋๊ตฌ๋ค์ ์๋ฒ์ ์๋ต๋ง ์ฒ๋ฆฌํ ๋ฟ, ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ์ง ์๊ธฐ ๋๋ฌธ์ ๊ฒ์ ๋๊ตฌ๊ฐ ๋ด ์ฌ์ดํธ๋ฅผ ์์งํ ๋ฐฉ๋ฒ์ด ์์ด์ก์ด์. (์ด์ ๋ ๋ง์ด ๋ณด์๋์๋ค๊ณ ๋ ํด์) ์ฌ์ง์ด ํ์ด์ง ์ด๋๊น์ง๋ ํ๋ ์์ํฌ๊ฐ ๊ฐ๋ก๋ง๊ณ ์๋ค๋ณด๋ ์ด๋ค ํ์ด์ง๊ฐ ์๋ ์ง ์กฐ์ฐจ๋ ์ ์๊ฐ ์๊ฒ ์ฃ .
์ด๋ฐ ๋ฌธ์ ๋ค์ ํด๊ฒฐํ๊ธฐ ์ํด ๋ค์ html ๊ทธ๋ฆฌ๋ ์ญํ ์ ์๋ฒ์ ๋๋ด์ด์.
์ด์ ์๋ฒ์ ํด๋ผ์ด์ธํธ๋ ์๋ก ํ์ด์ง๋ฅผ ๊ทธ๋ฆด ์ ์๋ ์ฝ๋๋ฅผ ๊ณต์ ํด์. ํน์ ํ์ด์ง ์์ฒญ์ ์๋ฒ๋ก ๋ณด๋ด๋ฉด ์๋ฒ๊ฐ ๊ทธ ํ์ด์ง ์๋ต์ ํด์ฃผ๊ณ , ํด๋ผ์ด์ธํธ๋ก ๋ณด๋ด๋ฉด ํด๋ผ์ด์ธํธ๊ฐ ๊ทธ ํ์ด์ง๋ฅผ ๊ทธ๋ ค์ฃผ๋ ์์ผ๋ก์. ๋ ๊ฐ์ ์ฅ๋จ์ ์ ๊ณต์ ํ๊ฒ ๋ค๋ ๊ฑฐ์ฃ .
CSR, SSR ์ด๋ผ๋ ์ฉ์ด์ ์ง์ฐฉํ ํ์๋ ์๋ค๊ณ ์๊ฐํด์.
(๊ฐ์ธ์ ์ผ๋ก ํ๋ก ํธ์๋ ์ง์์ ๊ณผํ๊ฒ ๋ณต์กํ ์ฉ์ด๋ฅผ ์ฌ์ฉํ๊ณ ๊ฐ๋ ์ด ๊ผฌ์์ ธ์๋ค๊ณ ์๊ฐํด์. ๋ฆฌ์กํธ๊ฐ ์ฃผ๋ฅ์ด์ง๋ง ๋ฆฌ์กํธ ์์์๋ ์ธ๋ถ์ข ํ๊ฐ ๋๋๋ ํผ๋์ ์๊ธฐ์ธ ๊ฒ ๊ฐ์์.)
๋ณธ์ง์ ์ง์คํด์, ์นํ์ด์ง๋ ์ฌ์ฉ์์๊ฒ ์ ๋ณด๋ฅผ ์ ๋ฌํ๋ ์ญํ ์ด๊ณ , ์ฌ๊ธฐ์์ ์ ๋ณด๋ ๋ฐ์ดํฐ๊ฐ ๊ฐ๊ณต๋ ๊ฒฐ๊ณผ๋ฌผ์ด์์. ์นํ์ด์ง๊ฐ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ค ์ ์๋ ์ ๋ณด๋ html์ด๊ฒ ์ฃ . (์ ํํ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ๊ทธ๋ ค์ค ํ๋ฉด์ด ์ ๋ณด์ด๊ฒ ์ง๋ง.. ๋ธ๋ผ์ฐ์ ์๊ฒ ํ๋ฉด์ ๊ทธ๋ ค์ฃผ๋ผ๊ณ ์์ฒญํ๋ ๋ฐ์ดํฐ ํฌ๋งท์ด html์ด๋ ์ด๋ฐ ์ธ๋ถ ๋์์ ์๋ตํ ๊ฒ์)
๋ ๋๋ง์ด๋ผ๋ ์ฉ์ด๋ฅผ ๋จ์ํ "html์ ๊ทธ๋ฆฐ๋ค" ๊ฐ ์๋๋ผ "์ ๋ณด๋ฅผ ๊ทธ๋ฆฐ๋ค" ๋ผ๊ณ ํด์ํด๋ณด๋ฉด ์ด๋จ๊น์? ๋ธ๋ผ์ฐ์ (ํด๋ผ์ด์ธํธ)๊ฐ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ดํฐ(json๊ณผ ๊ฐ์)๋ฅผ ๋ฐ์ ์ ๋ณด(html)๋ฅผ ๊ทธ๋ฆฐ๋ค๋ฉด CSR ์ด๊ฒ ๊ณ , ์๋ฒ๊ฐ ์ง์ ๋ฐ์ดํฐ๋ฅผ ํธ๋ค๋งํด์ html์ ๋ด๋ ค์ค๋ค๋ฉด SSR ์ด๊ฒ ์ฃ . ์๋ฒ์ ํด๋ผ๊ฐ ๋ ๋ค ํ๊ณ ์๋ค๋ฉด SSR๊ณผ CSR ๋ชจ๋ ํ๊ณ ์๋ ๊ฑฐ์ฃ .
๋จ์ํ ์๋ฏธ ์๋ html๋ง์ ๊ทธ๋ฆฌ๊ณ ์๋ค๋ฉด ๊ทธ๊ฑด ๋ ๋๋ง์ด๋ผ๊ณ ํ ์ ์๋ค๊ณ ์๊ฐํด์. ์ ์ ํ์ผ์ ์๋นํ ๊ฒ์ด๋ ๋ค๋ฆ ์์ผ๋๊น์.
๋ณธ๋ฌธ์์ ์ธ๊ธํ mustache๋ก ํ์ด์ง๋ฅผ ์ด๋ป๊ฒ ๊ทธ๋ ธ๋ ์ง๋ ์ ์ ์์ง๋ง ์ด๋ฐ ๊ด์ ์์ ์ ๊ทผํด๋ณด๋ฉด ๋์์ด ๋์ค ๊ฒ ๊ฐ์ต๋๋ค.