JPA(+JPQL), Spring-Data-JPA, QueryDSL

한민욱·2024년 6월 4일

아라보자.

1. JPA (Java Persistence API)

JPA는 자바 애플리케이션에서 관계형 데이터베이스와 상호작용하기 위한 자바 표준 ORM (Object-Relational Mapping) API입니다. JPA는 자바 객체를 데이터베이스 테이블에 매핑하고, 데이터베이스의 데이터를 객체로 변환하는 기능을 제공합니다.

주요 개념

  • Entity: 데이터베이스 테이블과 매핑되는 클래스.
  • EntityManager: 엔티티의 생명 주기를 관리하는 인터페이스.
  • Persistence Unit: JPA 설정을 정의하는 단위.
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String email;

    // Getters and setters
}

여기서 @Id는 PK에 쓰이고
@GeneratedValue(strategy = GenerationType.IDENTITY)는
Auto_increment와 같다고 알고 있으면 되겠다.

2. Hibernate

Hibernate는 JPA의 구현체 중 하나로, 가장 널리 사용되는 ORM 프레임워크입니다. Hibernate는 JPA의 모든 기능을 제공하면서도 자체적으로 확장된 기능도 제공합니다.

구현체는 쉽게 말해서 인터페이스나 추상 클래스에서 정의된 메서드를 실제로 동작하도록 구체적으로 작성한 클래스를 말해요.

주요 기능

  • Session: 엔티티의 생명 주기를 관리하고 데이터베이스와 상호작용하는 인터페이스.
  • Criteria API: 프로그램적으로 데이터베이스 질의를 작성할 수 있는 API.
  • Caching: 1차 및 2차 캐시를 통한 성능 최적화.

3. JPQL (Java Persistence Query Language)

JPQL은 JPA에서 제공하는 객체지향 쿼리 언어로, SQL과 비슷하지만 엔티티 객체를 대상으로 질의를 작성합니다.

주요 특징

  • SQL과 유사하지만 엔티티 객체를 대상으로 질의.
  • 데이터베이스 테이블 대신 엔티티 클래스그 필드를 사용.

예제 코드

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

여기서 TypedQuery와 Query의 차이점도 알아볼게요.

  • TypedQuery는 반환 타입이 명확할 때 사용
  • Query는 반환 타입이 명확하지 않을 때 사용한다
    그래서 위의 코드처럼 User.class는 명확하게 개발자가 반환 타입을 만들었으니 사용.

4. Spring Data JPA

Spring Data JPA는 JPA를 보다 쉽게 사용할 수 있도록 도와주는 스프링의 서브 프로젝트입니다. 리포지토리 패턴을 사용하여 데이터 접근 계층을 단순화하고, CRUD 작업을 자동으로 생성해줍니다.

주요 기능

  • Repository 인터페이스: CRUD 메서드를 자동으로 생성하는 인터페이스.
  • Query 메서드: 메서드 이름으로 쿼리를 생성하는 기능.
public interface UserRepository extends JpaRepository<User, Long> {
    List<User> findByName(String name);
}

5. QueryDSL

QueryDSL은 타입 안전한 쿼리 언어로, JPQL이나 SQL 쿼리를 자바 코드로 작성할 수 있게 해줍니다. 컴파일 시점에 쿼리의 오류를 잡아줄 수 있어 더욱 안전하게 쿼리를 작성할 수 있습니다.

예제 코드

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

여기서 QueryDsl Qclass가 나오는데
이 친구는 엔티티 클래스의 확장이라고 생각하면 쉽다.
엔티티가 테이블의 매핑을 담당하고, QClass는 쿼리 작성 시 편의성을 제공해준다.
가장 큰 장점은 역시 컴파일 단계에서 에러를 잡을 수 있다는 것이다.
JPQL은 런타임 시점에 에러가 확인되니..

요약하자면

  • JPA: 자바 객체와 관계형 데이터베이스를 매핑하는 자바 표준 API.
  • Hibernate: JPA의 구현체이자 추가 기능을 제공하는 ORM 프레임워크.
  • JPQL: 엔티티 객체를 대상으로 하는 객체지향 쿼리 언어.
  • Spring Data JPA: JPA를 쉽게 사용하게 해주는 스프링 서브 프로젝트.
  • QueryDSL: 타입 안전한 쿼리를 작성할 수 있게 해주는 라이브러리.
    라고 볼 수 있겠네요.
profile
나날이 성장하고 싶은 백엔드 개발자

0개의 댓글