본문 바로가기

프론트

[HTML5] IndexedDB란?

728x90

IndexedDB란?

웹 스토리지에 포함된 로컬 스토리지 / 세션 스토리지의 단점을 보완한 API라고 생각하면 된다.

만약, 로컬 스토리지 / 세션 스토리지에 대해 잘 모르겠다면 블로그 글을 한번 보고 오면 된다.

IndexedDB는 브라우저에 내장된 비관계현(NoSQL) DB로, 클라이언트 측에서 대용량의 구조화된 데이터를 저장하고 검색할 수 있는 웹 API다.

왜 사용할까?

   
기능 설명
대용량 저장 가능 수십 MB에서 수백 MB까지 저장 가능
객체 저장 가능 JSON 객체 전체를 key-value 형태로 저장
비동기 처리 저장/조회/삭제 등 모든 작업이 비동기 처리
인덱스 검색 지원 특정 필드 기준으로 빠르게 검색 가능
오프라인 지원 서버 연결 없이도 작동 가능 (PWA 활용)

IndexedDB 구조

IndexedDB는 DB → 객체 저장소 → 데이터 항목 과 같은 구조로 이뤄져 있다.

  • Database: 하나의 IndexedDB 인스턴스
  • Object Store: 테이블과 유사한 데이터 저장소
  • Object: 데이터가 담긴 객체

IndexedDB 사용해보기

대충 어떻게 생긴 구조인지도 알았고, 왜 사용하는지도 알겠으니 어떻게 쓰는지 알아보겠다.

IndexedDB는 브러우저 전용 기능이기 때문에, 다른 개발환경에서는 확인이 불가능하기 때문에 크롬에서 사용해보도록 하겠다.

물론, IDE를 통해 HTML/JS 코드를 작성한 뒤 IndexedDB에 CRUD 되는지 확인은 가능하다.

1. DB 열기

F12를 눌러 개발자 도구를 연 다음 어플리케이션에 들어가면 IndexedDB가 존재한다.

2. JavaScript로 IndexedDB 생성하기

users란 Object Store(테이블)를 가진 myDB를 만들어보겠다.

// 1. DB 열기
const request = indexedDB.open("myDB", 1);

// 2. 업그레이드될 때(최초 생성 포함) object store 생성
request.onupgradeneeded = function (event) {
  const db = event.target.result;
  // 'users'라는 Object Store 생성 (id를 key로 사용)
  const store = db.createObjectStore("users", { keyPath: "id" });
  console.log("Object Store 'users' 생성됨");
};

// 3. 성공적으로 DB 연결되면 데이터 추가
request.onsuccess = function (event) {
  const db = event.target.result;
  const tx = db.transaction("users", "readwrite");
  const store = tx.objectStore("users");

  store.add({ id: 1, name: "홍길동", age: 100 });
  store.add({ id: 2, name: "admin", age: 35 });

  console.log("데이터 추가 완료");
};

위 코드를 콘솔에 입력해주고 실행하면 아래와 같은 화면이 나온다.

3. IndexedDB 데이터 확인

이제 데이터가 잘 들어갔는지 확인해보자.

아까 봤던 개발자 도구에서 IndexedDB를 보면 데이터가 잘 들어가 있는게 확인된다.

4. IndexedDB 데이터 조회

특정 ID로 데이터를 조회해보자.

const request = indexedDB.open("myDB", 1);

request.onsuccess = function (event) {
  const db = event.target.result;
  const tx = db.transaction("users", "readonly");
  const store = tx.objectStore("users");

  const getRequest = store.get(1);  // ID가 1인 사용자 조회

  getRequest.onsuccess = function () {
    console.log("조회 결과:", getRequest.result);
  };
};

위 코드를 콘솔에 입력하고 실행하면 아래처럼 결과가 나온다.

5. IndexedDB 데이터 수정

데이터 수정 중에서 기존 ID 값을 덮어쓰는 put()을 사용해보자

put()의 경우 ID가 존재할 경우 데이터를 수정(Update)하고 없다면 추가(Create)한다.

const request = indexedDB.open("myDB", 1);

request.onsuccess = function (event) {
  const db = event.target.result;
  const tx = db.transaction("users", "readwrite");
  const store = tx.objectStore("users");

  const updatedUser = { id: 1, name: "이순신", age: 200 };  // id=1 사용자 수정
  const putRequest = store.put(updatedUser);

  putRequest.onsuccess = function () {
    console.log("수정 완료");
  };
};

위 코드를 콘솔에 입력하고 실행하면 아래처럼 결과가 나온다.

이후 IndexdDB에서 새로고침을 클릭하면 수정된것을 확인할 수 있다.

6.IndexedDB 데이터 삭제

이번에는 특정 ID의 데이터를 삭제해보겠다.

const request = indexedDB.open("myDB", 1);

request.onsuccess = function (event) {
  const db = event.target.result;
  const tx = db.transaction("users", "readwrite");
  const store = tx.objectStore("users");

  const deleteRequest = store.delete(2);  // ID가 2인 사용자 삭제

  deleteRequest.onsuccess = function () {
    console.log("삭제 완료");
  };
};

위 코드를 콘솔에 입력하고 실행하면 아래처럼 결과가 나온다.

또한 IndexedDB에서도 데이터가 삭제된것을 확인할 수 있다.

7. IndexedDB 삭제

이제 테스트 했던 myDB를 IndexedDB에서 삭제해서 초기 상태로 돌아가보자

이렇게 삭제하지 않을 경우 로컬 스토리지에 계속해서 데이터를 차지하고 있기 때문에 사용하지 않는 데이터는 삭제해주는것이 좋다.

const deleteRequest = indexedDB.deleteDatabase("myDB");

deleteRequest.onsuccess = function () {
  console.log("✅ 데이터베이스 삭제 완료 (초기화됨)");
};

deleteRequest.onerror = function () {
  console.error("❌ 삭제 중 오류 발생");
};

deleteRequest.onblocked = function () {
  console.warn("⚠️ 다른 탭에서 DB를 사용 중이라 삭제가 지연됨");
};

위 코드를 콘솔에 입력하고 실행하면 아래처럼 결과가 나온다.

참고로 IndexdDB를 사용할때는 회원기능과 같이 사용하여 사용자가 로그아웃 할 경우 로그인 정보를 제거하거나, 초기화 버튼을 따로 만들어 둬서 버튼을 클릭하면 모든 데이터를 제거하는 등 다양한 방식으로 데이터를 초기화해줘야 한다.

728x90

'프론트' 카테고리의 다른 글

[JavaScript] 프론트에서의 비동기 통신  (0) 2025.05.18
[JavaScript] JSON이란?  (0) 2025.05.18
[HTML5] 웹 스토리지 (Web Storage)  (0) 2025.05.15
[JavaScript] 이벤트 처리 및 DOM 조작  (0) 2025.05.13
[JavaScript] 변수 선언  (0) 2025.05.12