반응형

안녕하세요. 이번 시간에는 History API에 대해 알아보겠습니다.

제 블로그를 보시면 페이지가 깜빡이지 않는데도 내용도 바뀌고 주소도 바뀝니다. 물론 리액트 기술을 사용하였기 때문에 가능한 일이지만, 실제로는 하나의 페이지로 만들어진 웹입니다. 싱글 페이지 애플리케이션(SPA)이라고 하죠.

SPA의 단점은 주소가 바뀌지 않는다는 것입니다. 초창기에는 주소 뒤에 #(해쉬) #!(해쉬뱅)을 붙이고 뒤에 하위 주소를 넣었습니다. www.zerocho.com/#!/category/javascript처럼요. 하지만 이 방식은 뭔가 찜찜합니다. #!이라는 주소에 무언가 의미가 있는 것도 아니고 이질적인 느낌이 듭니다. 또한 서버는 # 뒷 부분을 제대로 된 주소라고 생각하지 않습니다.

undefined

따라서 해쉬뱅 대신 브라우저에서 제공하는 주소 API를 사용해 주소를 바꾸게 되었습니다. 바로 History API입니다. 요즘 웬만한 SPA의 라우터들은 이 API를 사용하고 있습니다. IE도 10부터 가능합니다.

이 API는 기존 history 객체(window.history)를 그대로 활용합니다. 따라서 자바스크립트로 뒤로가기(history.back())와 앞으로 가기(history.forward()), 지정한 위치로 가기(history.go(인덱스))를 모두 사용할 수 있습니다. 하지만 SPA일 경우를 가정하고 있기 때문에 이번 시간에는 위 메소드는 사용하지 않습니다.

주소 내역은 하나의 목록입니다. 뒤로가기, 앞으로가기는 목록 안에서 이동하는 것입니다. 따라서 목록에 새로운 주소를 추가하면 페이지를 이동한 셈이 됩니다. 목록에 주소를 추가하기 위한 메소드가 HTML5에서 생겼습니다.

바로 history.pushState()와 history.replaceState()입니다. 예제를 보며 사용방법을 익혀봅시다. html 파일을 만들어 다음 코드를 입력하세요. 저는 일부러 book 폴더를 만든 후 그 안에 파일을 생성했습니다.

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>History API</title>
</head>
<body>
<div id="state"></div>
<button id="pushState">pushState</button>
<button id="replaceState">replaceState</button>
<script>
  document.querySelector('#pushState').addEventListener('click', function () {
    history.pushState({ data: 'pushpush' }, 'title을 pushState로', '/pushpush')
  });
  document.querySelector('#replaceState').addEventListener('click', function () {
    history.replaceState({ data: 'replace' }, 'title을 replaceState로', '/replace');
  });
  window.addEventListener('popstate', function () {
    console.log('popstate', history.state);
    document.querySelector('#state').innerHTML = JSON.stringify(history.state);
  });
</script>
</body>
</html>

undefined

웹스톰을 통해 실행한 것이라 주소가 좀 지저분합니다. 아마 여러분은 그냥 /book/history.html일 것입니다. 

html에 두 개의 버튼이 있습니다. pushState와 replaceState인데요. pushState를 누르면 주소가 바뀝니다. 그리고 뒤로가기 버튼이 활성화됩니다. 페이지는 새로 갱신되지 않았는데 주소만 바뀐 효과가 나타난 것이죠.

undefined

코드를 보시면 pushState 버튼을 눌렀을 때 history.pushState({data:'pushpush'}, 'title을 pushState로', '/pushpush')하도록 되어있습니다. 첫 번째 인자는 바뀐 주소와 함께 저장할 데이터 객체이고, 두 번째 인자는 바꿀 제목, 세 번째 인자는 바꿀 주소입니다. 

주소와 함께 데이터도 저장할 수 있기 때문에 매우 유용합니다. 이 데이터에 바뀔 페이지의 정보들을 담아두고 클라이언트에서 정보를 활용해 새로운 페이지를 렌더링하면 됩니다. 정보는 history.state로 접근할 수 있습니다. 

두 번째 인자는 제목인데 브라우저에서 아직 제목 바꾸는 것까지는 구현하지 않았습니다. 그냥 빈 문자열을 넣어 두는 정도로 하시면 됩니다.

세 번째 인자는 바뀔 주소입니다. 위의 예시에서는 /pushpush를 주었기 때문에 절대 경로로 처리가 되었습니다. 만약 그냥 pushpush나 ./pushpush로 줬다면 상대경로로 처리가 되어 주소가 localhost:63342/book/pushpush가 되었을 것입니다.

뒤로 가기를 누르면 원래 주소로 돌아갑니다. 앞으로가기를 눌러서 /pushpush로 되돌아 갈 수도 있습니다.

원래 주소에서 replaceState를 눌러봅시다.

undefined

이번에는 뒤로가기가 활성화되지 않고 주소만 바꿉니다. pushState와의 차이점을 아시겠나요?

pushState는 주소 목록에 새로운 주소를 추가합니다. /book/history.html을 이전 주소로 두고, 새로운 주소로 /pushpush를 추가한 것입니다. 이전 주소가 남아있기 때문에 뒤로가기로 /book/history.html로 되돌아갈 수 있습니다.

하지만 replaceState는 이전 주소를 없애고 바꿀 주소를 넣습니다. /book/history.html이라는 주소 기록을 지우고 /replace를 추가하는 것입니다. 따라서 /book/history.html에 더는 접근할 수 없습니다.

pushState와 replaceState를 활용하여 프레임워크 없이 싱글 페이지 애플리케이션을 만들어보세요! 페이지 주소에 대한 데이터는 다시 말씀드리지만 history.state에 들어있기 때문에 언제든지 사용할 수 있습니다.

아, pushState와 replaceState로 주소를 바꾼 후, 뒤로가기나 앞으로가기를 했을 때 발생하는 이벤트가 있습니다. 바로 popstate 이벤트입니다. 예제처럼 윈도우에 이벤트 리스너를 연결해 두면 뒤로가기나 앞으로가기를 눌렀을 때 이벤트가 발생합니다. pushState를 여러 번 눌렀다가 뒤로가기를 해보면 #state에 history.state 정보가 뜹니다.

undefined

주의할 점은 pushState와 replaceState를 할 때는 이벤트가 발생하지 않는다는 것입니다. pushState 또는 replaceState를 한 후, 뒤로가기나 앞으로가기를 눌렀을 때만 발생합니다. popstate 이벤트 발생 후 history.state에 접근하면 이전 state를 가져올 수 있습니다. 따라서 이전 페이지도 그 정보들을 활용해 다시 렌더링할 수 있습니다.

History API, 별 거 아니죠? 다만 새로고침을 눌렀을 경우에는 없는 페이지라고 뜨기 때문에 이 부분은 서버사이드 렌더링으로 해결하셔야 합니다. SPA에서 주소를 자연스럽게 바꿀 수 있다는 것은 대단한 장점입니다. 물론 리액트 라우터나 앵귤러 라우터는 이를 이미 활용하고 있지만, 내부 원리를 알았다는 것에 의의를 두시면 됩니다.


출처 : https://www.zerocho.com/category/HTML/post/599d2fb635814200189fe1a7

반응형
반응형

1. 뒤로가기 막기

history.pushState(null, null, location.href);

window.onpopstate = function(event) {

history.go(1);


2. history 첫페이지로 이동

window.history.go(-(window.history.length - 1));

반응형

'JQUERY/JAVASCRIPT' 카테고리의 다른 글

클라이언트에서 image resize 하기  (0) 2018.07.12
History API 주소를 내 마음대로  (0) 2018.01.03
반응형

- HTTP 에서 에러가 발생하면 해당 에러와 관련 에러 코드를 발생한다.


이 많은 에러들을 다 알고 있을 필요는 없지만 이번에는 이 에러 코드를 정리해 해보겠다.


- 주로 많이 발생하는 에러는 404, 500 에러 이다.




 HTTP 

에러코드

 에러 메시지 

100

 Continue 

101 

 Switching Protocols

200

 OK, 에러 없이 전송 성공 

202 

 Accepted, 서버가 클라이언트의 명령을 받음 

203 

 Non-authoritative Information, 서버가 클라이언트 요구 중 일부만 전송함 

204 

 Non Content, 클라이언트 요구를 처리했으나 전송할 데이터가 없음 

205 

 Reset Content 

206 

 Partial Content 

300 

 Multiple Choices, 최근에 옮겨진 데이터를 요청함. 

301 

 Moved Permanently, 요구한 데이터를 변경된 임시 URL에서 찾음 

302 

 Moved Permanently, 요구한 데이터가 변경된 URL에 있음 

303 

 See Other, 요구한 데이터를 변경하지 않았기 때문에 문제가 있음 

304 

 Not modified 

305 

 Use Proxy 

400 

 Bad Request, 요청 실패 - 문법상 오류가 있어서 서버가 요청 사항을 이해하지 못함. 

401.1 

 Unauthorized, 권한 없음 - 접속 실패, 이 에러는 서버에 로그온 하려는 요청 사항이 서버에 들어있는 권한과 비교했을 시 맞지 않을 경우 발생. 이 경우, 요청한 자원에 접근할 수 있는 권한을 부여받기 위해서 서버 운영자에게 요청해야 함. 

401.2 

 Unauthorized, 권한 없음 - 서버 설정으로 인한 접속 실패, 이 에러는 서버에 로그온 하려는 요청사항이 서버에 들어있는 권한과 비교했을 때 맞지 않을 경우 발생. 이것은 일반적으로 적절한 www-authenticate head field를 전송하지 않아서 발생함. 

402.3 

 Unauthorized, 권한 없음 - 자원에 대한 ACL에 기인한 권한 없음. 이 에러는 클라이언트가 특정 자원에 접근할 수 없을 때 발생. 이 자원은 페이지가 될 수도 있고, 클라이언트의 주소 입력란에 명기된 파일일 수도 있다. 또한, 클라이언트가 해당 주소로 접속할 때 이용되는 

또 다른 파일일 수도 있다. 접근할 전체 주소를 다시 확인해 보고 웹 서버 운영자에게 여러분이 자원에 접근할 권한이 있는지를 확인한다. 

401.4 

 Unauthorized, 권한 없음 - 필터에 의한 권한 부여 실패. 이 에러는 웹 서버가 서버에 접속하는 사용자들을 확인하기 위해 설치한 필터 프로그램이 있음을 의미함. 서버에 접속하는데 이용되는 인증 과정이 이런 필터 프로그램에 의해 거부된 것임 

404.5 

 Unauthorized, 권한 없음 - ISA PI/CGI 어플리케이션에 의한 권한 부여 실패. 이 에러는 이용하려는 웹 서버의 어드레스에 ISA PI나 CGI 프로그램이 설치되어 있어 사용자의 권한을 검증함. 서버에 접속하는데 이용되는 인증 과정이 이 프로그램에 의해 거부됨. 

402 

 Payment Required, 예약됨 

403.1 

 Forbidden, 금지 - 수행 접근 금지. 이 에러는 CGI나 ISA-PI, 혹은 수행시키지 못하도록 되어 있는 디렉터리 내의 실행 파일을 수행시키려고 했을 때 발생함. 

403.2

 Forbidden, 금지 - 읽기 접근 금지. 이 에러는 브라우저가 접근한 디렉터리에 가용한 디폴트 페이지가 없을 경우에 발생함. 

403.4 

 Forbidden, 금지 - SSL 필요. 이 에러는 접근하려는 페이지가 SSL로 보안 유지되고 있는 것일 때 발생.

403.5 

 Forbidden, 금지 - SSL 128이 필요. 이 에러는 접근하려는 페이지가 SSL로 보안 유지되고 있는 것일 때 발생. 브라우저가 128비트의 SSL을 지원하는지를 확인해야 함. 

403.6 

 Forbidden, 금지 - IP 주소 거부됨. 이 에러는 서버가 사이트에 접근이 허용되지 않은 IP주소로 사용자가 접근하려 했을 때 발생함. 

403.7 

 Forbidden, 금지 - 클라이언트 확인 필요. 이 에러는 접근하려는 자원이 서버가 인식하기 위해서 브라우저에게 클라이언트 SSL을 요청하는 경우 발생함. 자원을 이용할 수 있는 사용자임을 입증하는데 사용됨. 

403.8 

 Forbidden, 금지 - 사이트 접근 거부. 이 에러는 웹 서버가 요청사항을 수행하고 있지 않거나, 해당 사이트에 접근하는 것을 허락하지 않았을 경우에 발생함. 

403.9 

 Forbidden, 금지 - 연결된 사용자수 과다. 이 에러는 웹 서버가 busy한 상태에 있어서 요청을 수행할 수 없을 경우에 발생함. 

403.10 

 Forbidden, 금지 - 설정이 확실하지 않음. 이 에러는 웹 서버의 설정 부분에 문제가 있을 경우 발생함. 

403.11 

 Forbidden, 금지 - 패스워드 변경. 이 에러는 사용자 인증 단계에서 잘못된 패스워드를 입력했을 경우 발생함. 

403.12 

 Forbidden, 금지 - Mapper 접근 금지. 이 에러는 클라이언트 인증용 맵(map)이 해당 웹 사이트에  접근하는 것을 거부할 경우에 발생. 

404 

 Not Found, 문서를 찾을 수 없음 - 이 에러는 클라이언트가 요청한 문서를 찾지 못한 경우에 발생함. URL을 다시 잘 보고 주소가 올바로 입력되었는지를 확인함. 

405 

 Method not allowed, 메소드 허용 안 됨 - 이 에러는 Request 라인에 명시된 메소드를 수행하기 위한 해당 자원의 이용이 허용되지 않았을 경우에 발생함.

406 

 Not Acceptable, 받아들일 수 없음 - 이 에러는 요청 사항에 필요한 자원은 요청 사항으로 전달된 Accept header에 따라 "Not Acceptable" 내용을 가진 사항이 있을 경우에 발생함. 

407 

 Proxy Authentication Required, Proxy 인증이 필요함 - 이 에러는 해당 요청이 수행되도록 proxy 서버에게 인증을 받아야 할 경우에 발생함.

408 

 Request timeout, 요청 시간이 지남 

409 

 Conflict 

410 

 Gone, 영구적으로 사용할 수 없음. 

411 

 Length Required 

412 

 Precondition Failed, 선결조건 실패 - 이 에러는 Request-header filed에 하나 이상에 선결 조건에 대한 값이 서버에서의 테스트 결과 false로 나왔을 경우에 발생 

413 

 Request entity too large 

414 

 Request-URI too long, 요청한 URI가 너무 김 - 이 에러는 요청한 URI의 길이가 너무 길어서 서버가 요청 사항의 이행을 거부했을 경우 발생

415 

 Unsupported media type 

500 

 Internal Server Error, 서버 내부 오류 - 이 에러는 웹 서버가 요청사항을 수행할 수 없을 경우에 발생함 

501 

 Not Implemented, 적용 안 됨 - 이 에러는 웹 서버가 요청사항을 수행하는데 필요한 기능을 지원하지 않는 경우에 발생 

502 

 Bad gateway, 게이트웨이 상태 나쁨 - 이 에러는 게이트웨이 상태가 나쁘거나 서버의 과부하 상태일 때 발생한다. 

503 

 Service Unavailable, 서비스 불가능 - 이 에러는 서비스가 현재 멈춘 상태 또는 현재 일시적인 과부하 또는 관리 상황일 때 발생될 수 있다. 

504 

 Gateway timeout 

505 

 HTTP Version Not Supported 



출처: http://hyeonstorage.tistory.com/97 [개발이 하고 싶어요]

반응형

+ Recent posts