HTML - IndexedDB: 브라우저 내 개인 데이터베이스

안녕하세요, 미래의 웹 개발자 여러분! 오늘 우리는 IndexedDB라는 흥미로운 세상으로 뛰어들어 볼 거예요. 여러분의 친절한 이웃 컴퓨터 교사로서, 저는 여러분이 코드를 한 줄도 적지 않았더라도 이 여정을 안내해 드릴 거예요. 그러니 가상의 안전帽을 쓰고, 시작해 보세요!

HTML - IndexedDB

IndexedDB는 무엇인가요?

IndexedDB는 여러분의 웹 브라우저에 살아있는 작은 데이터베이스입니다. 컴퓨터 안에 작은 파일장을 가지고 있어서, 여러분의 웹 애플리케이션을 위한 다양한 정보를 저장하고 정리할 수 있다고 상상해 보세요. 멋지죠?

IndexedDB를 사용하는 이유는 무엇인가요?

여러분은 "데이터를 저장하는 또 다른 방법이 필요한 이유가 뭐야?"라고 궁금해할 수도 있습니다. 그럼 작은 이야기를 들려드릴게요. 예전에는 브라우저 내 데이터를 저장하기 위해 쿠키와 로컬 스토리지를 사용했어요. 하지만 그것은 코딩 상자에 코끼리를 넣는 것처럼 제한적이고 유연하지 않았습니다.

IndexedDB가 브라우저 스토리지의 슈퍼 헴은 이유는 다음과 같습니다:

기능 설명
저장 용량 쿠키나 로컬 스토리지보다 훨씬 더 많은 데이터를 저장할 수 있습니다
데이터 타입 파일과 블롭을 포함한 다양한 데이터 타입을 지원합니다
인덱싱 데이터를 빠르게 검색할 수 있습니다
트랜잭션 트랜잭션 기반 연산으로 데이터 무결성을 보장합니다
비동기 데이터를 처리할 때 애플리케이션이 동결되지 않습니다

IndexedDB 시작하기

이제 손을 dirt고 실제 코드로 시작해 보겠습니다. 처음에는 어렵게 보일 수 있지만, 단계별로 설명해 드릴게요.

let db;
const request = indexedDB.open("MyFirstDatabase", 1);

request.onerror = function(event) {
console.error("데이터베이스 오류: " + event.target.error);
};

request.onsuccess = function(event) {
db = event.target.result;
console.log("데이터베이스 성공적으로 열렸습니다");
};

request.onupgradeneeded = function(event) {
db = event.target.result;
const objectStore = db.createObjectStore("students", { keyPath: "id" });
console.log("오브젝트 스토어 생성");
};

와우! 이것은 많이 받아들이기 어려울 수 있습니다. 이제 설명해 보겠습니다:

  1. db 변수를 선언하여 데이터베이스 연결을 저장합니다.
  2. indexedDB.open()을 사용하여 "MyFirstDatabase"라는 데이터베이스를 엽니다.
  3. 세 가지 이벤트 처리기를 설정합니다:
  • onerror: 문제가 발생했을 때 실행됩니다.
  • onsuccess: 데이터베이스가 성공적으로 열렸을 때 실행됩니다.
  • onupgradeneeded: 데이터베이스가 생성되거나 업그레이드되었을 때 실행됩니다.

onupgradeneeded는 데이터베이스 설계자라고 생각해 보세요. 여기서 우리는 데이터베이스 구조를 설계합니다.

IndexedDB에 데이터 추가하기

이제 데이터베이스를 설정했으니, 데이터를 추가해 보겠습니다. 학생 관리 시스템을 만들어 보겠습니다.

function addStudent(student) {
const transaction = db.transaction(["students"], "readwrite");
const objectStore = transaction.objectStore("students");
const request = objectStore.add(student);

request.onerror = function(event) {
console.log("학생 추가 오류: " + event.target.error);
};

request.onsuccess = function(event) {
console.log("학생 성공적으로 추가됨");
};
}

// 사용 예시
addStudent({ id: 1, name: "Alice", grade: "A" });
addStudent({ id: 2, name: "Bob", grade: "B" });

이제 무엇이 일어나고 있는지 설명해 보겠습니다:

  1. 트랜잭션을 생성합니다 - 데이터를 안전하게 처리하는 터널이라고 생각해 보세요.
  2. 오브젝트 스토어를 가져옵니다 (전통적인 데이터베이스의 테이블과 같습니다).
  3. add()를 사용하여 학생 데이터를 삽입합니다.
  4. 성공과 오류 처리기를 설정하여 작업이 잘되었는지 확인합니다.

IndexedDB에서 데이터 가져오기

저장된 데이터가 없으면 무슨 소용이 있을까요? 학생 데이터를 가져오겠습니다:

function getStudent(id) {
const transaction = db.transaction(["students"]);
const objectStore = transaction.objectStore("students");
const request = objectStore.get(id);

request.onerror = function(event) {
console.log("학생 가져오기 오류: " + event.target.error);
};

request.onsuccess = function(event) {
if (request.result) {
console.log("학생 찾음:", request.result);
} else {
console.log("학생 찾지 못함");
}
};
}

// 사용 예시
getStudent(1);

이 함수는 도서관에서 책을 찾아주는 도서관사원과 같습니다:

  1. 읽기 전용 트랜잭션을 시작합니다 (데이터를 변경하지 않습니다).
  2. get()을 사용하여 학생의 ID로 데이터를 검색합니다.
  3. 학생을 찾으면 자세히 로그를 남기고, 찾지 못하면 학생이 없다고 말합니다.

IndexedDB에서 데이터 업데이트하기

학생들은 성적이 향상되고, 학점이 바뀝니다. 우리는 기록을 업데이트해 보겠습니다:

function updateStudent(id, newGrade) {
const transaction = db.transaction(["students"], "readwrite");
const objectStore = transaction.objectStore("students");
const request = objectStore.get(id);

request.onerror = function(event) {
console.log("학생 업데이트를 위해 학생 가져오기 오류: " + event.target.error);
};

request.onsuccess = function(event) {
const data = event.target.result;
data.grade = newGrade;

const updateRequest = objectStore.put(data);

updateRequest.onerror = function(event) {
console.log("학생 업데이트 오류: " + event.target.error);
};

updateRequest.onsuccess = function(event) {
console.log("학생 성공적으로 업데이트됨");
};
};
}

// 사용 예시
updateStudent(1, "A+");

이 함수는 교사가 성적부를 업데이트하는 것과 같습니다:

  1. 학생의 현재 데이터를 가져옵니다.
  2. 학점을 수정합니다.
  3. put()을 사용하여 업데이트된 데이터를 데이터베이스로 저장합니다.

IndexedDB에서 데이터 삭제하기

때로는 데이터를 제거해야 합니다. 학생을 제거하는 함수를 추가해 보겠습니다:

function deleteStudent(id) {
const transaction = db.transaction(["students"], "readwrite");
const objectStore = transaction.objectStore("students");
const request = objectStore.delete(id);

request.onerror = function(event) {
console.log("학생 삭제 오류: " + event.target.error);
};

request.onsuccess = function(event) {
console.log("학생 성공적으로 삭제됨");
};
}

// 사용 예시
deleteStudent(2);

이것은 우리의 학생 기록에서 항목을 지우는 것과 같습니다:

  1. "readwrite" 트랜잭션을 시작합니다 (데이터를 변경합니다).
  2. delete() 메서드를 사용하여 학생의 ID로 데이터를 제거합니다.
  3. 성공과 오류 처리기를 설정하여 작업이 잘되었는지 확인합니다.

결론

축하합니다! 여러분은 IndexedDB의 세계로 첫 걸음을 내딛었습니다. 우리는 데이터베이스 생성, 추가, 가져오기, 업데이트, 삭제에 대한 기본적인 연산을 다루었습니다. 이러한 연산은 IndexedDB를 사용할 때 반복적으로 사용할 것입니다.

기억하시오, 연습이 완성을 이루는 길입니다. IndexedDB를 사용한 자신만의 작은 프로젝트를 만들어 보세요. 아마도 할 일 목록 앱이나 개인 일기장이 될 수 있습니다. 자주 놀아보면 점점 더 편안해질 것입니다.

IndexedDB는처음에는 복잡해 보일 수 있지만, 웹 애플리케이션을 다음 단계로 이끄는 강력한 도구입니다. 브라우저 내에서 대량의 데이터를 저장하고 관리할 수 있는 초능력 같은 것입니다.

계속 코딩하시고, 호기심을 유지하시고, 과정에서 즐거움을 느끼세요! 누구 knows? 다음 큰 웹 앱이 여러분의 손에 있을지도 모릅니다.

Credits: Image by storyset