DB

JPA | MyBatis | JDBC

unknownomad 2025. 3. 1. 02:24

 

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 또는 애너테이션으로 관리