엘리스 12일차 화요일 온라인 강의 javascript

치즈말랑이·2022년 4월 19일
0

엘리스

목록 보기
13/47
post-thumbnail
post-custom-banner

00

컴포넌트 특징
1. 컴포넌트는 독립적이고, 재사용이 가능한 작은 UI조각이다.
2. render()를 통해 HTML 요소를 반환하는 함수이다.
3. 자바스크립트 함수와 동일한 용도로 사용된다.
4. 코드를 효율적으로 관리할 수 있게 도와준다.

IndexedDb 설명
1. 브라우저에 객체를 저장할 수 있다.
2. 트랜잭션을 지원한다.
3. 자바스크립트 기반의 객체 지향 데이터베이스입니다.
4. 자바스크립트의 객체, 파일, blobs등을 저장할 수 있다.

01 컴포넌트

컴포넌트

render()를 통해 HTML 요소를 반환하는 함수
독립적이고, 재사용이 가능한 작은 UI 조각
Javascript함수와 동일한 용도로 사용

복합한 웹을 작은 컴포넌트로 쪼개면 재사용이 쉽고 효율적으로 관리할 수 있다.

다른 js파일에 있는 함수를 불러와서 사용할 수 있다.

App.js

//App.js
const name = "Elice";
//컴포넌트선언
function Hello() {
  return <h1> Hello,{name} </h1>; 
}

export default Hello;

index.js

//index.js
import Hello from './App';

ReactDOM.render(<Hello/>,
document.getElementById('root'));

return() 내에 있는건 태그 하나로 묶기

//App.js
import Hello from './component/Hello.js';
import Post from './component/Post.js';
const name = "Elice";
//컴포넌트선언
function App() {
  return (
    <div className= "App">
    <Hello/>
    <Post/>
    </div>
  );
}

export default App;

함수형 컴포넌트 vs 클래스형 컴포넌트

1) 함수형 컴포넌트 (트랜드)

const name = "Elice"
const Hello = () => {
  return <h1> Hello, {name}</h1>;
}
//컴포넌트호출
const element =<Hello/>
  ReactDOM.render(element, 
  document.getElementById('root'));

덜 복잡한 UI 로직
Component 선언이 편함
클래스형보다 메모리 자원 덜 사용

2) 클래스형 컴포넌트

import Component from 'react'
constname = "Elice"

class Hello extends Component {
  render() {
    return<h1> Hello, {name} </h1>
  }
}
const element = <Hello/>
      ReactDOM.render(element, 
      document.getElementById('root'));

Class 키워드 필요
Component를 상속 받아야 함
Render() 메소드 반드시 필요
함수형보다 메모리 자원 더 사용

최근에는 함수형 컴포넌트가 실무에서 쓰인다고 한다.

컴포넌트 반환

//App.js
import Nav from './component/nav/Nav.js'
importPosts from './component/post/Posts.js'
const App = () => {
  return `
	${Nav()}
	<div class="container">
	${Posts()}
	</div>
`
}

01 기능구현

IndexedDb

관계형 db가 아니다
SQL사용 안함
브라우저의 객체를 저장할 수 있다
자바스크립트 객체, 파일, blobs등을 저장한다.
Transaction을 지원

자바스크립트 기반의 객체지향 데이터베이스 -> 자료형과 객체 저장 가능
클라이언트(사용자) 측 브라우저에 저장하기 위한 API

Key-Value 형태의 데이터 저장
index 지원 -> 많은 양의 구조화된 데이터를 다룰때 적합
localstorage에 비해 훨씬 많은 데이터 저장 가능

작업 순서

  1. 데이터베이스 열기
  2. 데이터베이스에 ObjectStore 생성
  3. Transaction 시작 - 데이터 추가, 검색 작업 요청
  4. index 마다 DOM 이벤트 수신해서 작업
  5. 결과 수행

1. 데이터베이스 열기

let request = indexedDB.open(name, version);

let request = indexedDB.open('mydb', 1);

name: 문자열, 데이터베이스 이름
version: 기본적으로 양의 정수 버전, 1
db수정시 version을 수정해야함

let onRequest = indexedDB.open('mydb', 1);
	onRequest.onsuccess = () => {
    	console.log('Success creating or accessing db')
    }
    onRequest.onupgradeneeded = () => {
    	const database = onRequest.result
    }
    onRequest.onerror = () => {
     	console.log('Error creating or accessing db') 
    }

로컬 데이터베이스 버전이 지정된 버전보다 낮으면 onupgradeneeded가 트리거되고 데이터베이스 버전을 업그레이드한다.
이벤트는 데이터베이스가 아직 존재하지 않을때도 트리거되므로 초기화를 수행 가능

2. ObjectStore 생성

obejectStore
데이터를 담은 공간, 여러개의 Key-value 값으로 형성
objeectStore의 이름은 고유해야함

database.createObjectStore('스토어이름', {keyPath:'id'});
database.createObjectStore('스토어이름', {autoIncrement: true})
database.createObjectStore('스토어이름', {keyPath: 'id', autoIncrement: true})
onRequest.onupgradeneeded = () => {
	const database = onRequest.result
    const objectStore = database.createObjectStore('users', {keyPath: 'id'})
}

.onupgradeneeded() 로 데이터베이스가 업그레이드될때 ObjeectStore생성또는 수정 가능
createObjectStore(tableName)을 이용해서 objectStore라는 이름으로 ObjectStore 를 생성하고,
users라는 테이블을 만든다.
=> objectStore 저장소에 users 테이블 생성
keyPath는 id를 제공하는데 필요한 인덱스 필드의 이름을 지정하는것이다.

const initializeDb = indexedDB.open('mydb', 1)
initializeDb.onupgradeneeded = () => {
	const database = initializeDb.result
    database.createObjectStore('users', {keyPath: 'id})
}

3. Transaction 시작 - 데이터 추가, 읽기, 수정, 제거

const transaction = database.transaction('ObjectStore이름', 'Transaction Mode')

모든 데이터 읽기 및 쓰기는 Transaction 내에서 수행됨
ObjectStore Name: 객체 저장소 이름
Transaction Mode: readonly, readwrite, versionchange

Transaction 시작하기

//users 테이블에서 transaction을 instance화
const transaction = database.transaction('users', 'readwrite').objectSotre('users')

트랜잭션은 데이터베이스 객체 단위로 작동하므로 트랜잭션을 사용할 객체 저장소를 지정해줘야 함
readwrite모드 사용: 이미 존재하는 objectStore의 데이터를 읽고 변경할때

ObjectStore에 데이터 추가하기

const todos = database.createObjeectStore('todos', {autoIncrement:true})
function addTodos() {
  			const todo = {
            		title: "todo1",
              		text: "no.1 thing to do"
            		}
        // todos ObjectStore에 readwrite권한으로 transaction 시작하기
            const transaction = database.transaction('todos', 'readwrite')
        // objectStore()함수로 todos 테이블 선택
            const todos = transaction.objectStore('todos')
        // 원하는 객체(todo)를 테이블에 추가
            todos.add(todo)
}

사용자 데이터 읽기

1) objectStore.get(key);

const transaction = databse.transaction(['users'], 'readwrite')
const store= transaction.objectStore('users')
return store.get('Frank')
// {id: 3, name: 'Frank', age: 23}

2) objeectStore.getAll();

return store.getAll()
// { id: 1, name: “Pete”, age: 35 }, {id: 2, name: “Mark”, age: 23 }, { id: 3, name: “Frank”, age: 23}

사용자 데이터 수정

return store.put('Frank')

사용자 데이터 삭제

store.delete('Frank')
return transaction.complete;
profile
공부일기
post-custom-banner

0개의 댓글