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

164 lines
8.3 KiB
Markdown

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: `<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는 안정적이고 표준 준수도가 높아 신뢰성 있는 선택.
프로젝트 요구사항(성능, 크기, 네트워크 지원 여부 등)에 따라 선택하면 됩니다. 추가 질문이 있다면 말씀해주세요!