쿠키 프로젝트 코드 리뷰

DEOKJIN JEONG·2023년 3월 24일
0

// 📚 '시간만료' 되면 > '팝업' 뜨게 하기 


// 🟦 전역변수 

// 팝업 오른쪽 상단의 x 자 표시
let popupBtn = document.querySelector(".popup-btn");

// '클릭' 이라고 쓰여져 있는 버튼
let popupEvent = document.querySelector('.event-btn');

// 이건, 밑에 부분(setTime 하는 부분) 과 연결 된다.  
let popupCookie = getCookie("event-popup");




// ------------ 📚 팝업 관련 -----------------

// 🟦 popup warp 을 'open'하는 '팝업 함수' 

    // 1. 선언
    function popupOpen() {
            let popup = document.querySelector('.popup-wrap');

            if (popup.classList.contains("is-on")) {
                popup.classList.remove("is-on");
            } else {
                popup.classList.add("is-on");
            }
        }

    // 2. 실행  
    popupBtn.addEventListener("click", popupOpen);



// -----------📚 버튼 누르면 > 쿠키를 만들고 > 변수에 담는과정 요약 
                // 이 과정의 output으로 1) 'event-popup' 이라는 이름의 쿠키가 만들어지고 
                // 2) 해당 쿠키는 popupCookie 에 담김 

// 🟦 클릭 이벤트 리스너로 > 1) '쿠키' 만들고 2) 만들어진 쿠키 데이터를 가져와서 '유형' 확인하기
        // 이 과정에 쓰이기 위해 1) getCookie 함수 2) setCookie 함수 3) getCookieTime 함수가 정의됨. 

    // 1. '쿠키 설정 버튼' 누르면 > '쿠키가 생성' 된다. 
    popupEvent.addEventListener("click", function() {

        console.log('이벤트 발생! : 자~ 쿠키 셋팅하자~💨');

        // 대략 7초? 동안 유지되는 쿠키 생성 ⭐⭐⭐ 
        setCookie("event-popup" , true, 10)
            // 이 쿠키의 이름이 event-popup 인가?❓❓❓❓❓ 
    })

    // 2. 만들어진 쿠키의 데이터 유형 확인 
    console.log(typeof getCookie("event-popup"))
        
        // [잠깐!]
            // get cookie 랑 set cookie 만들고 다시 오자 📛📛📛📛📛 

        // [시사점]
                // 1. 쿠키, 로컬 스토리지의 경우, '문자' 로 저장된다. 
                // 2. 코딩을 하면서, 데이터를 저장할 때, '문자열' 로 저장된다. 



// 🟦 get cookie 함수 : 만들어진 쿠키의 이름을 넣으면 > 문자열❓ 을 반환? ❓❓ (복붙한거라 음... )

    // [참고]
        // 수업 때, 이 부분은, 구글에서 복붙해 왔음. 

    function getCookie(c_name)
    {
        var i,x,y,ARRcookies=document.cookie.split(";");
        for (i=0;i<ARRcookies.length;i++)
        {
            x=ARRcookies[i].substr(0,ARRcookies[i].indexOf("="));
            y=ARRcookies[i].substr(ARRcookies[i].indexOf("=")+1);
            x=x.replace(/^\s+|\s+$/g,"");
            if (x==c_name)
            {
            return unescape(y);
            }
        }
    }



// 🟦 set cookie 함수 : 이름, 값, 시간을 input 하면 > 1차 쿠키가 '시간 객체로 변환' 되고 > 최종적으로 ⭐'시간 객체를 value로 가진 쿠키 데이터'⭐ 가 output 됨. 
    function setCookie (c_name, value, time) {

        // 1️⃣ [1차 쿠키 만들어서 > '시간 객체' 로 만들기]
            // 1. Date constructor로 '현재 시간' '객체화' 해서 > date 변수에 담기
            let date = new Date();
                console.log(date)
                    // [결과물] Fri Mar 24 2023 16:50:18 GMT+0900 (한국 표준시)
                console.log(date.getTime())
                    // [결과물] 1679644437528 
                        // '밀리세컨즈' 가 나옴 ⭐⭐ 
                console.log(date.getTime() + (5 * 1000));
                        // [밀리세컨즈 계산]
                            // time = time + 1000; //1초 후
                            // 위의 예시는 '5초' 후! 를 밀리세컨즈로 표현한 것 ⭐⭐⭐ 
            

            // 2. 'time초' 후의 시간을, 해당 쿠키의 유효기간으로 설정
            date.setTime(date.getTime() + time * 1000);


            // 3. 쿠키 형식에 맞게, 매개변수를 배치하고 > ⭐쿠키를 만든다.⭐ > 쿠키는 문자열 타입이니까 > str 변수에 넣기 
            let str = c_name + "=" + value + ";expires=" + date.toUTCString() + ";path=/";

                // [str로 나오는 값 확인]
                    console.log(str)
                        // event-popup=true;expires=Fri, 24 Mar 2023 08:40:59 GMT;path=/
                        // 1) 실제로 '빈공간' 이 있고, ⭐
                        // 2) ; 을 기준으로 '만료 날짜', '경로' 정보가 있음. ⭐

            
            // 4. 해당 배열에서 > '시간 객체' 를 반환 받는다. 
            let str2 = getCookieTime(str);
                // [결과물] '쿠키 문자열' 을 split 등 하여 > 'time 객체' 로 return 
                    // [질문] time 객체 란? 


        // 2️⃣ 최종 쿠키 만들기 
            // 1. 3개의 input 을 받아 만든 1차 쿠키는 > 시간 객체로써 '최종 쿠키의 value' 에 들어간다. 
            document.cookie = c_name + "=" + `{ "value" : "${value}" , "time" : "${str2}"}` + ";expires=" + date.toUTCString() + ";path=/"
                // [질문]
                    // 이게, '쿠키' 를 만들어주는 식? 
                    // value 부분에, '`{ "value" : "${value}" , "time" : "${str2}"}`' 이렇게 들어가는거야? 
                    // 그럼, 이 부분이 '쿠키 데이터의 value' 가 되는거야? 왜? ❓❓❓❓❓ 
                    // value 에 st2 에 표현된 '시간 객체' 를 어디에 쓰지❓❓❓❓❓ 

            // document.cookie = c_name + "=" + `{ "value" : "${value}" , "time" : "${str2}"}` + ";expires=" + date.toUTCString() + ";path=/"

        // ❓ 이건 필요없는거 아닌가? 
            let value2 = getCookie("event-popup");
                // 이건 위에서 이미, event-popup 만든거고
            console.log(JSON.parse(value2));
        }
            // [set cookie 함수 매개변수 해석]
                    // c_name : 쿠키의 이름 
                    // value : 해당 쿠키에 넣을 값 
                    // time : 해당 쿠키가 유지되는 시간



// 🟦  '쿠키 문자열' 을 > 'time 객체' 로 만들기 
    function getCookieTime(cookie) {
        // 0. [input 데이터 예시]
            // event-popup=true;expires=Fri, 24 Mar 2023 08:40:59 GMT;path=/

        // 1. input cookie 데이터를 ',' 기준으로 > ⭐'배열'⭐ 로 변환 
        let str = cookie.split(';');
            // [해석] 
                // ; 를 기준으로 split 하면 > '문자열' 을 ⭐'배열'⭐ 로 저장해줌. 
                // ; 을 기준으로 한 이유는 expires를 뽑아내려고 ⭐⭐⭐⭐⭐ 
        
        // 2. ⭐'배열'⭐ 중에서 '판별함수' 를 만족하는 요소 중 '첫번째 값' 을 return
            // '판별 함수' 니까 > true, false 를 반환해야함! 
            // find 메소드에 의해 '배열' 중 '첫 번째 true 값' 이 return 됨. 
        
        let str2 = str.find(function(i) {
            
            let temp = i.trim();
            return temp.startsWith('expires=');

            // [해석]
                // 1) find 을 쓰면 > ' find() 메서드는 주어진 '판별 함수'를 '만족'하는 '첫 번째 요소의 값'을 반환'

                // 2) 배열이 들어온 상태에서 > trim 을 쓰면 > 배열 안에 있는 문자열에서, '좌우 공백' 을 제거 > '공백 제거된 배열' 을 output
                    // 쓴 이유는 '좌우 공백들이 있어서' 는 내 추측
                    // 실제로 'input 되는 cookie 데이터' 에 '좌우 공백' 이 있나? 확인 필요 ⭐⭐ 
                    // 응! '공백' 있어! 그걸 지울거야!
            
                // 3) `startsWith 메서드' 를 썼으므로,  '공백 제거된 배열' 중 '특정 문자'로 '시작'하는지 확인 > 'output'을 'true 혹은 false' 로 반환
                    // 따라서, ' ; 기준으로 나뉜 배열' 중 'expires=Fri, 24 Mar 2023 08:40:59 GMT'  배열에서 true 가 나오고 > 반환됨. 

                // 4) 결국, output 은 ⭐⭐'expires=Fri, 24 Mar 2023 08:40:59 GMT' 이게 > str2 로 들어가나❓❓❓ 
        })
        console.log("👍👍 이건 str2 : " + str2  )    

        // 3. 만약, str2 값이 있으면 > trim 해서 빈 공간을 없애고 > new date() 생성자 함수의 input 으로 넣어서 > 객체를 만든다. 
        
        if (str2) {
            let str3 = str2.trim()
            console.log(`이건 str3 : ${str3}`)

            return new Date(str3)
        } else {
            return null
        }
            // [해석]
                // str2 에 어떤 값이 있느냐에 따라서 > new date 생성자 함수가 무엇을 객체로 만들었는지 알 수 있음. (역 추정도 물론 가능) 
            // [궁금증]
                // 과연 str2 에 들어가는 값의 형태는 무엇 인가 ❓❓❓ ⭐⭐⭐ 
                // 이걸 확인해보자

    }




// ---------- 📚 위에서 만들어진 변수를 받아 > 시간 표시 


let setTime = setInterval(() => {
    
}, 1000);
    // [해석]
        // // 비동기 함수 setTimeout이 함수는 매개변수로 전달한 시간이후에 실행되는 함수.
            // setTimeout(() => {
            //     // 1초뒤에 실행
            // }, 1000);

    
profile
으랏찻차

0개의 댓글