🔷 키 / 값 쌍으로 값을 저장
🔷 SessionStorage
: 각각의 출처에 대해 독립적인 저장 공간을 페이지 세션이 유지되는 동안(브라우저가 열려있는 동안) 제공
🔷 localStorage
: 세션과 다르게 브라우저를 닫았다 열어도 데이터가 남아있다.
🔷 Storage 속성
length
: 객체에 저장된 데이터 항목의 수를 반환🔷 Storage 메서드
key(index)
: index 번째의 키를 반환getItem(key)
: key에 해당하는 값 반환setItem(key, value)
: key가 존재하는 경우 재설정, 존재하지 않는 경우 추가removeItem(key)
: key를 저장소에서 제거clear()
: 모든 키를 저장소에서 제거<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>로컬스토리지 실습</title>
</head>
<body>
<h1>로컬스토리지</h1>
<input type="text" id="input" placeholder="내용 입력"/>
<button id="create">등록</button>
<button id="read">조회</button>
<button id="delete">삭제</button>
<hr>
<h2>내용</h2>
<div id ="save">
</div>
<script>
window.addEventListener("load", () => {
let data = localStorage.getItem("JSON data")
if(data != null) {
document.querySelector("#save").innerText = JSON.parse(data);
}
});
</script>
<script>
//등록
let createBtn = document.querySelector("#create")
createBtn.addEventListener("click", function() {
let $inputTag = document.querySelector("#input");
console.log($inputTag.value);
//데이터 저장을 위한 로컬 스토리지
//(String, String), input 데이터가 문자열이라 그대로 사용 가능
//localStorage.setItem("data", $inputTag.value);
//객체를 문자열로 만들어 넣고 싶다면?
let jsonData = JSON.stringify($inputTag.value);
localStorage.setItem("JSON data", jsonData);
$inputTag.value = "";
});
//조회
document.querySelector("#read").addEventListener("click", () => {
let $saveTag = document.querySelector("#save");
//데이터 찾기
//찾고자하는 key가 없으면 null이 반환
let $jsonData = localStorage.getItem("JSON data");
if($jsonData != null) {
let data = JSON.parse($jsonData);
$saveTag.innerText = data;
}
});
//삭제
document.querySelector("#delete").addEventListener("click", () => {
localStorage.removeItem("JSON data")
document.querySelector("#save").innerText = "";
});
</script>
</body>
</html>
기본 화면
데이터 추가
데이터 조회
로컬 저장소에 저장된 데이터는 새로 고침을 해도 데이터가 남는다!
데이터 삭제
🔷 JavaScript는 Single thread!
🔷 AJAX (Asynchronous JavaScript and XML)
💡 동기식은 서버에서 요청한 데이터가 도착할 때까지 클라이언트가 대기하지만 비동기식은 서버에 요청한 데이터가 도착할 동안 클라이언트가 멈추지 않고 동작한다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
console.log('hi');
setTimeout(() => {
console.log("대기 완료");
}, 3000)
console.log("bye");
setInterval(() => {
let bgColor = document.body.style.background;
if(bgColor == "red")
document.body.style.background = "yellow"
else
document.body.style.background = "red"
}, 100)
</script>
</body>
</html>
**현란하게 번쩍이는 노랑 빨강 불빛을 보다보면 콘솔에는 3초 뒤에 "대기 완료"가 뜬다.
🔷 순차적인 비동기 처리하기
1. Async Callbacks
addEventListener()
의 두 번째 인자2. Promise-Style
Modern Web APIs
에서의 새로운 코드 스타일XMLHttpRequest
객체를 사용하는 구조보다 조금 더 현대적인 버전🔷 XMLHttpRequest 객체
1.open(“HTTP method”, “URL”, sync/async)
2. send(content)
1. onreadystatechange
2. readyState
UNSENT
(객체 생성 후 open 메서드 호출 전)OPEND
(open 메서드가 호출되고 send 호출 전)HEADERS_RECEIVED
(send 메서드가 호출되었지만 서버 응답 전, 헤더와 상태 확인 가능)LOADING
(다운로드 중, 데이터의 일부가 전송된 상태)DONE
(모든 데이터 전송 완료)3. status
OK
(요청 성공Not Found
(페이지를 못 찾을 경우Server Error
(서버에서 결과 생성시 오류 발생)4. responseText
5.responseXML
💡 실습에는 JSON placeholder를 사용한다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
const URL = "https://jsonplaceholder.typicode.com/todos/1"
//AJAX 통신
const xhr = new XMLHttpRequest();
//xhr을 통해 서버에 요청 보내기
xhr.open('GET', URL); //초기화
xhr.send();
const todo = xhr.response;
console.log(todo);
</script>
</body>
</html>
싱글 스레드 특성상 todo에는 응답이 돌아오지 않아 저장된 것이 없고, 콘솔에 response를 직접 찍으면 나온다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
const URL = "https://jsonplaceholder.typicode.com/todos/1"
//AJAX 통신
const xhr = new XMLHttpRequest();
//xhr을 통해 서버에 요청 보내기
xhr.open('GET', URL); //초기화
xhr.send();
//해당 속성은 상태가 바뀔 때 마다 수행할 콜백메서드를 지정한다.
xhr.onreadystatechange = () => {
if(xhr.readyState == 4/*xhr.DONE*/) {
if(xhr.status == 200) {
const todo = xhr.response;
console.log(todo);
}
}
}
</script>
</body>
</html>
이제는 정상적으로 찍힌다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h2>서버에 요청 보내고 받아서 화면 출력</h2>
<div id = "view"></div>
<button id="submit">요청</button>
<script>
let xhr;
//클라이언트에서 요청이 발생한다.
document.querySelector("#submit").addEventListener('click', () => {
//xhr 객체 생성
xhr = new XMLHttpRequest();
xhr.onreadystatechange = responseMsg;
//xhr객체 초기화(URL 입력, 메소드 방식 설정)
//true는 비동기 방식의 여부
xhr.open('GET', './data/hello.txt', true);
//요청 보내기
xhr.send();
})
//AJAX 요청에 대한 응답이 왔을 때 사용할 콜백함수
function responseMsg() {
//응답 종료 시
if(xhr.readyState == 4) {
//서버에서 오류 없이 정상적으로 처리가 되었을 때
if(xhr.status == 200) {
document.querySelector("#view").innerHTML = xhr.response;
} else {
console.log("데이터 받기 실패!")
}
}
}
</script>
</body>
</html>
이런 식으로 응용할 수도 있다.
👍 그 외 JavaScript를 이용한 비동기 제어 관련하여 포스팅을 많이 해두었으니 이를 참고하길 바란다. JS 시리즈
한 때 프론트엔드가 꿈이었던 내가 조금씩 백엔드로 마음을 돌리게 한 것 중의 하나가 비동기 개념이었는데, 뭐 다시 보니 쉬운 것 같기도 하고...