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** ```java 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** ```java 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** ```java 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: `com.h2databaseh2` - SQLite: `org.xerialsqlite-jdbc` --- ### **6. 언제 무엇을 사용할까?** - **Java DB**: - 순수 Java 환경을 선호하며, 서버 모드와 임베디드 모드를 모두 필요로 할 때. - 안정성과 표준 준수가 중요한 경우. - **H2**: - 테스트 환경(예: 단위 테스트) 또는 빠른 프로토타이핑이 필요할 때. - Java 기반 고급 기능(사용자 정의 함수 등)이 필요할 때. - **SQLite**: - 모바일 또는 초경량 임베디드 애플리케이션에 적합. - 네트워크 연결이 필요 없고, 단순한 파일 기반 저장소가 필요한 경우. --- ### **결론** - **성능과 테스트**: H2가 가장 빠르고 유연하며, Java 생태계와의 통합이 뛰어남. - **경량성과 범용성**: SQLite는 모바일 및 임베디드 환경에서 입증된 선택. - **안정성과 표준**: Java DB는 안정적이고 표준 준수도가 높아 신뢰성 있는 선택. 프로젝트 요구사항(성능, 크기, 네트워크 지원 여부 등)에 따라 선택하면 됩니다. 추가 질문이 있다면 말씀해주세요!