SPA(?)구조 웹사이트(https://m.pet-friends.co.kr/main/tab/6) 를 클론중인데..
리액트 없이 하다보니 그냥 바닐라 스크립트로 innerHTML 을
활용할 수 밖에 없을거 같아서 GPT 에게 질문해 보았다.
아래부터는 GPT 답변..
서버에서 파일을 가져와 특정 요소의 innerHTML을 변경하는 방식은 일반적인 방식은 아니지만 특정 상황에서는 유용하게 사용될 수 있습니다.
SPA(싱글 페이지 애플리케이션) 비슷한 구조 구현
fetch()로 가져온 HTML을 innerHTML로 삽입하면, 전체 페이지를 새로고침하지 않고도 내용 변경이 가능합니다. 페이지 일부만 동적으로 변경할 때 (예: AJAX 기반 페이지 전환)
iframe을 사용하지 않고 특정 부분만 업데이트하고 싶을 때. 서버에서 정적인 HTML 파일을 관리하는 경우
SEO(Search Engine Optimization) 문제
innerHTML 내용을 제대로 인덱싱하지 못할 가능성이 있습니다. History 관리가 필요함
fetch() 방식으로 페이지를 교체하면 브라우저의 뒤로 가기/앞으로 가기 기능이 정상적으로 작동하지 않습니다. history.pushState() 등을 사용하여 히스토리를 관리해야 합니다. JavaScript 의존성 증가
innerHTML로 페이지를 변경하면 JavaScript를 사용할 수 없는 환경(예: 일부 봇, 텍스트 브라우저)에서는 정상적으로 표시되지 않을 수 있습니다. <script> 태그가 실행되지 않는 문제가 발생할 수 있습니다. AJAX + History API 사용 (추천)
fetch()를 사용하면서도 history.pushState()로 URL을 업데이트하면, 사용자는 브라우저의 "뒤로 가기" 기능을 사용할 수 있습니다. <a href="page1.html" onclick="loadPage(event, 'page1.html')">페이지 1</a>
<a href="page2.html" onclick="loadPage(event, 'page2.html')">페이지 2</a>
<div id="content">여기에 새로운 페이지가 로드됩니다.</div>
<script>
async function loadPage(event, url) {
event.preventDefault(); // 기본 링크 이동 방지
const response = await fetch(url);
const data = await response.text();
document.getElementById('content').innerHTML = data;
history.pushState(null, '', url); // URL 변경
}
window.addEventListener('popstate', async () => {
const response = await fetch(location.pathname);
const data = await response.text();
document.getElementById('content').innerHTML = data;
});
</script>
✅ 장점:
fetch()로 페이지를 로드하면서도 브라우저 히스토리를 유지하여 뒤로 가기/앞으로 가기 가능 기존 프레임워크 사용 (React, Vue, Next.js 등)
서버 사이드 렌더링(SSR) 사용
PHP, Node.js (Express + EJS), Django, Ruby on Rails 등. ✅ 사용해도 되는 경우
❌ 일반적인 경우 더 나은 대안이 있음
fetch()를 사용할 경우 History API와 함께 사용하여 UX를 개선하는 것이 좋음 💡 추가 질문이 있거나 구체적인 요구사항이 있다면 알려주시면 더 적절한 방식을 추천해 드리겠습니다! 😊