본문 바로가기
DB

JPA | MyBatis | JDBC

by unknownomad 2025. 3. 1.

 

JPA (Java Persistence API)

자바에서 객체와 관계형 데이터베이스를 매핑하는 표준 API

엔티티 클래스를 통해 데이터를 객체로 관리하고, 객체 상태에 따라 자동으로 DB와 연동됨

주로 Hibernate와 함께 사용됨

  • JPA는 규격(specification)이고, Hibernate는 그 구현체(implementation)
  • Hibernate는 JPA를 구현하면서, JPA가 정의한 기능을 지원하고, 그 외에도 Hibernate만의 고유 기능을 추가로 제공함
@Entity
public class User {
    @Id
    private Long id;
    private String name;
    // getter, setter
}

JPQL (Java Persistence Query Language)

JPA에서 제공하는 객체 지향 쿼리 언어

SQL과 유사하지만, 테이블 대신 엔티티를 대상으로 쿼리를 작성함

데이터베이스 종속성을 줄이는 데 유리

String jpql = "SELECT u FROM User u WHERE u.name = :name";
List<User> users = entityManager.createQuery(jpql, User.class)
                                .setParameter("name", "John")
                                .getResultList();

Querydsl

타입 안전한 쿼리 생성을 위한 라이브러리

JPQL, SQL 등을 타입 안전하게 작성할 수 있도록 도와주며, 코드 작성 시 컴파일 타임에 오류를 잡을 수 있음

QUser user = QUser.user;
JPAQuery<User> query = new JPAQuery<>(entityManager);
List<User> users = query.select(user)
                        .from(user)
                        .where(user.name.eq("John"))
                        .fetch();

Native Query

데이터베이스에 의존적인 SQL 쿼리

JPA에서 SQL을 그대로 작성하여 실행할 수 있도록 해주며, 복잡한 쿼리나 최적화가 필요한 경우 사용됨

String sql = "SELECT * FROM user WHERE name = ?";
List<User> users = entityManager.createNativeQuery(sql, User.class)
                                .setParameter(1, "John")
                                .getResultList();

JdbcTemplate

Spring에서 제공하는 JDBC 템플릿 클래스

JDBC 코드 작성 시 필요한 반복적인 작업을 처리해 주며, 예외 처리와 자원 관리를 자동으로 해줌

SQL 쿼리를 실행하고 결과를 처리하는 데 유용

String sql = "SELECT * FROM user WHERE name = ?";
List<User> users = jdbcTemplate.query(sql, new Object[]{"John"}, new BeanPropertyRowMapper<>(User.class));

MyBatis

SQL 매퍼 프레임워크

SQL 쿼리와 자바 객체 간의 매핑을 XML 파일을 통해 설정하며, 복잡한 쿼리를 명확하게 관리할 수 있음

JPA보다 더 세밀한 제어가 가능

<select id="getUserByName" resultType="User">
    SELECT * FROM user WHERE name = #{name}
</select>
User user = sqlSession.selectOne("getUserByName", "John");

ORM (Object-Relational Mapping) 기반 (JPA vs MyBatis)

특징 JPA MyBatis
장점 - 객체 지향적, DB와의 자연스러운 연동
- 데이터베이스 독립적
- 자동 CRUD 처리
- 세밀한 SQL 제어 가능
- 복잡한 쿼리나 성능 최적화 유리
단점 - 복잡한 쿼리나 성능 최적화 불편
- 학습 곡선이 있음
- SQL을 명시적으로 작성해야 해서 객체 지향적이지 않음
- 데이터베이스 종속적
사용 예 - CRUD 중심의 애플리케이션
- 데이터베이스 독립적인 환경
- 복잡한 SQL 로직이나 성능 최적화가 중요한 환경

쿼리 작성 방식 (JPQL vs Querydsl)

특징 JPQL  Querydsl
장점 - 객체 지향적 쿼리 작성
- 데이터베이스 독립적
- 타입 안전한 쿼리 작성
- 컴파일 타임에 오류 잡힘
단점 - 복잡한 쿼리 작성 시 불편
- 성능 최적화 어려움
- 학습이 필요하고 설정이 복잡함
사용 예 - 간단한 쿼리 및 데이터베이스 독립적인 애플리케이션 - 복잡한 쿼리나 동적 쿼리 작성이 필요한 환경

SQL 실행 방식 (Native Query vs JdbcTemplate)

특징  Native Query JdbcTemplate
장점 - SQL 직접 작성 가능
- 성능 최적화 유리
- JDBC 반복 작업 처리
- 예외 처리 및 자원 관리 자동화
단점 - 데이터베이스에 종속적
- 유지보수 어려움
- SQL을 여전히 직접 작성해야 함
- 복잡한 쿼리 시 가독성 저하
사용 예 - 복잡한 쿼리나 성능 최적화가 필요한 경우 - 간단한 SQL 처리 및 반복 작업이 필요한 경우

영속성

영속성은 애플리케이션의 객체와 데이터베이스 간의 상태 동기화를 의미

객체가 생성되거나 수정될 때, 이 변화가 데이터베이스에 반영되어야 하는데, 이를 관리하는 과정을 의미

영속성 관리는 객체의 상태를 추적하고, 데이터베이스와의 동기화를 자동으로 처리하거나 개발자가 수동으로 처리할 수 있게 도와줌

필요성

  • 객체와 데이터베이스의 동기화: 객체의 상태 변경이 데이터베이스에 반영되어야 데이터 일관성 유지
  • 효율적인 데이터 처리: 객체 상태를 자동으로 관리함으로써 개발자가 일일이 데이터베이스와 상호작용하는 코드 작성을 줄여줌
  • 트랜잭션 관리: 영속성 관리는 트랜잭션 범위 내에서 객체 상태를 관리하며, 데이터베이스와의 일관된 상태 보장

JPA, Hibernate

  • 영속성 관리: 영속성 컨텍스트 사용, 객체 상태 자동 관리, DB와 동기화
  • 영속성 상태:
    • Transient: 객체가 영속성 컨텍스트에 없는 상태
    • Managed: 객체가 영속성 컨텍스트에 있어 DB와 동기화되는 상태
    • Detached: 객체가 영속성 컨텍스트에서 분리된 상태
    • Removed: 삭제된 객체 상태

QueryDSL

  • 영속성 관리: JPA와 함께 사용, 영속성 관리 JPA가 담당, 쿼리 작성만 담당

Native Query

  • 영속성 관리: SQL 직접 작성, 영속성 컨텍스트와 동기화 안 됨, 수동으로 상태 관리 필요

JDBC, JdbcTemplate

  • 영속성 관리: 객체 상태 자동 관리 안 됨, SQL 직접 작성, 수동으로 상태 관리

MyBatis

  • 영속성 관리: 객체 상태 자동 관리 안 됨, SQL 매핑, 명시적 쿼리로 상태 동기화
  •  

JDBC (Java Database Connectivity)

Java와 데이터베이스 연결을 위한 표준 API

SQL 쿼리 실행, 데이터베이스 상호작용을 직접 처리

특징

  • SQL 직접 사용
  • 연결 관리 (Connection, Statement 등)
  • 트랜잭션 처리
  • 표준화된 인터페이스

다른 기술들과 차이점

  • JPA: 객체-관계 매핑(ORM) 기술, 데이터베이스 테이블을 객체로 매핑해 SQL을 직접 작성하지 않고 객체를 통해 데이터 처리
  • JPQL: JPA에서 사용하는 객체 지향 쿼리 언어, SQL 대신 엔티티 객체에 대해 쿼리 작성
  • QueryDSL: JPA와 함께 사용, 타입 안전한 동적 쿼리 생성, 코드에서 쿼리 조건을 동적으로 구성
  • Native Query: JPA에서 SQL을 그대로 실행, 데이터베이스에 특화된 쿼리 사용
  • JDBC: 데이터베이스와 직접 연결하여 SQL 쿼리 실행, 데이터베이스와의 상호작용을 직접 처리
  • JdbcTemplate: Spring에서 제공하는 클래스, JDBC를 쉽게 사용할 수 있도록 도와주며 예외 처리와 리소스 관리를 간소화
  • MyBatis: SQL 매핑 프레임워크, SQL을 XML에 작성하고 Java 메서드와 매핑하여 사용, SQL을 세밀하게 제어 가능

Spring과 데이터베이스 연결

JPA

연결

  • Spring Data JPA를 사용해 연결
  • 영속성 컨텍스트를 사용하여 객체 상태 자동 관리
  • EntityManagerFactory, JpaTransactionManager 설정
  • 쿼리 처리는 JpaRepository 및 JPQL을 통해 자동으로 처리

연결 순서:

  1. DataSource 설정: 데이터베이스 연결 정보 설정
  2. EntityManagerFactory 빈 등록: JPA가 DB와 연결하는 데 필요한 설정
  3. JpaTransactionManager 설정: 트랜잭션 관리 설정
  4. Spring Data JPA 사용: @Repository와 JpaRepository로 쿼리 실행

MyBatis

연결

  • MyBatis-Spring을 사용해 연결
  • XML이나 애너테이션으로 SQL 매핑
  • SqlSessionFactory와 SqlSessionTemplate을 사용

연결 순서:

  1. DataSource 설정: 데이터베이스 연결 정보 설정
  2. SqlSessionFactory 빈 등록: MyBatis 설정
  3. SqlSessionTemplate 설정: SQL 실행 템플릿 설정
  4. @Mapper 인터페이스 사용: SQL 매핑 및 데이터 처리

JDBC

연결

  • JdbcTemplate을 사용해 연결
  • SQL 쿼리를 수동으로 작성하고 실행
  • JDBC API와 DataSource를 사용해 DB와 상호작용

연결 순서:

  1. DataSource 설정: 데이터베이스 연결 정보 설정
  2. JdbcTemplate 빈 등록: JDBC 템플릿을 통해 SQL 실행
  3. SQL 쿼리 실행: JdbcTemplate을 통해 SQL 쿼리 실행 및 데이터 처리

JDBC 관련 용어

  • JDBC Driver: 데이터베이스와 연결을 위한 드라이버
  • DriverManager: JDBC 드라이버를 관리하고, 연결을 생성
  • JDBC API: SQL 쿼리 실행을 위한 인터페이스 (예: Connection, Statement, ResultSet)

JPA와 JDBC의 차이

  • JPA는 JDBC Driver, DriverManager, JDBC API를 사용 X
  • JPA는 자체적으로 영속성 컨텍스트를 관리하여 객체 상태와 데이터베이스 동기화를 처리
  • JDBC는 JDBC Driver, DriverManager, JDBC API를 사용해 직접 DB와 상호작용하고 SQL 쿼리를 실행
  • JPA는 객체 지향적인 방식으로 데이터베이스와 상호작용
  • JDBC는 데이터베이스와 직접적으로 상호작용
  • MyBatis는 SQL 매핑 방식으로, JDBC를 활용하여 SQL을 실행하되 SQL을 XML 또는 애너테이션으로 관리

댓글