브라우저에서 로컬 데이터를 안전하게 저장하고 효율적으로 관리하려면 IndexedDB가 유용합니다. 관계형 데이터베이스처럼 트랜잭션과 버전 관리를 지원하며, Blob 데이터도 저장할 수 있어 이미지, 동영상 등 큰 파일도 다룰 수 있습니다. 이번 글에서는 IndexedDB 설계 경험과 베스트 프랙티스를 상세히 소개합니다.
1. 데이터베이스 생성과 버전 관리
IndexedDB는 데이터베이스 버전을 관리하며, 업그레이드 시 스키마를 정의할 수 있습니다.
const request = indexedDB.open('myDB', 1);
request.onupgradeneeded = (event) => {
const db = event.target.result;
db.createObjectStore('users', { keyPath: 'id', autoIncrement: true });
};
2. 트랜잭션과 객체 저장소
트랜잭션 단위로 읽기/쓰기 작업을 수행해야 데이터 일관성을 유지할 수 있습니다. 읽기, 쓰기, 읽기-쓰기 트랜잭션을 적절히 사용하고 에러 핸들링을 구현했습니다.
const transaction = db.transaction('users', 'readwrite');
const store = transaction.objectStore('users');
store.add({ name: 'Alice', age: 25 });
3. Blob과 대용량 데이터 저장
IndexedDB는 이미지, 동영상 등 Blob 데이터를 저장할 수 있어, 서버 없이도 클라이언트에서 완전한 캐싱과 오프라인 지원이 가능합니다. 실제로 업로드한 파일을 IndexedDB에 저장하고 필요 시 불러와 화면에 표시하는 기능을 구현했습니다.
4. 실무 설계 경험
프로젝트에서는 오프라인 모드에서 사용자 작성 데이터를 저장하고, 네트워크 복원 시 서버와 동기화하는 로직을 만들었습니다. IndexedDB 트랜잭션과 버전 관리 덕분에 데이터 손실 없이 안정적인 동기화가 가능했습니다.
5. 결론
IndexedDB를 활용하면 클라이언트에서 신뢰성 있는 로컬 저장소를 설계할 수 있으며, Blob 처리, 트랜잭션, 버전 관리 등 핵심 기능을 잘 이해하고 적용하면 안정적인 웹앱을 만들 수 있습니다.