js

localStorage

chantleman 2024. 10. 23. 14:42

 

웹 애플리케이션에서 사용자 상태 관리하는 두가지 방법

 

1. server session :   서버에 사용자 데이터 저장. 서버 측에서 관리하므로 보안성이 높음. 중요한 정보는 서버에만 저장되므로 클라이언트 측에서 노출되지 않는다.  세션 타임아웃 설정에 따라 일정 시간이 지나면 세션이 만료됨


2. browser session : 클라이언트의 브라우저에 저장되며(쿠키, 세션 스토리지), 클라이언트 측에 데이터가 저장되므로 보안에 취약할 수 있음

 

browser session에는 LocalStorage와 SessionStorage가 있당

- Local Storage(영구저장소) : 한번 저장하면 지우는 명령을 하지 않으면 계속 남아있음
- Session Storage(임시저장소) : 브라우저에 접속하는 동안에만 저장돼있음. 사이트 나가면 사라짐

 

 

 

storage와 cookie는 비슷하지만 다르당!

쿠키를 설정하면 웹 요청할 때마다 서버로 쿠키정보를 포함하여 전송하게 되는데

web storage는 저장된 데이터가 클라이언트에 존재하고, 서버로의 전송이 이루어지지 않아 네트워크 트래픽을 줄일 수 있당

 

세션은 서버에 저장되는 쿠키로, 주로 중요한 데이터를 저장할 때 사용한당(쿠키는 보안성이 낮음)

캐시는 이미지, 웹문서 등 리소스 파일들의 임시 저장소로 보통 HTTP 헤더에 따라 자동으로 관리된당. 같은 웹 페이지에 접속할 때 사용자의 pc에서 로드하므로 서버를 거치지 않아도 된당 (서버 부하 방지. 페이지 로딩 속도 개선)





쓰기 setItem

 

 

<!DOCTYPE html>
<meta charset='UTF-8'>
<script>
    localStorage.setItem("BF1","육수민");
    localStorage.setItem("BF2","강유정");
    localStorage.setItem("BF3","박진우");
</script>

 

 

 

 

value 값을 수정하고싶을때는

같은 키값을 주면 값을 덮어씌우게 됨

 

 

localStorage.setItem("BF3","박승민");

 

 

 

.

 

 


읽기 getItem

 

 

localStorage는 한번 쓰면 지우기 전에는 안 지워짐

alert(localStorage.getItem("BF2"));

 

 

 

 

 

 

 


삭제 removeItem, clear

 

 

localStorage.removeItem("BF3");

 

 

 

 

 

전체 삭제

localStorage.clear();

 

 

 

 

 


두번째 방법

 

쓰기

localStorage.bpName = "양미강";

 

 

 

 

 


 

 

삭제

delete localStorage.bpName;

 

 


 

 

localStorage는 객체를 직접 저장할 수 없음

오직 문자열로만 저장 가능

 

<!DOCTYPE html>
<meta charset='UTF-8'>
<script>
    localStorage.setItem("ymg",{name:"양미강", nickName:"자바스크립트 천재"});
</script>

 

 

 

 

 

toString 먹어서 Object로 들어감

 

 

 

JSON.stringify를 이용하여 객체를 문자열로 바꿔야됨(직렬화)

localStorage.setItem("ymg",JSON.stringify({name:"양미강", nickName:"자바스크립트 천재"}));

 

 

 

제대로 들어옴

 

 

 

let ymg = localStorage.getItem("ymg");
alert(ymg.nickName);

 

를 실행하면 undefined가 alert됨

문자열로 저장했기 때문에 꺼낼때도 문자열로 꺼냄 (문자열에 nickName이라는 메소드가 없기때문에 undefined가 뜸)

따라서 객체로 변환(역직렬화)한 후 꺼내야함

let ymg = JSON.parse(localStorage.getItem("ymg"));

 

 

 

 


 

<!DOCTYPE html>
<meta charset='UTF-8'>
<button onclick="fTest1()">눌러방1</button>
<button onclick="fTest2()">눌러방2</button>

<script>
    const myFriends = [
        {name:"광제", nickName : "감자"},
        {name:"윤호", nickName : "유노윤호"},
        {name:"민수", nickName : "외면"},
        {name:"미강", nickName : "마강"},
        {name:"지영", nickName : "자천"}
    ];

    localStorage.setItem("friends", JSON.stringify(myFriends));
</script>

 

 

 	function fTest1(){
        // 민수 안보이게      
        let fr = JSON.parse(localStorage.getItem("friends"));

        for(let i=0; i<fr.length; i++){
            if(fr[i].name =="민수"){
                fr.splice(i,1);
                break;
                }
            }

       localStorage.setItem("friends",JSON.stringify(fr));      
    }

    function fTest2(){
        //광제 nickName이 백만장자로 바뀌게
        let fr = JSON.parse(localStorage.getItem("friends"));

        fr.array.forEach(fr => {
            if(fr.name=="광제"){
                fr.nickName='백만장자';
            }
        });
        localStorage.setItem("friends", JSON.stringify(fr));
    }

 

첫번째 버튼 누르면 '민수'가 사라지고

 

 

두번째 버튼 누르면 '광제'의 nickName이 백만장자로 변함

 

 

 


예제

 

write.html

<hide/>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>꽝 보드 글쓰기</h1>
    <form action="write_action.html" method="get">
        제목 <input type="text" autofocus name="title" id="" required><br>
        글쓰니 <input type="text" name="writer" id="" required><br>
        글쓰니 스킬 <br>
        <hr>
        자바스크립트<input type="checkbox" name="skills" id="" value="js" checked>
        자바<input type="checkbox" name="skills" id="" value="java">
        리액트<input type="checkbox" name="skills" id="" value="react">
        오라클<input type="checkbox" name="skills" id="" value="oracle">
        내용<br>
        <textarea name="content" id="" cols="40" rows="10"></textarea> <br>
        <input type="submit" value="등록">
        <input type="reset" value="다시 쓰기">
    </form>
</body>
</html>

 

 

jcSuccess.js

<hide/>
//억지로 네임스페이스 부여
const request = {}; 

let queryString = decodeURIComponent(location.href.split('?')[1]);

//1개의 값만 나옴
request.getParam = function(pKey) {
    let params = queryString.split("&");
    for (let i = 0; i < params.length; i++) {
        let keyValue = params[i].split("=");
        if (keyValue[0] == pKey) {
            return keyValue[1];
        }
    }
}


//같은 이름으로 여러값이 넘어올때
request.getParamValues = function(pKey) {
    let params = queryString.split("&");
    let valArr = [];

    for (let i = 0; i < params.length; i++) {
        let keyValue = params[i].split("=");
        if (keyValue[0] == pKey) {
            valArr.push(keyValue[1]);
        }
    }
    if (!valArr.length) { //skills 체크 안했을때
        return null;
    }
    return valArr;
}

 

 

<hide/>
<script src="./jcSuccess.js"></script>
<script>
    //값을 뽑아서 
    let title = request.getParam("title");
    let writer = request.getParam("writer");
    let content = request.getParam("content");
    let skills = request.getParamValues("skills");

    // 위 내용을 한 덩어리로
    let gul = {
        pid: Math.random().toString(36).substring(2,5), //검색 효율을 위해 pk 추가. 랜덤값을 36진수해서 인덱스 2~4까지 두글자
        title, //원래는 title:title로 해야하는데 키값과 변수명이 같으면 생략 가능. 
        writer,
        content,
        skills
    }
    console.log("체킁", gul);

    //앞으로 글을 누적해서 저장해야 하므로 배열도 필요
    const bdKey = "bdTable";
    let chk = localStorage.getItem(bdKey);
    let gulArr = []; //빈배열
    if(chk){ //null이 아니라면. 이미 쓰여진 글이 있따면
        gulArr = JSON.parse(chk);   //읽어온 걸 객체화
    }
    gulArr.push(gul); //배열에 글 추가

    alert(chk);
    
    localStorage.setItem(bdKey, JSON.stringify(gulArr));

    alert("글이 잘 등록되었어용 그렇티용");

    location.href="list.html";          //브라우저가 갖고있는 캐시를 계속 보여줄수있음
    //location.replace("list.html");    //캐시를 서버에 다시 달라고함. 서버쪽 DB 변환이 있으면 이걸 쓰는게 맞음
</script>

 

 

글 등록할때마다 local storage에 계속 추가되는 것 확인

'js' 카테고리의 다른 글

볼튕기기  (0) 2024.10.17
react, vite  (0) 2024.10.11
복사와 참조  (0) 2024.10.11
node 설치  (4) 2024.10.11
ajax로 데이터 송수신  (0) 2024.10.03