FrontEnd

FrontEnd 개발 관련 내용정리 (개인)

Dean83 2022. 3. 24. 22:41


* 참조 사이트
    - 웹사이트 처음부터 자세히 설명한 사이트
       - https://developer.mozilla.org/ko/docs/Learn/Getting_started_with_the_web#%EA%B0%99%EC%9D%B4_%EB%B3%B4%EA%B8%B0
       - 자바 스크립트 등 코딩시 바로 확인할 수 있는 사이트
       - https://jsfiddle.net/
       - HTML 태그 설명
       - https://ofcourse.kr/html-course/HTML-%EC%9E%85%EB%AC%B8

1. FrontEnd
     1.1. 로컬 http 서버 (BackEnd 이나, 테스트 로컬서버라서 여기에 명시)
             1.1.1. python을 이용한 로컬 서버 열기
                          - python 설치 : https://www.python.org/ 이동 -> download 에서 알맞은 설치파일로 설치 (설치시 환경변수인 path 설정 확인)
                          - cmd창 -> index.html 등, html이 있는 폴더로 이동
                          - python -m http.server 포트번호 입력시 해당 포트번호로 서버를 열게됨
                          - 브라우저에서, localhost:포트번호 입력시 index.html을 불러오게 됨

       1.2. HTML
             - 태그로 구성된 웹페이지를 작성하는 기본 코드
                 - header 태그에는 사용자에게 보여주지 않고, 모든 컨텐츠 항목에 적용되는 폰트 등을 설정. css도 설정
                 - body 태그에는 사용자에게 보여줄 항목 작성


                1.2.1. 태그


         1.2.1.1. 리스트 태그
                      - ul 태그 : 하위 항목인 <li> 태그의 아이템들을 리스트로 표시하나, 순서가 없이 표시함
                                                                
                      - ol 태그 : 하위 항목인 <li> 태그의 아이템들을 리스트로 표시하며, 위에서부터 순차적으로 1. 2. 3. ... 으로 순서를 표시함
                                                                

          1.2.1.2. 링크 태그
                       - <a href="링크 주소">텍스트 내용</a> 
                          - 같은 폴더내 연결할 링크 : 파일명
                          - 하위폴더에 있을경우 : 하위폴더명/파일명
                          - 같은 레벨의 다른 폴더에 있을경우 : ../폴더명/파일명
                          - 다른 웹에 연결 : 웹 주소  

          1.2.1.3.  meta 태그
                        - 문자열 집합을 나타내는 태그로, header 태그 안에 삽입
                        - <meta charset="utf-8"> 로 작성하면 됨.   

          1.2.1.4. img 태그
                       1.2.1.4.1. src 속성
                                      - 같은 폴더내 있을경우 : 파일명
                                      - 하위폴더에 있을경우 : 하위폴더명/파일명
                                      - 같은 레벨의 다른 폴더에 있을경우 : ../폴더명/파일명
                                      - 다른 웹에 있는 파일 : 웹 주소  

                       1.2.1.4.2. alt 속성
                                      - 이미지 링크가 깨졌거나 할 경우 표시할 텍스트. (description)
                          
                       1.2.1.4.3. title 속성
                                      - 이미지 마우스 오버시 보여주는 텍스트
             
          1.2.1.5. figure 태그 (html5)
                       - figure 태그 안에 정의한 내용과 figcaption 태그에 작성한 텍스트를 엮어주는 역할
                         - 예 : 이미지 추가 후, 하단에 설명을 작성할 때 다음의 두가지 방법으로 가능
                                  - 기본방식인 img 태그 추가, 하단에 p 태그를 통한 설명 삽입
                                  - figure 태그 안에 img태그, 하단에 figcaption 태그에 설명 삽입

          1.2.1.6. div 태그
                       - 레이아웃을 분리하는 역할
                          - 예 : 
                                      

                        <html>
                      <body>
                    <div style="background-color:cyan">구역1</div>
                    <div style="width:100px; height:100px; background-color:#CF0">구역2</div>
                      </body>
                        </html>

                           

                1.2.1.7. span 태그
                             - div처럼 영역을 구분하나, div는 줄바꿈이 되는것에 반해 span은 줄바꿈 하지 않는다.

                1.2.1.8. audio 태그 (html5)
                             - <audio controls src="주소" />

                * 이후 태그는 검색을 통해 필요할때 마다 활용. 내용정리하지 않음
 

                1.2.2 Form
                     - 사용자가 웹사이트 또는 어플리케이션과 통신
                            - 데이터 전송
                            - 하나이상의 위젯으로 만들어 지며, 버튼, 체크박스 등이 위젯임
                            - 각 위젯에 name을 설정해주어야함. 통신시 key,value를 통해 name이 key가 됨
                            - action : 전달 대상
                            - method : get, post 등 전달방식
                            - 예 : 

<form action="http://foo.com" method="get">
  <div>
    <label for="say">What greeting do you want to say?</label>
    <input name="say" id="say" value="Hi">
  </div>
  <div>
    <label for="to">Who do you want to say it to?</label>
    <input name="to" id="to" value="Mom">
  </div>
  <div>
    <button type="submit">Send my greetings</button>
  </div>
</form>

                 - 참조 :  https://developer.mozilla.org/en-US/docs/Learn/HTML/Forms/Sending_and_retrieving_form_data
                             https://developer.mozilla.org/ko/docs/Learn/HTML/Forms

                1.2.3. 테이블
                     1.2.3.1 태그
                                         - table : 테이블 생성
                                        - th : 헤더
                                        - tr : 행
                                        - td : 열
                       
                     - 참조 : https://coding-factory.tistory.com/184

       1.3. CSS
                 - html 태그들에 스타일을 일괄적용하는 스타일 시트 언어
                 - 사용법 예 : p { color:red; } 작성 -> 확장자가 css 인 파일로 저장
                 - 부트스트랩을 적극적으로 활용하자.
                    - https://getbootstrap.com/
                    - html과 css 프레임워크로 이미 꾸며놓음 

                 1.3.1. 설명
                             - html 태그이름 { 해당html태그의 속성: 값; }
                            - 속성값을 정하기 위해서는 { } 블록 안에 적어야 함
                            - 속성값 별 ; 로 구분해야함.
                               - 예 : color: red; width:500px;
                               - body의 크기 , 배경색 등도 변경가능
                            - 한번에 여러 태그를 동시에 적용 가능
                               - 예 : p,li,h1 { .....
                            * html 태그이름 부분을 셀렉터 라고 함

                 1.3.2. 셀렉터 종류
                              - html 태그명
                             - 아이디
                                - html 의 속성으로 주어진 아이디 (아이디는 고유함)
                                   - 예 : <p id="id1" /> 의 경우, #id1 {...}
                             - 클래스
                                - html 의 속성으로 주어진 클래스 (아이디와 다르게 고유하지 않음)
                                   - 예 : <p class="class1" /> <a class="class1" />의 경우, .class1 {...}
                             - 속성
                                - 특정 속성에 해당하는 태그에 반영
                                   - 예 : <img src="...." /> 의 경우, img[src] {...}
                             - Pseudo(수도) 클래스
                                - 특정 태그에 적용되나, 해당 태그가 특정 상태에 있을때만 적용
                                   - 예 : <a> 태그의 마우스 포인터가 위에 있을경우만, a:hover {...}
                             ... 등등 있음

                             * 전체에 반영하고 싶을 경우 셀렉터를 html로 하면 됨
                             - 참조 : https://developer.mozilla.org/ko/docs/Learn/CSS/Introduction_to_CSS/%EC%84%A0%ED%83%9D%EC%9E%90

                 1.3.3. html에서 css 호출하기
                              - head 태그 안쪽에 <link href="css 파일위치 및 파일명 혹은 url" rel="stylesheet" type="text/css"> 작성 시, 스타일이 반영됨
                             - https://getbootstrap.com/ 접속시, 주소 있음. 기본으로 많이 씀. 

               1.3.4. 구글 폰트 반영
                         - head 태그 안쪽에 <link href="구글 폰트url" rel="stylesheet" type="text/css">
                             - 본인이 작성한 css 파일을 열어, html { font-family: 구글에서 적용하라고 안내한 css내용;}
                                예 : font-familiy: 'Noto Sans KR', sans-serif;
                             * 본인이 작성한 css 파일 참조 내용이 없는데 적용이..?

               1.3.5. 박스 (margin, padding등)
                        - body, header 등 margin, padding, background 등을 이용하여 크기 및 간격 조절, 배경색 변경등이 가능
                           - 이미지 중앙정렬 등도 가능하다.  display를 이용해야함..
                              - 이미지 태그는 바디 처럼 블록영역이 아니라, 한줄 영역이므로 별도의 조취가 필요
                              - img { display:block; margin: 0 auto;}
                              - display 상세 설명 : https://developer.mozilla.org/en-US/docs/Web/CSS/display

       1.4. Java Script
                 - 동적 프로그래밍 언어로, 웹사이트 상에서 다양한 작업을 할 수 있다.
                    - 브라우저 내장 API 및 서드파티 API와 연동하여 HTML을 동적으로 생성, CSS 스타일 적용, 오디오 생성 등 다양한 작업
                 - 참조 :  https://developer.mozilla.org/ko/docs/Learn/Getting_started_with_the_web/JavaScript_basics
                 - 웹 API 리스트 참조 : https://developer.mozilla.org/ko/docs/Web/API  
                 - 자바스크립트 안내서 : https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide
                 - 자바스크립트 학습 : https://developer.mozilla.org/ko/docs/Learn/JavaScript
                 - 자바스크립트 함수들?? : https://www.w3schools.com/jsref/met_win_settimeout.asp

                 1.4.1. html에서 javascript 호출하기
                         - html 태그 -> </body> 태그 앞줄에 <script src-="스크립트 위치 및 파일명" /> 입력
                               => html은 위에서부터 순차적으로 로딩하는데, 자바스크립트가 영향을 미치는 태그보다 먼저 로딩될 경우, 자바스크립트 동작이 안된다.
                                     즉, 적용 대상이 되는 항목이 먼저 로딩되고 난 후에 자바스크립트가 로딩되어야 동작한다. 따라서 맨 마지막줄에서 자바스크립트 호출한다
                            - 혹은, <script></script> 태그 안에 직접 코딩할 수 있다. 마찬가지로, script 태그는 body 맨 아래에 위치한다
                            
                 1.4.2. 자바스크립트 생성 및 Hello world 
                         - 메모장에서 파일 저장 -> 확장자가 js인 파일로 저장
                             - hello world 예제 코드
                                - var myHead = document.querySelector('h1');
                                   => myHead 변수에 html페이지의 h1 태그를 배정
                                - myHead.textContent = 'Hello World';
                                   => h1 태그를 배정받은 변수에서, h1 태그의 프로퍼티인 textContent에 값을 입력
                 1.4.3. 변수 
                         - string, number, boolean, object 등 타 언어에서 사용되는 변수 있음. 대소문자 구분
                             - 문자열의 경우 '' 또는 "" 로 둘러싸임. 
                             - array 예 : var arrayVar = [1,'aaa','bbb', 10]; 으로 선언, arrayVar[0] ... 으로 접근 가능
                             - var objectVar = document.querySelector('h1'); 처럼 h1 태그를 배정할 수 있음

                 1.4.4. 연산자 
                             - 타 언어와 다른 연산자만 내용정리
                             - 참조 : https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators

                             1.4.4.1. === 연산자 (일치 연산자)
                                          - 두값이 서로 같은지 비교하여 결과값 반환 (true/false)
                                          - 예 : var test = 3;
                                                   test === 4;

                             1.4.4.2. 부등 연산자
                                          - != 연산자 이며, 타입이 다르더라도, 자바스크립트가 적절한 타입으로 변환하여 비교함. 같지않을경우 true, 같으면 false 리턴
                                          - 예 : 1 != '1'  은 false
                                                   2 != '1' 은 true 리턴
                                                   1 != true,  0 != false 또한 false 리턴       

                             1.4.4.2. 불일치 연산자
                                          - !== 연산자 이며, 타입이 다를경우에도 true를 리턴한다.  같지않은경우 true, 같으면 false를 리턴한다
                                          - 예 : 1 !== '1' 은 true, 1 !== 1 은 false 리턴
                                                   1 !== 2 도 true 리턴                      
                             
                 1.4.5. 함수 
                             - function 함수명 (인자값) { } 으로 구성
                                - 리턴형은 따로 명시가 없는듯. 자유롭게 리턴 가능한듯
                             - 참조 : https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/%ED%95%A8%EC%88%98

                             1.4.5.1. argument 이용하여 인자값을 유동적으로 받기
                                         - arguments[i] 를 이용하여 인수를 유동적으로 받을 수 있다.
                                         - 예 : 

function myConcat(separator) {
   var result = ""; // 리스트를 초기화한다
   var i;
   // arguments를 이용하여 반복한다
   for (i = 1; i < arguments.length; i++) {
      result += arguments[i] + separator;
   }
   return result;
}

// returns "red, orange, blue, "
myConcat(", ", "red", "orange", "blue");

                             1.4.5.2. 나머지 매개변수 (1.4.5.1. argument와 비슷한 방법인듯?)

function multiply(multiplier, ...theArgs) {
  return theArgs.map(x => multiplier * x);
}

var arr = multiply(2, 1, 2, 3);
console.log(arr); // [2, 4, 6]

                 1.4.6. 이벤트 
                             - 웹사이트의 상호작용을 위해 사용됨. (예 :  버튼 클릭 이벤트)

document.querySelector('html').onclick = function() {
    alert('Ouch! Stop poking me!');
}

                             1.4.6.1. 이벤트 예제
                                                      

var myImage = document.querySelector('img');

myImage.onclick = function() {
    var mySrc = myImage.getAttribute('src');
    if(mySrc === 'images/firefox-icon.png') {
      myImage.setAttribute ('src','images/firefox2.png');
    } else {
      myImage.setAttribute ('src','images/firefox-icon.png');
    }
}

// 이미지 클릭시, 현재 이미지 파일명에 따라 다른 이미지 파일로 대체


                                              * 사이트를 나갔다 들어오더라도 데이터가 저장될수 있도록 하는 예제 (웹저장소 api 사용)
                                                 참조 : https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Client-side_web_APIs/Client-side_storage

//html에 다음을 추가
<button>Change User</button>       

//자바스크립트 내용
var myButton = document.querySelector('button');
var myHeading = document.querySelector('h1');

function setUserName() {
  var myName = prompt('Please enter your name.');
  localStorage.setItem('name', myName);
  myHeading.innerHTML = 'Mozilla is cool, ' + myName;
}

if(!localStorage.getItem('name')) {
  setUserName();
} else {
  var storedName = localStorage.getItem('name');
  myHeading.innerHTML = 'Mozilla is cool, ' + storedName;
}

myButton.onclick = function() {
  setUserName();
}              
                 1.4.7.  유용한 기본 메서드
                             1.4.7.1. 문자열 (다른 항목만 정리)
                                          - substring에 대응하는 함수 : slice
                                          - 소문자 변경 : toLowerCase();
                                          - 대문자 변경 : toUpperCase();

                             1.4.7.2. 기본 메서드
                                         - 참조 : https://developer.mozilla.org/ko/docs/Web/API/Window
                                         - prompt : 팝업 윈도우를 통해 사용자 입력을 받는 메서드. 인자값으로는 타이틀 string
                                         - alert : 팝업 메세지 창 

                 1.4.8. 디버깅
                             - 페이지에서 f12 (크롬 기준)  누름 -> console 탭 클릭시 오류 목록이 출력됨
                             - console 에서는 연산자 및 자바스크립트를 실행 해 볼 수 있음

                 1.4.9. Javascript로 Json 다루기
                             - 웹 어플리케이션에서 데이터 전송시 일반적으로 사용하는 표준 포멧
                             - 문자열로 이루어진 포멧으로, 데이터에 억세스하기 위해서는 Json 객체로 변환해야 함 : 파싱이라고 함
                             - 기본적으로 javascript 문법과 유사. 다수의 프로그래밍 환경에서 json 연동기능을 제공
                             - 확장자는 .json
                             - json은 순수히 데이터 포멧으로, 프로퍼티만 담을 수 있고 메서드는 담을 수 없음
                             - https://jsonlint.com/ 에서 json 유효성 검사를 할 수 있음
                             * XMLHttpRequest의 responsetype 참조 : https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/responseType

                             1.4.9.1. 변수 설정 예제
                                          - 변수 설정은 "변수명" : 값 으로 설정함

 - "first" : "A"
 - "second" : 2
 - "third" : true
 - "forth" : [ { "name" : "aaa", "age" : 30, "ability": [ "aa", "bb", "cc"] }, { "name" : "vvv", "age" : 35, "ability": [ "dd", "ee", "ff"] } ] 
                                            
                             1.4.9.2. javascript에서 json 파싱
                                         - XMLHttpRequest의 responseType : json 으로 함으로서 자동 파싱

- var url변수 = 'json 파일 위치 혹은 url'
- var request변수 = new XMLHttpRequest();
- request변수.open('GET' ,url변수); 
- request변수.responseType = 'json';
- request변수.send();
- request변수.onload = function()
  {
     var return변수명 = request.response;
     var temp변수명 = return변수명['json변수명 예 : first'];
     var temp변수명1 = return변수명['json변수명 예 : forth'][0]['예 : name'];
     var temp변수명2 = return변수명['json변수명 예 : forth'][0]['예 : ability'][0];
  }

만일 위의 예제에서 배열이라 for문을 활용하고 싶다면, 
for (var i = 0; i<return변수명['json변수명 예 : forth'].length;i++) 을 통해 반복문 사용가능
해당 json변수가 배열임을 미리 알아야 할듯.
                             1.4.9.3. javascript에서 json 수동파싱 
                                         - 종종 raw json만 수신 가능할 수도 있다.
                                         - XMLHttpRequest의 responseType : text 으로 함으로서 json을 text로 받아오고, 이후 수동 파싱

- var url변수 = 'json 파일 위치 혹은 url'
- var request변수 = new XMLHttpRequest();
- request변수.open('GET' ,url변수); 
- request변수.responseType = 'text'; //json의 raw 텍스트를 가져옴
- request변수.send();
- request변수.onload = function()
{
var return변수명 = JSON.parse(request.response);
var temp변수명 = return변수명['json변수명 예 : first'];
  var temp변수명1 = return변수명['json변수명 예 : forth'][0]['예 : name'];
  var temp변수명2 = return변수명['json변수명 예 : forth'][0]['예 : ability'][0];
}
                             1.4.9.4. javascript를 json으로 변환하여 전송하기
                                         - javascript의 오브젝트를 전송하고 싶을경우, json으로 치환하여 전송해야 함 
 

var myJSON = { "name": "Chris", "age": "38" };
var myString = JSON.stringify(myJSON);

var xhr = new XMLHttpRequest();
xhr.open("POST", 'url위치');

//Send the proper header information along with the request
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

xhr.onreadystatechange = function() { // Call a function when the state changes.
    if (this.readyState === XMLHttpRequest.DONE && this.status === 200) {
        // Request finished. Do processing here.
    }
}
xhr.send(myString);

                 1.4.10. XMLHttpRequest 함수
                             - 웹 통신을 위해 사용하는 함수. 
                             - 참조 : https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest
                                        https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest

                             1.4.10.1. open()
                                           - 인자값 : HTTP Method, url, async (bool) , user, password
                                              - async 부터는 옵션 인자값임  
                                           - 참조 : https://developer.mozilla.org/ko/docs/XMLHttpRequest

                                            1.4.10.1.1. HTTP Method (대부분 보안상의 이유로 GET, POST 2개 또는 OPTIONS까지 3개만 허용함)
                                                             - GET : 데이터를 가져옴
                                                             - HEAD : http 헤더 정보만 가져옴
                                                             - POST : 내용 전송 (파일전송 가능)
                                                             - PUT : POST와 비슷하나 덮어씌우는 기능
                                                             - OPTIONS : 서버측에서 가능한 메소드 옵션들을 물어봄. 응답으로 서버에서 사용가능한 옵션들이 리턴됨
                             1.4.10.1. send()
                                           - 인자값 : 전송할 데이터로 null 가능
                                           - 1.4.9.4. 참조 

                 1.4.11. Client side Web api
                               - 브라우저 API , 서드 파티 api 존재
                               - 참조 : https://developer.mozilla.org/en-US/docs/Web/API
                                          https://developer.mozilla.org/ko/docs/Learn/JavaScript/Client-side_web_APIs

                             1.4.11.1. Local Storage (데이터 저장) : 브라우저를 꺼도 유지함, 텍스트 및 숫자 등 저장
                                            - localStorage.setItem('저장키값','저장할 값');
                                            - let 변수 = localStorage.getItem('저장키값');
                                            - localStorage.removeItem('저장키값');

                             1.4.11.2. Indexed DB (데이터 저장) : 이미지 등 저장 가능
 

let db;
window.onload = function()
{
    // db가 없을경우 생성함. 비동기 동작
let request = window.indexedDB.open('db명','1'); // 1은 버전임. 사용자 명시이며, 버전 변경시 onupgradeneeded 발생함

request.onerror = function() {
console.log('Database failed to open');
};

request.onsuccess = function() {
console.log('Database opened successfully');
db = request.result;
};

//DB가 셋업되지 않았거나, 저장된 DB버전보다 높은 버전의 DB가 open 되었을경우 이벤트 발생함. 처음 create시에도 발생하는듯 함.
request.onupgradeneeded = function(e) {
let db = e.target.result;
let objectStore = db.createObjectStore('db테이블명', { keyPath: '키값으로 사용되는 명칭 예 : id', autoIncrement:true });

// Define what data items the objectStore will contain
objectStore.createIndex('db컬럼명 예 : name', '클래스 맴버변수 혹은 변수와 매칭되는 명 예 : name', { unique: false });

// 예를들어, { name : "aa", id : 1} 항목을 저장 할 수 있음.
};
};

// form.onsubmit = addData; 를 통해 e에 데이터를 실어 넘겨주는것이 필요.
function addData(e)
{
e.preventDefault();
let newItem = { name : "aa", id : 1};
let transaction = db.transaction(['db테이블명'],'readwrite');
let objectStore = transaction.objectStore('db테이블명');

let request = objectStore.add(newItem);
request.onsuccess = function()
{
//원하는 항목 진행
};

transaction.oncomplete = function()
{
//원하는 항목 진행. db 트랜잭션 성공시 발생. 
};

transaction.onerror = function()
{
//db 드랜잭션 실패시
};
};

//db에서 항목 조회
function selectData()
{
let transaction = db.transaction(['db테이블명'],'readwrite');
let objectStore = transaction.objectStore('db테이블명');
objectStore.openCursor().onsuccess = function(e)
{
while(true)
{
let cursor = e.target.result;
if(cursor == null)
break;

let valueItem = cursor.value.컬럼명;
};

};
};

//db에서 항목 삭제
function deleteData()
{
let transaction = db.transaction(['db테이블명'],'readwrite');
let objectStore = transaction.objectStore('db테이블명');

//단일 삭제 혹은 다중삭제 가능함. key값 1개 혹은 KeyRange를 통해 범위삭제 가능
// IDBKeyRange.lowerBound(숫자) : 숫자포함 이하
// IDBKeyRange.lowerBound(숫자, true) : 숫자 미만
// IDBKeyRange.upperBound(숫자) : 숫자 포함 이상
// IDBKeyRange.upperBound(숫자, true) : 숫자 초과
// IDBKeyRange.bound(숫자1, 숫자2) : 숫자 1이상, 숫자2 이하
// IDBKeyRange.bound(숫자1, 숫자2, true, true) : 숫자1 초과 숫자2 미만 ...
// IDBKeyRange.only(숫자) : 해당 인덱스만 삭제. delete(숫자) 와 동일

let request = objectStore.delete(키값 예 : id);
transaction.oncomplete = function()
{
//삭제 성공
};

};

                             1.4.11.3. Indexed DB  : 다중데이터 저장 및 비디오 저장

let db;
let videos = [ {'컬럼명 예 : name' : '비디오명1'},{'컬럼명 예 : name' : '비디오명2'},{'컬럼명 예 : name' : '비디오명3'},];

window.onload = function()
{
    // db가 없을경우 생성함. 비동기 동작
let request = window.indexedDB.open('db명','1'); // 1은 버전임. 사용자 명시이며, 버전 변경시 onupgradeneeded 발생함

request.onerror = function() {
console.log('Database failed to open');
};

request.onsuccess = function() {
console.log('Database opened successfully');
db = request.result;
init();
};

//DB가 셋업되지 않았거나, 저장된 DB버전보다 높은 버전의 DB가 open 되었을경우 이벤트 발생함. 처음 create시에도 발생하는듯 함.
request.onupgradeneeded = function(e) {
let db = e.target.result;
let objectStore = db.createObjectStore('db테이블명', { keyPath: '키값으로 사용되는 명칭 예 : id', autoIncrement:true });

// Define what data items the objectStore will contain
objectStore.createIndex('db컬럼명 예 : name', '클래스 맴버변수 혹은 변수와 매칭되는 명 예 : name', { unique: false });
objectStore.createIndex('db컬럼명 예 : origin', '클래스 맴버변수 혹은 변수와 매칭되는 명 예 : origin', { unique: false });

};
};

function init()
{
for(let i = 0; i < videos.length; i++)
{
let transaction = db.transaction(['db테이블명'],'readwrite');
let objectStore = transaction.objectStore('db테이블명');
let request = objectStore.get(videos[i].키값 예 : name);
request.onsuccess = function()
{
if(request.result)
// 저장된 비디오가 있는 경우. 
getVideo(request.result.origin, request.result.name);
else
// 저장된 비디오가 없기에, 저장해야 하는 경우
addVideo(videos[i]);
};
}

};

function addVideo(video)
{
let origin = fetch(경로명 예 : video.name).then(response => response.blob());

Promise.all([video.name,origin]).then(function(e)
{
let transaction = db.transaction(['db테이블명'],'readwrite');
let objectStore = transaction.objectStore('db테이블명');
let addItem = { name : e[0], origin : e[1] }
let request = objectStore.add(addItem);
...
};
};

//db에서 항목 조회
function getVideo(video, name)
{
let url = URL.createObjectURL(video);
let videoTag = document.createElement('video');
let source = document.createElement('source');
source.src = url;
source.type = 'video/mp4';
video.appendChild(source);
};




* Jquery : https://mintpot.synology.me:30000/boards/2/topics/290