Share
Sign In

Indexed DB

Indexed DB는 웹 브라우저에서 대량의 구조화된 데이터를 저장하고 관리하기 위한 저수준 API입니다. Indexed DB는 NoSQL 처럼으로 트랜잭션을 통해 데이터를 읽고 쓰고 삭제할 수 있습니다.
장점
Web Storage는 적은 양의 데이터를 저장하는데 유용하지만, 대량의 데이터를 처리해야 하는 웹 애플리케이션에서는 Indexed DB를 사용하여 데이터를 효율적으로 관리하고 검색할 수 있습니다.
Indexed DB는 사이트의 오리진(origin: 도메인이나 서브 도메인)에 유니크 하며, 다른 도메인에서 접근 불가능한 특징을 갖고 있습니다. 따라서 브라우저의 다른 스토리지(session, local)에 비해 안전하게 관리할 수 있습니다.
또한 브라우저의 다른 스토리지는 저장할 수 있는 용량의 한계가 있고, 작습니다. 하지만 indexed db는 브라우저가 저장된 디스크의 상황에 따라 저장 할 수 있는 용량의 한계가 다릅니다.
가령 크롬 또는 크롬 기반의 브라우저가 80% 의 디스크 공간을 사용 할 수 있다면, 컴퓨터의 공간이 100 기가바이트 일 때, 80기가 바이트의 용량을 하나의 오리진에서 사용할 수 있습니다.
Indexed db는 서버에서 설치, 접근 제어 등 복잡한 인프라에 대한 고려의 필요가 없이 브라우저가 표준으로 지원하는 범위 내에서 유용하게 사용할 수 있습니다.
단점
데이터베이스를 설계하는 방법(인덱싱, 비정규화 등)에 따라 데이터를 쿼리하는 속도가 다를 수 있으며, 때에 따라 서비스의 메인 데이터베이스의 데이터와 Indexed db와의 데이터간 차이가 발생하지 않도록 무결성과 정합성을 고려해야합니다.
하지만 Indexed DB는 브라우저에서 지원하는 저수준 API이므로, 사용 시 비동기 처리, 트랜잭션 관리, 에러 핸들링 등에 주의를 기울여야 합니다. 또한, Indexed DB는 브라우저 간 호환성 문제가 있을 수 있으므로, 크로스 브라우저 지원을 고려해야 합니다. (일부 브라우저의 시크릿 모드에서 Indexed DB가 정상 동작하지 않을 수 있습니다.)
특징
1.
비동기 API: Indexed DB의 모든 작업은 비동기적으로 처리되므로 메인 스레드를 블로킹하지 않습니다.
2.
객체 지향 데이터베이스: Indexed DB는 JavaScript 객체를 저장하고 검색할 수 있는 객체 지향 데이터베이스입니다.
3.
트랜잭션 기반: 모든 데이터베이스 작업은 트랜잭션 내에서 수행되어 데이터 무결성을 보장합니다.
4.
스키마 기반: Indexed DB는 객체 저장소(object store)와 인덱스를 사용하여 데이터를 구조화합니다.
5.
키-값 쌍: 각 객체는 고유한 키와 연결되어 저장되며, 이를 통해 빠른 검색과 업데이트가 가능합니다.
개념 및 용어
개념
데이터베이스(Database)
객체 저장소(Object Store)
인덱스(Index)
트랜잭션(Transaction)
커서(Cursor)
키 범위(Key Range)
버전 관리(Versioning)
데이터베이스(Database)
indexed DB의 가장 큰 단위로, 객체 저장소(Object Store)를 포함하고 있으며 특정 오리진 내에서 다수의 데이터 베이스를 생성 할 수 있습니다. Indexedb는 별도의 schema 단위를 사용하지 않습니다.
객체 저장소(Object Store)
다른 관계형 데이터베이스의 테이블과 유사한 단위로 데이터베이스 내에서 데이터를 저장하는 저장소 입니다.
하나의 객체 저장소에는 다양한 타입의 데이터를 저장할 수 있으며, 관계형 데이터베이스처럼 특정 타입을 보장하지 않습니다.
가령 데이터베이스의 학생 테이블에 age 라는 숫자 타입의 행(필드)가 존재한다면 숫자가 들어갈 것을 예상하지만, Indexed DB에서는 17, “seventeen”, “undefined” 등 특정 타입을 보장하지 않습니다.
또한 꼭 JSON 기반의 타입일 필요 없이 javascript의 array buffer, blob과 같은 데이터를 저장할 수 있습니다.
인덱스(Index)
Indexed DB의 인덱스는 객체 저장소에 저장된 데이터를 효율적으로 검색하고 정렬하기 위해 사용되는 메커니즘입니다. 인덱스를 사용하면 객체 저장소의 특정 속성이나 속성의 조합을 기준으로 데이터를 빠르게 찾을 수 있습니다.
가령 데이트베이스에 학생에 대한 정보를 과목과, 학년 정보를 바탕으로 빠르게 불러 올 수 있습니다.
트랜잭션(Transaction)
Indexed DB의 읽기 또는 쓰기 등의 모든 행위는 트랜잭션 내에서 관리됩니다. 트랜잭션은 하나 또는 여러 행동의 묶음으로 볼 수 있으며, 이를 통해 데이터베이스의 무결성을 보장할 수 있습니다. 만약 하나의 트랜잭션이 실패하면 트랜잭션의 내의 정의된 모든 행위는 데이터베이스에 반영되지 않고 롤백 되며 데이터베이스를 트랜잭션의 이전으로 되돌릴 수 있습니다. 트랜잭션을 통해 ACID(원자성, 일관성, 독립성, 지속성)를 지킬 수 있습니다.
커서(Cursor)
Indexed DB에서 커서는 객체 저장소 또는 인덱스의 데이터를 순회하고 접근하는 데 사용되는 메커니즘입니다. 커서를 사용하면 데이터베이스의 데이터를 하나씩 읽어올 수 있으며, 필요에 따라 데이터를 수정하거나 삭제할 수도 있습니다.
자주 사용하는 메서드
open(): 데이터베이스를 열거나 생성합니다.
onerror: 데이터베이스 작업 중 오류가 발생했을 때 트리거되는 이벤트입니다.
onsuccess: 데이터베이스 작업이 성공적으로 완료되었을 때 트리거되는 이벤트입니다.
onupgradeneeded: 데이터베이스 버전이 변경되었을 때 트리거되는 이벤트입니다.
createObjectStore() : 객체 저장소를 생성합니다.
transaction(): 트랜잭션을 생성합니다.
objectStore(): 객체 저장소에 접근합니다.
add()/put(): 객체 저장소에 데이터를 추가하거나 수정합니다.
get()/getAll(): 객체 저장소에서 데이터를 검색합니다.
delete(): 객체 저장소에서 데이터를 삭제합니다.
createIndex()/index(): 객체 저장소에 인덱스를 생성하거나 접근합니다.
커서
커서를 사용하여 데이터베이스를 순회할 수 있습니다.
고려사항
1.
데이터 구조 정의:
애플리케이션에서 사용할 데이터의 구조를 정의합니다.
객체 저장소(Object Store)를 식별하고, 각 저장소에 저장될 객체의 속성을 결정합니다.
객체 간의 관계를 파악하고, 필요한 경우 외래 키와 같은 참조 속성을 정의합니다.
2.
키(Key) 설계:
각 객체 저장소에는 고유한 키가 필요합니다.
키는 객체를 식별하고 검색하는 데 사용되므로, 적절한 키 값을 선택해야 합니다.
키는 단순한 값(예: 숫자, 문자열)일 수도 있고, 복합 키(여러 속성의 조합)일 수도 있습니다.
자동 증가 키(auto-increment key)를 사용하여 고유한 식별자를 생성할 수도 있습니다.
3.
인덱스 설계:
빠른 검색을 위해 객체 저장소의 특정 속성에 인덱스를 생성할 수 있습니다.
인덱스는 데이터 검색 성능을 향상시키지만, 저장 공간을 추가로 사용하므로 적절히 사용해야 합니다.
자주 검색되는 속성이나 정렬이 필요한 속성에 인덱스를 생성하는 것이 좋습니다.
4.
데이터 정규화와 비정규화:
데이터 정규화는 중복을 최소화하고 데이터 무결성을 유지하기 위한 기술입니다.
하지만 Indexed DB에서는 조인 연산이 지원되지 않으므로, 데이터를 비정규화하여 저장하는 것이 더 효율적일 수 있습니다.
비정규화된 데이터는 읽기 성능은 향상되지만, 데이터 업데이트 시 일관성을 유지하는 데 주의해야 합니다.
5.
버전 관리:
Indexed DB는 데이터베이스 스키마의 변경 사항을 버전으로 관리합니다.
스키마를 변경할 때는 데이터베이스의 버전을 증가시키고, 변경된 내용을 반영해야 합니다.
이전 버전의 데이터베이스를 새 버전으로 마이그레이션하는 과정이 필요할 수 있습니다.
6.
트랜잭션 설계:
데이터의 일관성과 무결성을 유지하기 위해 트랜잭션을 적절히 사용해야 합니다.
읽기 전용 트랜잭션은 동시에 여러 개 실행될 수 있지만, 쓰기 트랜잭션은 독점적으로 실행됩니다.
트랜잭션의 범위를 최소화하여 잠금 경합을 줄이는 것이 좋습니다.
7.
에러 처리:
Indexed DB의 비동기 특성상, 에러 처리에 주의를 기울여야 합니다.
트랜잭션 내에서 발생한 에러를 적절히 처리하고, 필요한 경우 트랜잭션을 중단해야 합니다.
에러 상황에 대한 적절한 사용자 피드백을 제공하는 것도 중요합니다.
8.
모델링
Indexed DB의 스키마 설계와 데이터 모델링은 애플리케이션의 요구사항에 따라 달라질 수 있으므로, 위의 내용을 참고하여 적절히 적용해야 합니다. 또한, 데이터베이스 성능, 브라우저 호환성, 보안 등의 측면도 고려해야 합니다.
추상화 라이브러리의 도움받기
Promise Wrapper의 필요성
Zustand 와 결합
Dexie
Indexed DB는 웹 브라우저에서 대량의 구조화된 데이터를 저장하고 관리하기 위한 저수준 API입니다. Indexed DB는 NoSQL 처럼으로 트랜잭션을 통해 데이터를 읽고 쓰고 삭제할 수 있습니다.
장점
Web Storage는 적은 양의 데이터를 저장하는데 유용하지만, 대량의 데이터를 처리해야 하는 웹 애플리케이션에서는 Indexed DB를 사용하여 데이터를 효율적으로 관리하고 검색할 수 있습니다.
Indexed DB는 사이트의 오리진(origin: 도메인이나 서브 도메인)에 유니크 하며, 다른 도메인에서 접근 불가능한 특징을 갖고 있습니다. 따라서 브라우저의 다른 스토리지(session, local)에 비해 안전하게 관리할 수 있습니다.
또한 브라우저의 다른 스토리지는 저장할 수 있는 용량의 한계가 있고, 작습니다. 하지만 indexed db는 브라우저가 저장된 디스크의 상황에 따라 저장 할 수 있는 용량의 한계가 다릅니다.
가령 크롬 또는 크롬 기반의 브라우저가 80% 의 디스크 공간을 사용 할 수 있다면, 컴퓨터의 공간이 100 기가바이트 일 때, 80기가 바이트의 용량을 하나의 오리진에서 사용할 수 있습니다.
Indexed db는 서버에서 설치, 접근 제어 등 복잡한 인프라에 대한 고려의 필요가 없이 브라우저가 표준으로 지원하는 범위 내에서 유용하게 사용할 수 있습니다.
단점
데이터베이스를 설계하는 방법(인덱싱, 비정규화 등)에 따라 데이터를 쿼리하는 속도가 다를 수 있으며, 때에 따라 서비스의 메인 데이터베이스의 데이터와 Indexed db와의 데이터간 차이가 발생하지 않도록 무결성과 정합성을 고려해야합니다.
하지만 Indexed DB는 브라우저에서 지원하는 저수준 API이므로, 사용 시 비동기 처리, 트랜잭션 관리, 에러 핸들링 등에 주의를 기울여야 합니다. 또한, Indexed DB는 브라우저 간 호환성 문제가 있을 수 있으므로, 크로스 브라우저 지원을 고려해야 합니다. (일부 브라우저의 시크릿 모드에서 Indexed DB가 정상 동작하지 않을 수 있습니다.)
특징
1.
비동기 API: Indexed DB의 모든 작업은 비동기적으로 처리되므로 메인 스레드를 블로킹하지 않습니다.
2.
객체 지향 데이터베이스: Indexed DB는 JavaScript 객체를 저장하고 검색할 수 있는 객체 지향 데이터베이스입니다.
3.
트랜잭션 기반: 모든 데이터베이스 작업은 트랜잭션 내에서 수행되어 데이터 무결성을 보장합니다.
4.
스키마 기반: Indexed DB는 객체 저장소(object store)와 인덱스를 사용하여 데이터를 구조화합니다.
5.
키-값 쌍: 각 객체는 고유한 키와 연결되어 저장되며, 이를 통해 빠른 검색과 업데이트가 가능합니다.
개념 및 용어
개념
데이터베이스(Database)
객체 저장소(Object Store)
인덱스(Index)
트랜잭션(Transaction)
커서(Cursor)
키 범위(Key Range)
버전 관리(Versioning)
데이터베이스(Database)
indexed DB의 가장 큰 단위로, 객체 저장소(Object Store)를 포함하고 있으며 특정 오리진 내에서 다수의 데이터 베이스를 생성 할 수 있습니다. Indexedb는 별도의 schema 단위를 사용하지 않습니다.
객체 저장소(Object Store)
다른 관계형 데이터베이스의 테이블과 유사한 단위로 데이터베이스 내에서 데이터를 저장하는 저장소 입니다.
하나의 객체 저장소에는 다양한 타입의 데이터를 저장할 수 있으며, 관계형 데이터베이스처럼 특정 타입을 보장하지 않습니다.
가령 데이터베이스의 학생 테이블에 age 라는 숫자 타입의 행(필드)가 존재한다면 숫자가 들어갈 것을 예상하지만, Indexed DB에서는 17, “seventeen”, “undefined” 등 특정 타입을 보장하지 않습니다.
또한 꼭 JSON 기반의 타입일 필요 없이 javascript의 array buffer, blob과 같은 데이터를 저장할 수 있습니다.
인덱스(Index)
Indexed DB의 인덱스는 객체 저장소에 저장된 데이터를 효율적으로 검색하고 정렬하기 위해 사용되는 메커니즘입니다. 인덱스를 사용하면 객체 저장소의 특정 속성이나 속성의 조합을 기준으로 데이터를 빠르게 찾을 수 있습니다.
가령 데이트베이스에 학생에 대한 정보를 과목과, 학년 정보를 바탕으로 빠르게 불러 올 수 있습니다.
트랜잭션(Transaction)
Indexed DB의 읽기 또는 쓰기 등의 모든 행위는 트랜잭션 내에서 관리됩니다. 트랜잭션은 하나 또는 여러 행동의 묶음으로 볼 수 있으며, 이를 통해 데이터베이스의 무결성을 보장할 수 있습니다. 만약 하나의 트랜잭션이 실패하면 트랜잭션의 내의 정의된 모든 행위는 데이터베이스에 반영되지 않고 롤백 되며 데이터베이스를 트랜잭션의 이전으로 되돌릴 수 있습니다. 트랜잭션을 통해 ACID(원자성, 일관성, 독립성, 지속성)를 지킬 수 있습니다.
커서(Cursor)
Indexed DB에서 커서는 객체 저장소 또는 인덱스의 데이터를 순회하고 접근하는 데 사용되는 메커니즘입니다. 커서를 사용하면 데이터베이스의 데이터를 하나씩 읽어올 수 있으며, 필요에 따라 데이터를 수정하거나 삭제할 수도 있습니다.
자주 사용하는 메서드
open(): 데이터베이스를 열거나 생성합니다.
onerror: 데이터베이스 작업 중 오류가 발생했을 때 트리거되는 이벤트입니다.
onsuccess: 데이터베이스 작업이 성공적으로 완료되었을 때 트리거되는 이벤트입니다.
onupgradeneeded: 데이터베이스 버전이 변경되었을 때 트리거되는 이벤트입니다.
createObjectStore() : 객체 저장소를 생성합니다.
transaction(): 트랜잭션을 생성합니다.
objectStore(): 객체 저장소에 접근합니다.
add()/put(): 객체 저장소에 데이터를 추가하거나 수정합니다.
get()/getAll(): 객체 저장소에서 데이터를 검색합니다.
delete(): 객체 저장소에서 데이터를 삭제합니다.
createIndex()/index(): 객체 저장소에 인덱스를 생성하거나 접근합니다.
커서
커서를 사용하여 데이터베이스를 순회할 수 있습니다.
고려사항
1.
데이터 구조 정의:
애플리케이션에서 사용할 데이터의 구조를 정의합니다.
객체 저장소(Object Store)를 식별하고, 각 저장소에 저장될 객체의 속성을 결정합니다.
객체 간의 관계를 파악하고, 필요한 경우 외래 키와 같은 참조 속성을 정의합니다.
2.
키(Key) 설계:
각 객체 저장소에는 고유한 키가 필요합니다.
키는 객체를 식별하고 검색하는 데 사용되므로, 적절한 키 값을 선택해야 합니다.
키는 단순한 값(예: 숫자, 문자열)일 수도 있고, 복합 키(여러 속성의 조합)일 수도 있습니다.
자동 증가 키(auto-increment key)를 사용하여 고유한 식별자를 생성할 수도 있습니다.
3.
인덱스 설계:
빠른 검색을 위해 객체 저장소의 특정 속성에 인덱스를 생성할 수 있습니다.
인덱스는 데이터 검색 성능을 향상시키지만, 저장 공간을 추가로 사용하므로 적절히 사용해야 합니다.
자주 검색되는 속성이나 정렬이 필요한 속성에 인덱스를 생성하는 것이 좋습니다.
4.
데이터 정규화와 비정규화:
데이터 정규화는 중복을 최소화하고 데이터 무결성을 유지하기 위한 기술입니다.
하지만 Indexed DB에서는 조인 연산이 지원되지 않으므로, 데이터를 비정규화하여 저장하는 것이 더 효율적일 수 있습니다.
비정규화된 데이터는 읽기 성능은 향상되지만, 데이터 업데이트 시 일관성을 유지하는 데 주의해야 합니다.
5.
버전 관리:
Indexed DB는 데이터베이스 스키마의 변경 사항을 버전으로 관리합니다.
스키마를 변경할 때는 데이터베이스의 버전을 증가시키고, 변경된 내용을 반영해야 합니다.
이전 버전의 데이터베이스를 새 버전으로 마이그레이션하는 과정이 필요할 수 있습니다.
6.
트랜잭션 설계:
데이터의 일관성과 무결성을 유지하기 위해 트랜잭션을 적절히 사용해야 합니다.
읽기 전용 트랜잭션은 동시에 여러 개 실행될 수 있지만, 쓰기 트랜잭션은 독점적으로 실행됩니다.
트랜잭션의 범위를 최소화하여 잠금 경합을 줄이는 것이 좋습니다.
7.
에러 처리:
Indexed DB의 비동기 특성상, 에러 처리에 주의를 기울여야 합니다.
트랜잭션 내에서 발생한 에러를 적절히 처리하고, 필요한 경우 트랜잭션을 중단해야 합니다.
에러 상황에 대한 적절한 사용자 피드백을 제공하는 것도 중요합니다.
8.
모델링
Indexed DB의 스키마 설계와 데이터 모델링은 애플리케이션의 요구사항에 따라 달라질 수 있으므로, 위의 내용을 참고하여 적절히 적용해야 합니다. 또한, 데이터베이스 성능, 브라우저 호환성, 보안 등의 측면도 고려해야 합니다.
추상화 라이브러리의 도움받기
Promise Wrapper의 필요성
Zustand 와 결합
Dexie
Indexed DB는 웹 브라우저에서 대량의 구조화된 데이터를 저장하고 관리하기 위한 저수준 API입니다. Indexed DB는 NoSQL 처럼으로 트랜잭션을 통해 데이터를 읽고 쓰고 삭제할 수 있습니다.
장점
Web Storage는 적은 양의 데이터를 저장하는데 유용하지만, 대량의 데이터를 처리해야 하는 웹 애플리케이션에서는 Indexed DB를 사용하여 데이터를 효율적으로 관리하고 검색할 수 있습니다.
Indexed DB는 사이트의 오리진(origin: 도메인이나 서브 도메인)에 유니크 하며, 다른 도메인에서 접근 불가능한 특징을 갖고 있습니다. 따라서 브라우저의 다른 스토리지(session, local)에 비해 안전하게 관리할 수 있습니다.
또한 브라우저의 다른 스토리지는 저장할 수 있는 용량의 한계가 있고, 작습니다. 하지만 indexed db는 브라우저가 저장된 디스크의 상황에 따라 저장 할 수 있는 용량의 한계가 다릅니다.
가령 크롬 또는 크롬 기반의 브라우저가 80% 의 디스크 공간을 사용 할 수 있다면, 컴퓨터의 공간이 100 기가바이트 일 때, 80기가 바이트의 용량을 하나의 오리진에서 사용할 수 있습니다.
Indexed db는 서버에서 설치, 접근 제어 등 복잡한 인프라에 대한 고려의 필요가 없이 브라우저가 표준으로 지원하는 범위 내에서 유용하게 사용할 수 있습니다.
단점
데이터베이스를 설계하는 방법(인덱싱, 비정규화 등)에 따라 데이터를 쿼리하는 속도가 다를 수 있으며, 때에 따라 서비스의 메인 데이터베이스의 데이터와 Indexed db와의 데이터간 차이가 발생하지 않도록 무결성과 정합성을 고려해야합니다.
하지만 Indexed DB는 브라우저에서 지원하는 저수준 API이므로, 사용 시 비동기 처리, 트랜잭션 관리, 에러 핸들링 등에 주의를 기울여야 합니다. 또한, Indexed DB는 브라우저 간 호환성 문제가 있을 수 있으므로, 크로스 브라우저 지원을 고려해야 합니다. (일부 브라우저의 시크릿 모드에서 Indexed DB가 정상 동작하지 않을 수 있습니다.)
특징
1.
비동기 API: Indexed DB의 모든 작업은 비동기적으로 처리되므로 메인 스레드를 블로킹하지 않습니다.
2.
객체 지향 데이터베이스: Indexed DB는 JavaScript 객체를 저장하고 검색할 수 있는 객체 지향 데이터베이스입니다.
3.
트랜잭션 기반: 모든 데이터베이스 작업은 트랜잭션 내에서 수행되어 데이터 무결성을 보장합니다.
4.
스키마 기반: Indexed DB는 객체 저장소(object store)와 인덱스를 사용하여 데이터를 구조화합니다.
5.
키-값 쌍: 각 객체는 고유한 키와 연결되어 저장되며, 이를 통해 빠른 검색과 업데이트가 가능합니다.
개념 및 용어
개념
데이터베이스(Database)
객체 저장소(Object Store)
인덱스(Index)
트랜잭션(Transaction)
커서(Cursor)
키 범위(Key Range)
버전 관리(Versioning)
데이터베이스(Database)
indexed DB의 가장 큰 단위로, 객체 저장소(Object Store)를 포함하고 있으며 특정 오리진 내에서 다수의 데이터 베이스를 생성 할 수 있습니다. Indexedb는 별도의 schema 단위를 사용하지 않습니다.
객체 저장소(Object Store)
다른 관계형 데이터베이스의 테이블과 유사한 단위로 데이터베이스 내에서 데이터를 저장하는 저장소 입니다.
하나의 객체 저장소에는 다양한 타입의 데이터를 저장할 수 있으며, 관계형 데이터베이스처럼 특정 타입을 보장하지 않습니다.
가령 데이터베이스의 학생 테이블에 age 라는 숫자 타입의 행(필드)가 존재한다면 숫자가 들어갈 것을 예상하지만, Indexed DB에서는 17, “seventeen”, “undefined” 등 특정 타입을 보장하지 않습니다.
또한 꼭 JSON 기반의 타입일 필요 없이 javascript의 array buffer, blob과 같은 데이터를 저장할 수 있습니다.
인덱스(Index)
Indexed DB의 인덱스는 객체 저장소에 저장된 데이터를 효율적으로 검색하고 정렬하기 위해 사용되는 메커니즘입니다. 인덱스를 사용하면 객체 저장소의 특정 속성이나 속성의 조합을 기준으로 데이터를 빠르게 찾을 수 있습니다.
가령 데이트베이스에 학생에 대한 정보를 과목과, 학년 정보를 바탕으로 빠르게 불러 올 수 있습니다.
트랜잭션(Transaction)
Indexed DB의 읽기 또는 쓰기 등의 모든 행위는 트랜잭션 내에서 관리됩니다. 트랜잭션은 하나 또는 여러 행동의 묶음으로 볼 수 있으며, 이를 통해 데이터베이스의 무결성을 보장할 수 있습니다. 만약 하나의 트랜잭션이 실패하면 트랜잭션의 내의 정의된 모든 행위는 데이터베이스에 반영되지 않고 롤백 되며 데이터베이스를 트랜잭션의 이전으로 되돌릴 수 있습니다. 트랜잭션을 통해 ACID(원자성, 일관성, 독립성, 지속성)를 지킬 수 있습니다.
커서(Cursor)
Indexed DB에서 커서는 객체 저장소 또는 인덱스의 데이터를 순회하고 접근하는 데 사용되는 메커니즘입니다. 커서를 사용하면 데이터베이스의 데이터를 하나씩 읽어올 수 있으며, 필요에 따라 데이터를 수정하거나 삭제할 수도 있습니다.
자주 사용하는 메서드
open(): 데이터베이스를 열거나 생성합니다.
onerror: 데이터베이스 작업 중 오류가 발생했을 때 트리거되는 이벤트입니다.
onsuccess: 데이터베이스 작업이 성공적으로 완료되었을 때 트리거되는 이벤트입니다.
onupgradeneeded: 데이터베이스 버전이 변경되었을 때 트리거되는 이벤트입니다.
createObjectStore() : 객체 저장소를 생성합니다.
transaction(): 트랜잭션을 생성합니다.
objectStore(): 객체 저장소에 접근합니다.
add()/put(): 객체 저장소에 데이터를 추가하거나 수정합니다.
get()/getAll(): 객체 저장소에서 데이터를 검색합니다.
delete(): 객체 저장소에서 데이터를 삭제합니다.
createIndex()/index(): 객체 저장소에 인덱스를 생성하거나 접근합니다.
커서
커서를 사용하여 데이터베이스를 순회할 수 있습니다.
고려사항
1.
데이터 구조 정의:
애플리케이션에서 사용할 데이터의 구조를 정의합니다.
객체 저장소(Object Store)를 식별하고, 각 저장소에 저장될 객체의 속성을 결정합니다.
객체 간의 관계를 파악하고, 필요한 경우 외래 키와 같은 참조 속성을 정의합니다.
2.
키(Key) 설계:
각 객체 저장소에는 고유한 키가 필요합니다.
키는 객체를 식별하고 검색하는 데 사용되므로, 적절한 키 값을 선택해야 합니다.
키는 단순한 값(예: 숫자, 문자열)일 수도 있고, 복합 키(여러 속성의 조합)일 수도 있습니다.
자동 증가 키(auto-increment key)를 사용하여 고유한 식별자를 생성할 수도 있습니다.
3.
인덱스 설계:
빠른 검색을 위해 객체 저장소의 특정 속성에 인덱스를 생성할 수 있습니다.
인덱스는 데이터 검색 성능을 향상시키지만, 저장 공간을 추가로 사용하므로 적절히 사용해야 합니다.
자주 검색되는 속성이나 정렬이 필요한 속성에 인덱스를 생성하는 것이 좋습니다.
4.
데이터 정규화와 비정규화:
데이터 정규화는 중복을 최소화하고 데이터 무결성을 유지하기 위한 기술입니다.
하지만 Indexed DB에서는 조인 연산이 지원되지 않으므로, 데이터를 비정규화하여 저장하는 것이 더 효율적일 수 있습니다.
비정규화된 데이터는 읽기 성능은 향상되지만, 데이터 업데이트 시 일관성을 유지하는 데 주의해야 합니다.