JDBC, JPA, Hibernate, Spring Data JPA, MyBatis 비교

임유진·2025년 7월 28일

목록 보기
5/7

1. JDBC (Java Database Connectivity)

  • Java에서 데이터베이스에 직접 접근하는 API
  • SQL 문장을 직접 코드 내에서 작성
  • Connection, PreparedStatement, ResultSet 등을 수동으로 처리
  • 특징

    • 낮은 수준의 데이터 접근 API
    • 모든 DB 작업을 직접 처리하므로 유연하지만 번거로움
    • 트랜잭션, 커넥션, 예외 처리 등을 개발자가 모두 관리해야 함
  • 예시 : 학습 목적, 단순하고 성능 중심의 프로젝트


2. JPA (Java Persistence API)

  • Java 진영의 ORM(Object-Relational Mapping) 표준 인터페이스
  • SQL 대신 Entity 객체 기반으로 DB 조작
  • 특징

    • Entity 클래스 ↔ DB 테이블 매핑
    • JPQL(JPA Query Language) 사용 (객체 중심 쿼리)
    • EntityManager로 트랜잭션 관리
    • SQL 직접 작성 필요 없음 (단, 복잡 쿼리는 nativeQuery 가능)
  • 예시 : 유지보수 많은 웹/엔터프라이즈 앱, 도메인 중심 설계


3. Hibernate

  • JPA의 가장 대표적인 구현체 (실제 동작은 Hibernate가 수행)
  • 독자적인 기능 포함 (2차 캐시, N+1 방지, 지연 로딩 등)
  • 특징

    • @Entity, @Table 등 JPA 표준 어노테이션 지원
    • 자체 API(Session, Criteria 등)도 존재
    • JPA보다 더 세밀한 ORM 전략 설정 가능
  • 예시 : 성능 최적화가 필요한 대규모 프로젝트, 커스터마이징이 필요한 경우


4. Spring Data JPA

  • Spring이 JPA 사용을 더 쉽게 자동화한 프레임워크
  • 인터페이스만 작성하면 CRUD 쿼리 자동 생성
  • 특징

    • JpaRepository, CrudRepository 제공
    • findByName, findAllByOrderByDateDesc() 등 메서드 이름으로 쿼리 자동 생성
    • 페이징, 정렬, 동적 쿼리(QueryDSL)도 연동 가능
    • 비즈니스 로직에 집중 가능
  • 예시 : 빠른 개발, CRUD 중심의 프로젝트, 유지보수가 중요한 경우


5. MyBatis

  • SQL 매퍼 프레임워크 (ORM이 아님)
  • SQL은 직접 작성하고, 자바 객체와 매핑만 자동화
  • XML 또는 어노테이션 기반으로 SQL 작성
  • 특징

    • SQL 직접 제어 가능 (자동 생성 아님)
    • 복잡한 쿼리 작성이 용이 (join, 조건 분기 등)
    • 단순 매핑만 제공 → 트랜잭션/캐시 등은 수동 처리
    • 유지보수성이 떨어질 수 있음 (SQL이 분산되어 있음)
  • 예시 : SQL 제어가 중요한 프로젝트, DB 중심 설계, 정교한 쿼리가 중요한 금융/통계 시스템


핵심 비교 요약

구분JDBCMyBatisJPAHibernateSpring Data JPA
분류저수준 APISQL 매퍼 프레임워크ORM (표준)ORM (구현체)ORM + 자동화 도구
쿼리 작성직접 SQL 작성직접 SQL(XML/어노테이션) 작성직접 작성 ❌ (JPQL or 자동 생성)직접 작성 가능자동 생성 + 필요시 JPQL/native SQL 사용
매핑 방식없음수동 매핑 (<resultMap>)Entity 기반 자동 매핑Entity 기반 자동 매핑Entity 기반 + 메서드 명 자동 매핑
학습 난이도낮음 (직접 구현 많음)중간중간~높음높음가장 쉬움
코드 양많음SQL은 많고 Java 코드는 간결적당많을 수 있음매우 적음
커스터마이징가능하지만 어렵고 번거로움자유롭게 가능제한적 (설정 필요)유연하게 가능제약이 있으나 QueryDSL 등으로 보완 가능
성능 튜닝수동SQL 직접 튜닝 가능기본 전략 + 일부 제어 가능다양한 전략 지원Hibernate 기반 튜닝 적용 가능
대표 사용 상황단순한 앱, 학습용복잡 쿼리 중심 앱, 성능 제어 필요 시객체 중심 설계 앱, 도메인 주도 설계JPA 한계 보완이 필요할 때생산성 우선, 빠른 개발이 필요한 경우

언제 어떤 걸 쓰면 좋을까?

상황추천 기술이유
DB에서 복잡한 SQL 로직을 주도하고 싶다MyBatisSQL 제어 가능, 성능 관리에 유리
단순 CRUD 중심의 REST API를 빠르게 만들고 싶다Spring Data JPA메서드만 정의하면 쿼리 자동 생성
도메인 모델 중심의 설계를 하고 싶다JPA객체 중심, 유지보수 용이
실시간 최적화가 중요하고 캐시나 Lazy Loading이 중요하다HibernateORM 고급 기능 제공
모든 것을 내 손으로 직접 구현해보고 싶거나 성능 테스트용으로 사용하고 싶다JDBC가장 원시적이고 유연함

관계 정리 (기술 스택 흐름)

Spring Data JPA
    ↓
   JPA (API)
    ↓
 Hibernate (JPA 구현체)
    ↓
 JDBC (Java 기본 DB 접근 기술)
    ↓
  DB
MyBatis → JDBC → DB
  • JPA는 객체 중심
  • MyBatis는 SQL 중심
  • Spring Data JPA는 JPA의 생산성을 극대화한 것
  • Hibernate는 JPA의 핵심 구현체이자 독립적인 ORM
profile
말하는 고구마

0개의 댓글