관리 메뉴

거니의 velog

(7) 보강 4 본문

대덕인재개발원/대덕인재개발원_final project

(7) 보강 4

Unlimited00 2023. 12. 26. 08:29

* Local Storage

* Session Storage

- 브라우저 => 톰캣 => DB(퍼시스턴스 레이어[영구적 저장소])

- 브라우저의 로컬 스토리지를 많이 사용. 저장 공간이 크고, 사용법도 더 좋다. 쿠키는 사용하지 않는 추세. 예전 것을 쓴다면 사용법은 알아두어야 한다.

- 위 스토리지 두개는 사용법이 같으나, 로컬은 직접 삭제해 주어야 하고, 세션은 사이트 빠져나갈 시 자동으로 삭제 된다.

- 문자열만 저장되고, 객체는 저장 불가. 항상 문자열화 해서 저장해야 한다.


* FE(Front Engineer) 백엔드, 디비 거치도 다시 프론트로 온 사람이 가장 돈을 많이 번다. 전체 플로우를 다 알기 때문.

- 사용자 컴퓨터를 사용하므로 서버 유지보수 비용이 많이 절감 됨.


[localStorage.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>
    <script>
      // localStorage에 객체 대이타가 있을 때 수정
      var testObj2 = {
        name: "홍창용",
        age: 30,
      };

      localStorage.setItem("hcy", JSON.stringify(testObj2)); // {"name":"홍창용","age":30}

      // 먼저 꺼내기
      console.log(JSON.parse(localStorage.getItem("hcy"))); // 문자열
      var readHCY = JSON.parse(localStorage.getItem("hcy")); // HDD => Memory로 읽어 들인 것. 메모리 상으로만 바뀜.
      // 수정
      readHCY.age = 25;
      // 문자열 덮어쓰기
      localStorage.setItem("hcy", JSON.stringify(readHCY)); // Memory => HDD로 덮어쓰기. {"name":"홍창용","age":25}

      /*
        // JSON 유틸에는 쪼메 문제가 있는뎅, 요청을 해도 우선순위가 낮다고 안 고쳐줌!
        // 문자열로 할 땐, 바깥쪽 싱글따옴표, key(속성)에도 꼬옥 쌍따옴표를 붙여야 함!
        
        //var testStr = "{name: '시운송', present: '맛난떡'}";
        var testStr = '{"name": "시운송", "present": "맛난떡"}'; // 문자열을 ''로 묶고, key-value 값을 ""을 묶어야 한다.
        var testObj = JSON.parse(testStr);
        console.log(testObj); // Uncaught SyntaxError: Expected property name or '}' in JSON at position 1 (line 1 column 2)
        
        var testStr2 = { name: "시운송", present: "맛난떡" };
        //console.log(testStr2); // {name: '시운송', present: '맛난떡'} // 객체로 잘 선언되기는 함. 문제 없음.
        */

      /*
      // 크롬 기준 사이트별로 약 5MB의 저장용량, cookie는 최대 1KB

      localStorage.이름 = "전 민균"; // localStorage.setItem("이름", "전 민균");
      delete localStorage.이름; // 속성 자체를 삭제

      localStorage.setItem("누구얌?", "지현민"); // 쓰기
      localStorage.setItem("무슨요일", "화요일"); // 쓰기
      //alert("로컬 스토리지에 저장된 값의 개수 : " + localStorage.length); // 저장된 key-value 세트 갯수

      localStorage.setItem("누구얌?", "소현정"); // 누구얌? 을 덮어씀
      //alert(localStorage.getItem("누구얌?")); // 읽기
      localStorage.removeItem("누구얌?"); // 지우기
      //alert(localStorage.key(0)); // 첫번째의 key값 읽어오깅
      //localStorage.clear(); // 전부 지우깅!

      // 제약 사항 -> 머릿 속에 꼬옥 넣어야 함!
      var myStar = {
        group: "에스파",
        fan: "전민균",
      };

      //alert("체킁 : " + myStar); // 체킁 : [object Object]

      //localStorage.setItem("나의스타", myStar); // [object Object]
      localStorage.setItem("나의스타", JSON.stringify(myStar)); // {"group":"에스파","fan":"전민균"}

      var myArr = ["카리나", "윈터", "칼있나?"];
      //localStorage.setItem("에스파", myArr); // 카리나,윈터,칼있나?
      localStorage.setItem("에스파", myArr.toString()); // 카리나,윈터,칼있나?
      //alert("체킁 : " + myArr); // 체킁 : 카리나,윈터,칼있나?
      //localStorage.setItem("에스파", JSON.stringify(myArr)); // ["카리나","윈터","칼있나?"]
       */

      // sessionStorage => localStorage와 사용법이 완전히 같지만,
      //                    사이트르 벗어나면 자동으로 삭제되는 점이 다름.
    </script>
  </body>
</html>

alert 출력 후 삭제된 값을 확인!
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>
    <form action="write_action.html" method="get">
      제목 : <input type="text" name="n_title" value="" required /><br />
      글쓴이 : <input type="text" name="n_writer" value="" required /><br />
      <hr />
      글쓰니스킬<br />
      JS <input type="checkbox" name="n_skill" value="js" />
      JAVA <input type="checkbox" name="n_skill" value="java" />
      SPRING <input type="checkbox" name="n_skill" value="spring" checked />
      CSS <input type="checkbox" name="n_skill" value="css" />
      ORACLE <input type="checkbox" name="n_skill" value="oracle" /><br />
      <hr />
      내용<br /> 
      <textarea name="n_cont" cols="30" rows="10" required></textarea><br />
      <button type="submit">전송</button>
    </form>
    <script></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>DB역할</title>
    </head>
    <body>
        <script>
            // 넘어온 값 처링
            //alert(location.href); // http://localhost:8272/jsstudy/Board/write_action.html?n_title=1234&n_writer=4567&n_skill=java&n_skill=spring&n_cont=123
            var curURL = location.href;
            // 원시타입에서 Wrapper 클래스로의 자동형변환(오토박싱, 오토언박싱)
            // H/W에서 용어가 시작됨. 박스에 작은 손잡이가 있다고 치자. 사장이 사원한데 13.5도로 박스를 밀라고 괴롭힘.
            // 사원이 새로운 아이디어를 가져옴. 조그마한 박스에 거대한 박스를 씌움. 그 안에 미리단위로 눈금을 표시하고 손잡이를 길게 빼 놓음.
            // 그 박스 안에 모터와 버튼을 만들어서 자동으로 움직이게 만듬. 이렇게 씌우는 작업을 Wrapper라고 한다.
            var queryString = curURL.split("?")[1]; // 원시타입에 쩜을 찍는 순간 내부적으로 Wrapper String으로 바뀌어 메소드나 속성을 쓸 수 있음.
            
            // var title = queryString.split("&")[0].split("=")[1]; // n_title=제목
            // console.log("title : " + title); // 일일이 이렇게 언제 다함;;;;

            // 좀더 정갈하고 으미있껭!
            // n_title=1234&n_writer=4567&n_skill=java&n_skill=spring&n_cont=123
            function getParameter(pName){
                var items = queryString.split("&");
                for(var i=0; i<items.length; i++) {
                    //var qName = items[i].split("=")[0]; // n_title
                    //var qValue = items[i].split("=")[1]; // 1234
                    var item = items[i].split("=");
                    if(item[0] == pName) {
                        return item[1];
                    }
                }
                return null; // 요런 코드 처리는 회사내부 합의에 의해서, 여기선 일단 그냥 null로 처리.
            }

            // 함수 동작여부 체킁!
            alert(getParameter("n_title")); // 1234
            alert(getParameter("n_writer")) // 4567
            alert(getParameter("n_cont")); // 123
        </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>DB역할</title>
    </head>
    <body>
        <script>
            // 넘어온 값 처링
            //alert(location.href); // http://localhost:8272/jsstudy/Board/write_action.html?n_title=1234&n_writer=4567&n_skill=java&n_skill=spring&n_cont=123
            var curURL = location.href;
            // 원시타입에서 Wrapper 클래스로의 자동형변환(오토박싱, 오토언박싱)
            // H/W에서 용어가 시작됨. 박스에 작은 손잡이가 있다고 치자. 사장이 사원한데 13.5도로 박스를 밀라고 괴롭힘.
            // 사원이 새로운 아이디어를 가져옴. 조그마한 박스에 거대한 박스를 씌움. 그 안에 미리단위로 눈금을 표시하고 손잡이를 길게 빼 놓음.
            // 그 박스 안에 모터와 버튼을 만들어서 자동으로 움직이게 만듬. 이렇게 씌우는 작업을 Wrapper라고 한다.
            var queryString = curURL.split("?")[1]; // 원시타입에 쩜을 찍는 순간 내부적으로 Wrapper String으로 바뀌어 메소드나 속성을 쓸 수 있음.
            
            // var title = queryString.split("&")[0].split("=")[1]; // n_title=제목
            // console.log("title : " + title); // 일일이 이렇게 언제 다함;;;;

            // 좀더 정갈하고 으미있껭!, 1개만 넘어오는 값
            // n_title=1234&n_writer=4567&n_skill=java&n_skill=spring&n_cont=123
            /*
            function getParameter(pName){
                var items = queryString.split("&");
                for(var i=0; i<items.length; i++) {
                    //var qName = items[i].split("=")[0]; // n_title
                    //var qValue = items[i].split("=")[1]; // 1234
                    var item = items[i].split("=");
                    if(item[0] == pName) {
                        return item[1];
                    }
                }
                return null; // 요런 코드 처리는 회사내부 합의에 의해서, 여기선 일단 그냥 null로 처리.
            }

            // 함수 동작여부 체킁!
            //alert(getParameter("n_title")); // 1234
            //alert(getParameter("n_writer")) // 4567
            //alert(getParameter("n_cont")); // 123
            
            alert(getParameter("n_skill")); // 여러개 넘어오는 n_skill? 맨 앞에 1개만 찍힘.
            */

            // 여러 개 넘어 오는 값
            // n_title=1234&n_writer=4567&n_skill=java&n_skill=spring&n_cont=124123124
            function getParameterValues(pName){
                var schRslt = []; // 찾은 걸 담을 빈 배열
                var items = queryString.split("&");
                for(var i=0; i<items.length; i++) {
                    var item = items[i].split("=");
                    if(item[0] == pName) {
                        schRslt.push(item[1]);
                    }
                }
                if(!schRslt.length) {
                    return null;
                }
                return schRslt;
            }

            //console.log(getParameterValues("n_skill")); // ['java', 'spring']
            //alert(getParameterValues("n_skill")); // java,spring
        </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>DB역할</title>
    </head>
    <body>
        <script>
            // 넘어온 값 처링
            //alert(location.href); // http://localhost:8272/jsstudy/Board/write_action.html?n_title=1234&n_writer=4567&n_skill=java&n_skill=spring&n_cont=123
            var curURL = location.href;
            // 원시타입에서 Wrapper 클래스로의 자동형변환(오토박싱, 오토언박싱)
            // H/W에서 용어가 시작됨. 박스에 작은 손잡이가 있다고 치자. 사장이 사원한데 13.5도로 박스를 밀라고 괴롭힘.
            // 사원이 새로운 아이디어를 가져옴. 조그마한 박스에 거대한 박스를 씌움. 그 안에 미리단위로 눈금을 표시하고 손잡이를 길게 빼 놓음.
            // 그 박스 안에 모터와 버튼을 만들어서 자동으로 움직이게 만듬. 이렇게 씌우는 작업을 Wrapper라고 한다.
            var queryString = curURL.split("?")[1]; // 원시타입에 쩜을 찍는 순간 내부적으로 Wrapper String으로 바뀌어 메소드나 속성을 쓸 수 있음.
            
            // URL 인코딩/디코딩, 일반인에게만 모름, 웹 하는 사람들에겐 보안개념 1도 없음.
            // 인코딩 함수 : escape,     encodeURI,   encodeURIComponent
            // 디코딩 함수 : unescape,   decodeURI,   decodeURIComponent

            // var title = queryString.split("&")[0].split("=")[1]; // n_title=제목
            // console.log("title : " + title); // 일일이 이렇게 언제 다함;;;;

            // 좀더 정갈하고 으미있껭!, 1개만 넘어오는 값
            // n_title=1234&n_writer=4567&n_skill=java&n_skill=spring&n_cont=123
            /*
            function getParameter(pName){
                var items = queryString.split("&");
                for(var i=0; i<items.length; i++) {
                    //var qName = items[i].split("=")[0]; // n_title
                    //var qValue = items[i].split("=")[1]; // 1234
                    var item = items[i].split("=");
                    if(item[0] == pName) {
                        return item[1];
                    }
                }
                return null; // 요런 코드 처리는 회사내부 합의에 의해서, 여기선 일단 그냥 null로 처리.
            }

            // 함수 동작여부 체킁!
            //alert(getParameter("n_title")); // 1234
            //alert(getParameter("n_writer")); // 4567
            //alert(getParameter("n_cont")); // 123
            
            alert(getParameter("n_skill")); // 여러개 넘어오는 n_skill? 맨 앞에 1개만 찍힘.
            */

            // 여러 개 넘어 오는 값
            // n_title=1234&n_writer=4567&n_skill=java&n_skill=spring&n_cont=124123124
            function getParameterValues(pName){
                var schRslt = []; // 찾은 걸 담을 빈 배열
                var items = queryString.split("&");
                for(var i=0; i<items.length; i++) {
                    var item = items[i].split("=");
                    if(item[0] == pName) {
                        schRslt.push(item[1]);
                    }
                }
                if(!schRslt.length) {
                    return null;
                }
                return schRslt;
            }

            //console.log(getParameterValues("n_skill")); // ['java', 'spring']
            alert(getParameterValues("n_skill")); // java,spring
            // n_title=한글제목&n_writer=한글쓴이&n_skill=spring&n_skill=css&n_skill=oracle&n_cont=한글내용으로
            alert(decodeURIComponent(getParameterValues("n_title")));
            alert(decodeURIComponent(getParameterValues("n_writer")));
            alert(decodeURIComponent(getParameterValues("n_cont")));
            //alert(getParameterValues("n_skills")); // null


        </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>DB역할</title>
    </head>
    <body>
        <script>
            // 넘어온 값 처링
            //alert(location.href); // http://localhost:8272/jsstudy/Board/write_action.html?n_title=1234&n_writer=4567&n_skill=java&n_skill=spring&n_cont=123
            var curURL = location.href;
            // 원시타입에서 Wrapper 클래스로의 자동형변환(오토박싱, 오토언박싱)
            // H/W에서 용어가 시작됨. 박스에 작은 손잡이가 있다고 치자. 사장이 사원한데 13.5도로 박스를 밀라고 괴롭힘.
            // 사원이 새로운 아이디어를 가져옴. 조그마한 박스에 거대한 박스를 씌움. 그 안에 미리단위로 눈금을 표시하고 손잡이를 길게 빼 놓음.
            // 그 박스 안에 모터와 버튼을 만들어서 자동으로 움직이게 만듬. 이렇게 씌우는 작업을 Wrapper라고 한다.
            var queryString = curURL.split("?")[1]; // 원시타입에 쩜을 찍는 순간 내부적으로 Wrapper String으로 바뀌어 메소드나 속성을 쓸 수 있음.
            
            // URL 인코딩/디코딩, 일반인에게만 모름, 웹 하는 사람들에겐 보안개념 1도 없음.
            // 인코딩 함수 : escape,     encodeURI,   encodeURIComponent
            // 디코딩 함수 : unescape,   decodeURI,   decodeURIComponent

            // var title = queryString.split("&")[0].split("=")[1]; // n_title=제목
            // console.log("title : " + title); // 일일이 이렇게 언제 다함;;;;

            // 좀더 정갈하고 으미있껭!, 1개만 넘어오는 값
            // n_title=1234&n_writer=4567&n_skill=java&n_skill=spring&n_cont=123
            function getParameter(pName){
                var items = queryString.split("&");
                for(var i=0; i<items.length; i++) {
                    //var qName = items[i].split("=")[0]; // n_title
                    //var qValue = items[i].split("=")[1]; // 1234
                    var item = items[i].split("=");
                    if(item[0] == pName) {
                        return decodeURIComponent(item[1]);
                    }
                }
                return null; // 요런 코드 처리는 회사내부 합의에 의해서, 여기선 일단 그냥 null로 처리.
            }

            // 함수 동작여부 체킁!
            alert(getParameter("n_title")); // 1234
            alert(getParameter("n_writer")); // 4567
            alert(getParameter("n_cont")); // 123
            
            alert(getParameter("n_skill")); // 여러개 넘어오는 n_skill? 맨 앞에 1개만 찍힘.

            // 여러 개 넘어 오는 값
            // n_title=1234&n_writer=4567&n_skill=java&n_skill=spring&n_cont=124123124
            function getParameterValues(pName){
                var schRslt = []; // 찾은 걸 담을 빈 배열
                var items = queryString.split("&");
                for(var i=0; i<items.length; i++) {
                    var item = items[i].split("=");
                    if(item[0] == pName) {
                        schRslt.push(decodeURIComponent(item[1]));
                    }
                }
                if(!schRslt.length) {
                    return null;
                }
                return schRslt;
            }

            //console.log(getParameterValues("n_skill")); // ['java', 'spring']
            alert(getParameterValues("n_skill")); // java,spring
            // n_title=한글제목&n_writer=한글쓴이&n_skill=spring&n_skill=css&n_skill=oracle&n_cont=한글내용으로
            alert(getParameterValues("n_title"));
            alert(getParameterValues("n_writer"));
            alert(getParameterValues("n_cont"));
            //alert(getParameterValues("n_skills")); // null


        </script>
    </body>
</html>

* 함수 안에다가 decodeURIComponent()을 밀어 넣었다.


<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>DB역할</title>
    </head>
    <body>
        <script>
            // 넘어온 값 처링
            //alert(location.href); // http://localhost:8272/jsstudy/Board/write_action.html?n_title=1234&n_writer=4567&n_skill=java&n_skill=spring&n_cont=123
            var curURL = location.href;
            // 원시타입에서 Wrapper 클래스로의 자동형변환(오토박싱, 오토언박싱)
            // H/W에서 용어가 시작됨. 박스에 작은 손잡이가 있다고 치자. 사장이 사원한데 13.5도로 박스를 밀라고 괴롭힘.
            // 사원이 새로운 아이디어를 가져옴. 조그마한 박스에 거대한 박스를 씌움. 그 안에 미리단위로 눈금을 표시하고 손잡이를 길게 빼 놓음.
            // 그 박스 안에 모터와 버튼을 만들어서 자동으로 움직이게 만듬. 이렇게 씌우는 작업을 Wrapper라고 한다.
            var queryString = curURL.split("?")[1]; // 원시타입에 쩜을 찍는 순간 내부적으로 Wrapper String으로 바뀌어 메소드나 속성을 쓸 수 있음.
            
            // URL 인코딩/디코딩, 일반인에게만 모름, 웹 하는 사람들에겐 보안개념 1도 없음.
            // 인코딩 함수 : escape,     encodeURI,   encodeURIComponent
            // 디코딩 함수 : unescape,   decodeURI,   decodeURIComponent

            // var title = queryString.split("&")[0].split("=")[1]; // n_title=제목
            // console.log("title : " + title); // 일일이 이렇게 언제 다함;;;;

            var request = {}; // 네임스페이스를 빈 객체, 사용자요청을 처리할 객체의 의미

            // 좀더 정갈하고 으미있껭!, 1개만 넘어오는 값
            // n_title=1234&n_writer=4567&n_skill=java&n_skill=spring&n_cont=123
            request.getParameter = function(pName){
                var items = queryString.split("&");
                for(var i=0; i<items.length; i++) {
                    //var qName = items[i].split("=")[0]; // n_title
                    //var qValue = items[i].split("=")[1]; // 1234
                    var item = items[i].split("=");
                    if(item[0] == pName) {
                        return decodeURIComponent(item[1]);
                    }
                }
                return null; // 요런 코드 처리는 회사내부 합의에 의해서, 여기선 일단 그냥 null로 처리.
            }

            // 함수 동작여부 체킁!
            alert(request.getParameter("n_title")); // 1234
            alert(request.getParameter("n_writer")); // 4567
            alert(request.getParameter("n_cont")); // 123
            
            alert(request.getParameter("n_skill")); // 여러개 넘어오는 n_skill? 맨 앞에 1개만 찍힘.

            // 여러 개 넘어 오는 값
            // n_title=1234&n_writer=4567&n_skill=java&n_skill=spring&n_cont=124123124
            request.getParameterValues = function(pName){
                var schRslt = []; // 찾은 걸 담을 빈 배열
                var items = queryString.split("&");
                for(var i=0; i<items.length; i++) {
                    var item = items[i].split("=");
                    if(item[0] == pName) {
                        schRslt.push(decodeURIComponent(item[1]));
                    }
                }
                if(!schRslt.length) {
                    return null;
                }
                return schRslt;
            }

            //console.log(getParameterValues("n_skill")); // ['java', 'spring']
            alert(request.getParameterValues("n_skill")); // java,spring
            // n_title=한글제목&n_writer=한글쓴이&n_skill=spring&n_skill=css&n_skill=oracle&n_cont=한글내용으로
            alert(request.getParameterValues("n_title"));
            alert(request.getParameterValues("n_writer"));
            alert(request.getParameterValues("n_cont"));
            //alert(getParameterValues("n_skills")); // null


        </script>
    </body>
</html>

* 자바의 request 객체에 getParameter(), getParameterValues()를 구현해 본 것이다.


[JS 모듈 만들기]

// 공통으로 쓸 함수를 모으깅 보통 util.js

// URL 인코딩/디코딩, 일반인에게만 모름, 웹 하는 사람들에겐 보안개념 1도 없음.
// 인코딩 함수 : escape,     encodeURI,   encodeURIComponent
// 디코딩 함수 : unescape,   decodeURI,   decodeURIComponent

// var title = queryString.split("&")[0].split("=")[1]; // n_title=제목
// console.log("title : " + title); // 일일이 이렇게 언제 다함;;;;

var request = {}; // 네임스페이스를 빈 객체, 사용자요청을 처리할 객체의 의미

// 좀더 정갈하고 으미있껭!, 1개만 넘어오는 값
// n_title=1234&n_writer=4567&n_skill=java&n_skill=spring&n_cont=123
request.getParameter = function(pName){
    var items = queryString.split("&");
    for(var i=0; i<items.length; i++) {
        //var qName = items[i].split("=")[0]; // n_title
        //var qValue = items[i].split("=")[1]; // 1234
        var item = items[i].split("=");
        if(item[0] == pName) {
            return decodeURIComponent(item[1]);
        }
    }
    return null; // 요런 코드 처리는 회사내부 합의에 의해서, 여기선 일단 그냥 null로 처리.
}

// 여러 개 넘어 오는 값
// n_title=1234&n_writer=4567&n_skill=java&n_skill=spring&n_cont=124123124
request.getParameterValues = function(pName){
    var schRslt = []; // 찾은 걸 담을 빈 배열
    var items = queryString.split("&");
    for(var i=0; i<items.length; i++) {
        var item = items[i].split("=");
        if(item[0] == pName) {
            schRslt.push(decodeURIComponent(item[1]));
        }
    }
    if(!schRslt.length) {
        return null;
    }
    return schRslt;
}
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>DB역할</title>
        <script src="./jsp.js"></script>
    </head>
    <body>
        <script>

            // 넘어온 값 처링
            //alert(location.href); // http://localhost:8272/jsstudy/Board/write_action.html?n_title=1234&n_writer=4567&n_skill=java&n_skill=spring&n_cont=123
            var curURL = location.href;
            // 원시타입에서 Wrapper 클래스로의 자동형변환(오토박싱, 오토언박싱)
            // H/W에서 용어가 시작됨. 박스에 작은 손잡이가 있다고 치자. 사장이 사원한데 13.5도로 박스를 밀라고 괴롭힘.
            // 사원이 새로운 아이디어를 가져옴. 조그마한 박스에 거대한 박스를 씌움. 그 안에 미리단위로 눈금을 표시하고 손잡이를 길게 빼 놓음.
            // 그 박스 안에 모터와 버튼을 만들어서 자동으로 움직이게 만듬. 이렇게 씌우는 작업을 Wrapper라고 한다.
            var queryString = curURL.split("?")[1]; // 원시타입에 쩜을 찍는 순간 내부적으로 Wrapper String으로 바뀌어 메소드나 속성을 쓸 수 있음.

            var tblName = "myGesi"; // 로컬스토리지 키 값, 테이블 저장형태는 배열이 되어야 함.
            var datas = localStorage.getItem(tblName);
            var pid = 1; // 디폴트값 1
            if(!datas) { // 데이터가 아예 없는 경우, 첫 글이 저장되는 경우이다.
                datas = []; // 빈 배열
            }else {
                datas = JSON.parse(datas); // 배열 문자열을 실제 배열로
                pid = datas[datas.length-1].pid + 1;
            }

            var title = request.getParameter("n_title");
            var writer = request.getParameter("n_writer");
            var skills = request.getParameterValues("n_skill");
            var cont = request.getParameter("n_cont");

            // 빅데이터는 객체형 DB를 쓰고, 일반 업무나 깐깐하고 엄격한 규칙이 적용되어야 하는 업무는 관계형 DB를 적용하도록 나뉨.
            
            // 넘어온 내용을 덩어리(객체)로 맹글깅
            /*
            var newGul = {
                title : title,
                writer : writer,
                skills : skills,
                cont : cont 
            };
            */
            // primaey-key 부여. 테이블 풀스캔으로 하지 않고, 인덱스 스캔으로 검색 속도를 향싱시키기 위함이다.
            var newGul = {
                pid,
                title, // key 값과 key에 할당할 값의 변수명이 동일할 때 생략가능
                writer,
                skills,
                cont
            };
            console.log("누느로 체킁 : ", newGul); // {title: '한글제목', writer: '한글쓴이', skills: Array(3), cont: '한글내용으로+다른+글자'}

            datas.push(newGul); // 배열에 추가
            // 로컬스토리지에 문자열화(시리얼라이즈)해서 저장
            localStorage.setItem(tblName, JSON.stringify(datas));

            alert("그리 그리 잘 저장되었어용"); // 사용자를 위해 억지 메시지 한개

            location.href = "list.html"; // 리스트 페이지로 이동, 브라우저 캐시를 허용하여 이용할 수도 있음.
            //location.replace("list.html"); // 리스트 페이지로 이동, 꼭 서버에 새로 요청을 보냄!

        </script>
    </body>
</html>


<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>리스트 페이지</title>
    </head>
    <body>
        <h1>못생긴 게시판</h1>
        <div id="list"></div>
        <script>
            function f_over(pThis){
                pThis.style.backgroundColor = "pink";
            }
            function f_out(pThis){
                pThis.style.backgroundColor = "white";
            }
            const myList = document.querySelector("#list");
            const tblName = "myGesi";
            var gulList = JSON.parse(localStorage.getItem(tblName));
            // Master-Detail-Pattern
            var tblStr = `<table border="1">`;
                tblStr += `<tr>
                                <th>PID</th>
                                <th>제목</th>
                                <th>글쓴이</th>
                                <th>스킬</th>
                            </tr>`;
            for(var i=0; i<gulList.length; i++) {
                var gul = gulList[i];
                tblStr += `<tr onmouseover="f_over(this)" onmouseout="f_out(this)">
                                <td>${gul.pid}</td>
                                <td>${gul.title}</td>
                                <td>${gul.writer}</td>
                                <td>${gul.skills}</td>
                           </tr>`;
            }
            tblStr += `</table>`;
            tblStr += `<a href="write.html">글쓰깅</a>`; // 글쓰기로 가는 a 링크 괜히 넣깅
            myList.innerHTML = tblStr;
        </script>
    </body>
</html>

'대덕인재개발원 > 대덕인재개발원_final project' 카테고리의 다른 글

(9) 보강 6  (0) 2023.12.28
(8) 보강 5  (0) 2023.12.27
(6) 토요일 수업 1  (0) 2023.12.23
(5) 보강 3  (0) 2023.12.22
(4) 보강 2  (0) 2023.12.21