SPA가 무엇인지 알려면, 기본적으로 웹이 어떻게 동작하는지 알아야 이해가 좋다.
hashbang과 history api를 이용하면 SPA를 구현할 수 있다.
다만 hashbang은 잘 사용하지 않고 주로 history api로 구현을 많이 한다.
http://localhost:5000/
http://localhost:5000/#list
http://localhost:5000/#qna
위의 url응 모두 같은 페이지(index.html)를 불러오며, 뒤에 붙은 #은 location.hash를 통해 가져올 수 있다.
이 hash를 통해 어떤 페이지를 렌더링할지를 정하는 로직을 구현해서 쓰는 방식이다.
해쉬 표기는 URL에서 항상 맨뒤에 있어야 된다.
http://localhost:5000/#list?id=1 // 이렇게 작성하면 안된다.
http://localhost:5000/?id=1#list // 이렇게 작성해야 한다.
http://localhost:5000/#list-1 // 혹은 이렇게 임시로 작성할 수도 있다.
location
window.location // 현재 윈도우의 url에서 해쉬를 가져온다.
location.search // 현재 윈도우의 url에서 쿼리스트링을 가져온다.
쿼리스트링 형태
?param1=value¶m2=value...
hashbang으로 간단하게 spa를 구현할 수 있다.
hashbang은 url의 맨마지막에 위치해야하는 특성 때문에 일반적인 url사용방식과 다르고 이에 따라 쿼리스트링을 다루기 까다롭다.
히스토리 API를 지원하지 않는 옛날 브라우저에서 작동한다.
하지만 모던한 방식이 아니기때문에 hashbang이 아닌 history API 방식을 많이 사용한다.
브라우저에서 페이지 로딩을 하면, 세션 히스토리라는 것을 갖는다.
세션 히스토리는 페이지를 이동할 때마다 쌓이게 되며, 이를 통해 뒤로가기 시 이전 페이지로 가거나 뒤로 간 이후 다시 앞으로 가는 등의 이동이 가능하다.
pushState, replaceState 두 개의 함수로 화면 이동 없이 현재 url을 업데이트 할 수 있다.
hashbang의 hashchange 이벤트처럼, popstate 이벤트로 세션 히스토리의 변경을 감지할 수 있다.
일반 url 형식을 따르기 때문에 쿼리스트링도 자유롭게 붙일수 있다.
/list?page=2&limit=10
문법
historay.pushState
history.pushState(state, title, url)
state: history.state
에서 꺼내 쓸 수 있는 값이다.
title : 변경될 페이지의 title을 가리키는 값인 것 같지만 거의 대부분 브라우저에서 지원하지 않는다. null 혹은 빈 string을 넣으면 된다.
url : 세션 히스토리에 새로 넣을 url이다. (a태그를 클릭하거나 location.href로 url을 변경하는 것과는 다르게 이 url이 변경된다고 해서 화면이 리로드 되거나 하진 않는다.)
historay.replaceState
historay.replaceState(state, title, url)
state: history.state
에서 꺼내 쓸 수 있는 값이다.
title : 변경될 페이지의 title을 가리키는 값인 것 같지만 거의 대부분 브라우저에서 지원하지 않는다. null 혹은 빈 string을 넣으면 된다.
url : 세션 히스토리에서 현재 url과 대체한 url이다. (a태그를 클릭하거나 location.href로 url을 변경하는 것과는 다르게 이 url이 변경된다고 해서 화면이 리로드 되거나 하진 않는다.)
history.state //
history.go(1) //
history.back(1) //
history api를 사용할 경우, hashbang과는 다르게 a태그를 그대로 쓰면 의도한대로 동작하지 않느다.
왜내하면 a태그를 클릭했을 때 기본 동작은 href에 연결된 url로 이동을 해버리는데, history api에서 SPA처리를 하려면 이동을 하는게 아니라 바뀌는 요소만 다시 렌더링 해야하기 때문이다.
주의!
SPA는 어떤 url이던지 초기 페이지(index.html)에서 모든 url에 해당하는 페이지를 렌더링하는 방식이다.
따라서 경로가 있는 url에서 새로고침을 하거나 바로 접근하게 되면 페이지를 찾을수 없다는 404에러를 만나게 된다.
이는 실제로 해당 url에 html파일이 없기 때문이다.
예를들어 우리는 index.html 파일만 존재하는데 만약
localhost:5000/list
라는 url을 새로고침하거나 바로 접근하게 되면 404에러를 받는다.이런것을 처리하기 위해서는 웹서버에서 만약 경로에 파일이 없다면 index.html을 띄우도록 설정을 해야한다.