Files
java-examples/docs/database/database.md
2025-03-12 10:43:35 +09:00

8.3 KiB

Java에서 사용되는 데이터베이스 중 Java DB(Apache Derby), H2 Database, 그리고 SQLite는 각각 임베디드 데이터베이스로 널리 사용되며, 각기 다른 특징과 장단점을 가지고 있습니다. 아래에서 이 세 가지를 주요 항목별로 비교하여 설명하겠습니다.


1. 개요

항목 Java DB (Apache Derby) H2 Database SQLite
개발 언어 Java Java C
라이선스 Apache License 2.0 MPL 2.0 / EPL 1.0 Public Domain
주요 용도 임베디드 및 경량 서버 애플리케이션 임베디드, 테스트, 경량 서버 애플리케이션 임베디드 애플리케이션 (모바일 포함)
최초 출시 2004년 (IBM Cloudscape에서 파생) 2005년 2000년
  • Java DB: IBM의 Cloudscape에서 파생된 Apache Derby로, 순수 Java로 작성된 관계형 데이터베이스.
  • H2: Java로 작성된 고속, 경량 데이터베이스로, 특히 테스트 환경에서 인기.
  • SQLite: C로 작성된 초경량 데이터베이스로, 모바일 및 임베디드 환경에서 널리 사용.

2. 기능 비교

항목 Java DB H2 SQLite
임베디드 모드 지원 지원 지원
서버 모드 지원 (네트워크 연결 가능) 지원 (TCP 기반) 미지원 (파일 기반만 가능)
인메모리 지원 지원 지원 (빠른 성능) 지원
SQL 표준 준수 높음 (SQL-92, SQL-99 지원) 매우 높음 (다양한 SQL 기능 지원) 중간 (일부 고급 기능 미지원)
트랜잭션 ACID 준수 ACID 준수 ACID 준수
사용자 관리 지원 (username/password) 지원 미지원 (파일 접근 기반)
최대 DB 크기 이론상 JVM 한계 (수 TB) 4TB 281TB
  • Java DB: 서버 모드와 임베디드 모드 모두 지원하며, SQL 표준 준수도가 높음.
  • H2: 서버 모드와 인메모리 모드를 지원하며, Java 함수 실행 등 고급 기능 제공.
  • SQLite: 서버 모드는 없고, 파일 기반으로 동작하며 사용자 인증 기능이 없음.

3. 성능

  • Java DB: 순수 Java로 작성되어 JVM에 의존적이며, 중간 정도의 성능. 대규모 데이터 처리 시 속도가 느려질 수 있음.
  • H2: 인메모리 모드에서 매우 빠르며, Hibernate와 같은 ORM과의 통합에서 SQLite보다 우수한 성능을 보임(특히 쿼리 실행 속도).
  • SQLite: C로 작성되어 네이티브 성능이 뛰어나지만, 복잡한 쿼리나 동시성 처리에서 약간 뒤질 수 있음.

참고: Hibernate와 결합 시 H2가 SQLite보다 평균적으로 3~8배 빠르다는 벤치마크 결과가 있음(JPAB.org).


4. 장단점

Java DB (Apache Derby)

  • 장점:
    • 순수 Java로 작성되어 플랫폼 독립적.
    • 서버 모드와 임베디드 모드 모두 지원.
    • 안정적이고 상용 소프트웨어에서도 사용됨.
  • 단점:
    • SQLite나 H2에 비해 느린 성능.
    • 커뮤니티 활동이 상대적으로 적음.

H2 Database

  • 장점:
    • 순수 Java로 작성, 설치 및 통합이 쉬움.
    • 인메모리 모드에서 빠른 속도, 테스트에 이상적.
    • 사용자 정의 Java 함수 지원.
    • 서버 모드와 네트워크 접근 가능.
  • 단점:
    • 비정상 종료 시 MVStore 손상 가능성.
    • SQLite에 비해 커뮤니티와 사용 사례가 적음.

SQLite

  • 장점:
    • 초경량(라이브러리 크기 약 700KB).
    • C로 작성되어 네이티브 성능 우수.
    • 모바일(Android, iOS) 및 임베디드 환경에서 검증됨.
    • 매우 큰 데이터베이스 크기 지원(281TB).
  • 단점:
    • 서버 모드 미지원, 네트워크 접근 불가.
    • 사용자 인증/권한 관리 없음.
    • 복잡한 SQL 기능(예: RIGHT OUTER JOIN) 미지원.

5. 사용 예제 (Java에서 연결)

Java DB

import java.sql.*;

public class JavaDBExample {
    public static void main(String[] args) throws Exception {
        String url = "jdbc:derby:memory:myDB;create=true";
        Connection conn = DriverManager.getConnection(url);
        Statement stmt = conn.createStatement();
        stmt.execute("CREATE TABLE test (id INT, name VARCHAR(50))");
        stmt.execute("INSERT INTO test VALUES (1, 'JavaDB')");
        ResultSet rs = stmt.executeQuery("SELECT * FROM test");
        while (rs.next()) {
            System.out.println(rs.getInt("id") + ": " + rs.getString("name"));
        }
        conn.close();
    }
}

H2

import java.sql.*;

public class H2Example {
    public static void main(String[] args) throws Exception {
        String url = "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1";
        Connection conn = DriverManager.getConnection(url, "sa", "");
        Statement stmt = conn.createStatement();
        stmt.execute("CREATE TABLE test (id INT, name VARCHAR(50))");
        stmt.execute("INSERT INTO test VALUES (1, 'H2')");
        ResultSet rs = stmt.executeQuery("SELECT * FROM test");
        while (rs.next()) {
            System.out.println(rs.getInt("id") + ": " + rs.getString("name"));
        }
        conn.close();
    }
}

SQLite

import java.sql.*;

public class SQLiteExample {
    public static void main(String[] args) throws Exception {
        String url = "jdbc:sqlite::memory:"; // 또는 파일 경로
        Connection conn = DriverManager.getConnection(url);
        Statement stmt = conn.createStatement();
        stmt.execute("CREATE TABLE test (id INTEGER, name TEXT)");
        stmt.execute("INSERT INTO test VALUES (1, 'SQLite')");
        ResultSet rs = stmt.executeQuery("SELECT * FROM test");
        while (rs.next()) {
            System.out.println(rs.getInt("id") + ": " + rs.getString("name"));
        }
        conn.close();
    }
}

의존성 (Maven):

  • Java DB: 기본 JDK에 포함 (별도 의존성 불필요).
  • H2: <groupId>com.h2database</groupId><artifactId>h2</artifactId>
  • SQLite: <groupId>org.xerial</groupId><artifactId>sqlite-jdbc</artifactId>

6. 언제 무엇을 사용할까?

  • Java DB:
    • 순수 Java 환경을 선호하며, 서버 모드와 임베디드 모드를 모두 필요로 할 때.
    • 안정성과 표준 준수가 중요한 경우.
  • H2:
    • 테스트 환경(예: 단위 테스트) 또는 빠른 프로토타이핑이 필요할 때.
    • Java 기반 고급 기능(사용자 정의 함수 등)이 필요할 때.
  • SQLite:
    • 모바일 또는 초경량 임베디드 애플리케이션에 적합.
    • 네트워크 연결이 필요 없고, 단순한 파일 기반 저장소가 필요한 경우.

결론

  • 성능과 테스트: H2가 가장 빠르고 유연하며, Java 생태계와의 통합이 뛰어남.
  • 경량성과 범용성: SQLite는 모바일 및 임베디드 환경에서 입증된 선택.
  • 안정성과 표준: Java DB는 안정적이고 표준 준수도가 높아 신뢰성 있는 선택.

프로젝트 요구사항(성능, 크기, 네트워크 지원 여부 등)에 따라 선택하면 됩니다. 추가 질문이 있다면 말씀해주세요!