Connection, PreparedStatement, ResultSet 등을 수동으로 처리특징
예시 : 학습 목적, 단순하고 성능 중심의 프로젝트
특징
EntityManager로 트랜잭션 관리예시 : 유지보수 많은 웹/엔터프라이즈 앱, 도메인 중심 설계
특징
@Entity, @Table 등 JPA 표준 어노테이션 지원예시 : 성능 최적화가 필요한 대규모 프로젝트, 커스터마이징이 필요한 경우
특징
JpaRepository, CrudRepository 제공findByName, findAllByOrderByDateDesc() 등 메서드 이름으로 쿼리 자동 생성예시 : 빠른 개발, CRUD 중심의 프로젝트, 유지보수가 중요한 경우
특징
예시 : SQL 제어가 중요한 프로젝트, DB 중심 설계, 정교한 쿼리가 중요한 금융/통계 시스템
| 구분 | JDBC | MyBatis | JPA | Hibernate | Spring Data JPA |
|---|---|---|---|---|---|
| 분류 | 저수준 API | SQL 매퍼 프레임워크 | ORM (표준) | ORM (구현체) | ORM + 자동화 도구 |
| 쿼리 작성 | 직접 SQL 작성 | 직접 SQL(XML/어노테이션) 작성 | 직접 작성 ❌ (JPQL or 자동 생성) | 직접 작성 가능 | 자동 생성 + 필요시 JPQL/native SQL 사용 |
| 매핑 방식 | 없음 | 수동 매핑 (<resultMap>) | Entity 기반 자동 매핑 | Entity 기반 자동 매핑 | Entity 기반 + 메서드 명 자동 매핑 |
| 학습 난이도 | 낮음 (직접 구현 많음) | 중간 | 중간~높음 | 높음 | 가장 쉬움 |
| 코드 양 | 많음 | SQL은 많고 Java 코드는 간결 | 적당 | 많을 수 있음 | 매우 적음 |
| 커스터마이징 | 가능하지만 어렵고 번거로움 | 자유롭게 가능 | 제한적 (설정 필요) | 유연하게 가능 | 제약이 있으나 QueryDSL 등으로 보완 가능 |
| 성능 튜닝 | 수동 | SQL 직접 튜닝 가능 | 기본 전략 + 일부 제어 가능 | 다양한 전략 지원 | Hibernate 기반 튜닝 적용 가능 |
| 대표 사용 상황 | 단순한 앱, 학습용 | 복잡 쿼리 중심 앱, 성능 제어 필요 시 | 객체 중심 설계 앱, 도메인 주도 설계 | JPA 한계 보완이 필요할 때 | 생산성 우선, 빠른 개발이 필요한 경우 |
| 상황 | 추천 기술 | 이유 |
|---|---|---|
| DB에서 복잡한 SQL 로직을 주도하고 싶다 | MyBatis | SQL 제어 가능, 성능 관리에 유리 |
| 단순 CRUD 중심의 REST API를 빠르게 만들고 싶다 | Spring Data JPA | 메서드만 정의하면 쿼리 자동 생성 |
| 도메인 모델 중심의 설계를 하고 싶다 | JPA | 객체 중심, 유지보수 용이 |
| 실시간 최적화가 중요하고 캐시나 Lazy Loading이 중요하다 | Hibernate | ORM 고급 기능 제공 |
| 모든 것을 내 손으로 직접 구현해보고 싶거나 성능 테스트용으로 사용하고 싶다 | JDBC | 가장 원시적이고 유연함 |
Spring Data JPA
↓
JPA (API)
↓
Hibernate (JPA 구현체)
↓
JDBC (Java 기본 DB 접근 기술)
↓
DB
MyBatis → JDBC → DB