웹 SQL 지원 중단 및 삭제

사용자의 컴퓨터에 구조화된 방식으로 데이터를 저장할 수 있는 Web SQL Database API (내부적으로는 SQLite 데이터베이스 엔진을 기반으로 함)는 2009년 4월에 도입되었으며 2010년 11월에 폐기되었습니다. 이 기능은 Safari를 구동하는 WebKit에서 구현되고 Chrome을 구동하는 Blink 엔진에서 계속 활성 상태였지만, Firefox를 구동하는 Gecko는 이 기능을 구현하지 않았으며 2019년에 WebKit에서 이 기능을 삭제했습니다.

W3C (World Wide Web Consortium)는 웹 데이터베이스가 필요한 사용자에게 localStoragesessionStorage와 같은 Web Storage API 기술 또는 IndexedDB를 채택하도록 권장합니다. 이러한 기술은 키/값 저장소 및 구조화된 데이터와 관련하여 강점을 보이지만 강력한 쿼리 언어의 부족과 같은 약점도 있습니다. 사람들은 웹에서 SQL을 원하는 데는 이유가 있습니다.

Web SQL 지원 중단 및 삭제 단계

  • [ 완료.] Chromium 97(2022년 1월 4일)에서 서드 파티 컨텍스트에 대해 Web SQL이 지원 중단되고 삭제되었습니다.
  • [ 완료.] 비보안 컨텍스트의 Web SQL 액세스는 Chromium 105(2022년 1월 4일)부터 지원 중단되었으며, 이때 Chrome DevTools 문제 패널에 경고 메시지가 표시되었습니다.

비보안 컨텍스트에서 Web SQL을 읽는 경고가 표시되는 Chrome DevTools Issues 패널이 지원 중단되었습니다.

  • [ 완료.] 비보안 컨텍스트에서의 Web SQL 액세스는 Chromium 110(2022년 1월 4일)부터 더 이상 사용할 수 없습니다. 이 기능을 계속 사용하기 위한 기업 정책Chromium 110(2022년 1월 4일)부터 Chromium 123(2022년 1월 4일)까지 제공됩니다.
  • [ 완료.] 모든 컨텍스트의 웹 SQL 액세스가 Chromium 115(2022년 1월 4일)부터 지원 중단되며 Chrome DevTools Issue 패널에 경고 메시지가 표시됩니다.
  • [ 완료] 웹 SQL을 계속 사용할 수 있는 지원 중단 체험판Chromium 117(2022년 1월 4일)부터 Chromium 123(2022년 1월 4일)까지 제공되었습니다. 지원 중단 체험판에 대해 자세히 알아보려면 출처 체험판 시작하기를 참고하세요.
  • [ 완료.] 모든 컨텍스트에서 웹 SQL 액세스를 더 이상 사용할 수 없으며 Chromium 119부터는 사용할 수 없습니다.

다음 단계

소개에서 언급했듯이 localStoragesessionStorage와 같은 웹 Storage API 기술이나 IndexedDB 표준은 많은 경우에 적합한 대안이지만 모든 경우에 적합한 것은 아닙니다.

스토리지를 웹 개발자에게 맡기는 이유

Wasm의 출현과 함께 SQL 또는 NoSQL 솔루션이 웹에 등장할 수 있게 되었습니다. 예로는 DuckDB-Wasmabsurd-sql이 있습니다. 이러한 창작물을 바탕으로 개발자 커뮤니티는 브라우저 공급업체보다 더 빠르고 효과적으로 새로운 스토리지 솔루션을 반복하고 만들 수 있다고 생각합니다.

Web SQL을 삭제하는 것만이 아닙니다. 실제로 수정사항과 새 기능을 브라우저에 직접 도입하는 부담 없이 언제든지 업데이트할 수 있는 패키지로 제공되며 오픈소스 커뮤니티에서 유지관리하는 무언가로 대체되었습니다. Google의 목표는 개발자가 자신의 데이터베이스를 웹으로 가져올 수 있도록 하는 것입니다.

또한 이 사례가 새로운 오픈소스 데이터베이스 생태계가 번성하는 데 도움이 되기를 바랍니다. 파일 시스템 액세스 핸들의 출시로 마침내 맞춤 저장소 솔루션을 빌드할 수 있는 새로운 프리미티브가 제공됩니다.

Web SQL 지원 중단 이유

지속 가능성 및 보안 문제

Web SQL 사양은 지속 가능하게 구현할 수 없으므로 혁신과 새로운 기능이 제한됩니다. 표준의 마지막 버전에는 문자 그대로 '사용자 에이전트가 Sqlite 3.6.19에서 지원되는 SQL 언어를 구현해야 합니다'라고 명시되어 있습니다.

SQLite는 악의적인 SQL 문을 실행하도록 설계된 것은 아니지만, Web SQL을 구현하면 브라우저에서 이러한 작업을 수행해야 합니다. 보안 및 안정성 수정사항을 계속 적용해야 하므로 Chromium에서 SQLite를 업데이트해야 합니다. 이는 SQLite 3.6.19와 정확히 동작해야 한다는 웹 SQL의 요구사항과 직접 충돌합니다.

API 도형

Web SQL은 오래된 API이기도 합니다. 2000년대 후반에 등장한 이 라이브러리는 다음 코드 샘플(Nolan Lawson 제공)에서 볼 수 있듯이 '콜백 지옥'의 좋은 예입니다. 여기서 볼 수 있듯이 SQL 문 (SQLite SQL 언어 사용)은 데이터베이스 메서드에 문자열로 전달됩니다.

openDatabase(
  // Name
  'mydatabase',
  // Version
  1,
  // Display name
  'mydatabase',
  // Estimated size
  5000000,
  // Creation callback
  function (db) {
    db.transaction(
      // Transaction callback
      function (tx) {
        // Execute SQL statement
        tx.executeSql(
          // SQL statement
          'create table rainstorms (mood text, severity int)',
          // Arguments
          [],
          // Success callback
          function () {
            // Execute SQL statement
            tx.executeSql(
              // SQL statement
              'insert into rainstorms values (?, ?)',
              // Arguments
              ['somber', 6],
              // Success callback
              function () {
                // Execute SQL statement
                tx.executeSql(
                  // SQL statement
                  'select * from rainstorms where mood = ?',
                  // Arguments
                  ['somber'],
                  // Success callback
                  function (tx, res) {
                    // Do something with the result
                    var row = res.rows.item(0);
                    console.log(
                      'rainstorm severity: ' +
                        row.severity +
                        ',  my mood: ' +
                        row.mood,
                    );
                  },
                );
              },
            );
          },
        );
      },
      // Error callback
      function (err) {
        console.log('Transaction failed!: ' + err);
      },
      // Success callback);
      function () {
        console.log('Transaction succeeded!');
      },
    );
  },
);

이 코드를 실행하고 Chrome DevTools로 생성된 표를 검사하면 다음과 같은 결과가 표시됩니다.

Chrome DevTools의 웹 SQL 섹션을 검사하면 mydatabase라는 데이터베이스와 rainstorms라는 테이블이 표시되며, 이 테이블에는 분위기 (텍스트) 및 심각도 (정수) 열이 있으며, 분위기가 우울하고 심각도가 6인 항목이 하나 있습니다.

구현자 지원 부족

(적어도 오늘날의 관점에서) 난해한 API 형식 외에도 Mozilla는 SQLite를 기반으로 빌드된 웹 SQL에 관해 여러 가지 우려사항을 가지고 있었습니다.

"[SQLite] 는 일반적인 웹 콘텐츠에 노출되는 API의 적절한 기반이 아니라고 생각합니다. 무엇보다도 유용한 방식으로 SQL을 하위 집합으로 만드는 신뢰할 수 있고 널리 받아들여진 표준이 없기 때문입니다. 또한 SQLite의 변경사항이 나중에 웹에 영향을 미치지 않도록 하기 위해 SQLite에 주요 브라우저 출시 (및 웹 표준)를 활용하는 것은 현명하지 않다고 생각합니다."

Mozilla의 우려사항은 전 Mozilla 직원 블라디미르 부키체비치의 블로그 게시물에서 확인할 수 있습니다. 자세한 내용은 W3C 웹 애플리케이션 작업반 회의록(세부정보를 확인하려면 IRC 로그) 및 메일링 리스트 보관처리함을 참고하세요. 또한 노엘 로슨의 블로그 게시물에서 상황을 간략하게 확인할 수 있습니다.

의견

이 게시물에서 설명한 지원 중단 단계에 관해 우려되는 점이 있는 경우 blink-dev 메일링 리스트를 통해 알려주세요. 이 그룹은 누구나 가입할 수 있으며 누구나 게시할 수 있습니다.

감사의 말씀

이 도움말은 조 메들리, 벤 모스, 조슈아 벨이 검토했습니다.