JPA Query Method, JPQL, QueryDSL

이병수·2024년 3월 7일
0

스프링 정리

목록 보기
24/24
post-thumbnail

JPA 데이터 접근


JPA Query Method란?

스프링 데이터 JPA는 인터페이스에 메서드만 적어두면, 메서드 일므을 분석해서 쿼리를 자동으로 만들고 실행해주는 기능을 제공한다.

그동안 사용했던 방법이 JPA Query Method를 통해서 JPA를 상속 받는 인터페이스 쪽에 메서드를 적어두면 알아서 실행이 되게 만들어주었다.
정말 정말 편리한 방법이다.

public interface MemberJpaRepository extends JpaRepositry<MemberEntity, Long> {
	Optional<MemberEnttiy> findByUsername(String username);
}

이렇게만 적어둔다면 알아서 스프링 데이터 가 메서드 이름을 분석해서 필요한 JQL을 만들고 실행시킨다.

하지만 이러한 메서드 이름에도 규칙이 필요하다.

이러한 Query Method의 조건에 대해서는 스프링 데이터 JPA 공식문서 를 참고하자.

그리고 가장 안 좋은 점? 이라고 생각하는 것이 만약 필드 이름이 길거나 조건이 많아진다면 해당 메서드의 길이도 길어진다는 단점이 발생한다.

내가 작성한 메서드 중에서 가장 긴 건 20~30 줄 이였던 것 같지만 다른 사람들을 보면 50줄까지 간다고 하는 사람이 있다..(허..)


그래서 JPA가 제공해주는 Query Method를 사용하는 것 보다 JPQL 또는 QueryDSL을 많이 추천해준다.


JPQL 이란?

JPA(Java Persistence Query Language)으로써, SQL과 비슷한 형태의 쿼리를 작성하는 방법

엔티티 객체 대상으로 쿼리를 하는 방법이며 JPA에서 제공하는 메소드 호출만으로 쿼리 작성의 한계가 있기 때문에 탄생했다.

JPA는 JPQL을 분석하여 SQL을 생성한 후 DB에서 조회한다.

어노테이션을 통해 JPQL을 사용할 수 있다.

@Query

public interface MemberJpaRepository extends JpaRepositry<MemberEntity, Long> {
	@Query(value = "select u from User u where u.name = :name")
	Optional<MemberEnttiy> findUser(@Param("name") String name);
}

SQL Function 기능이 있는데, 기본적으로 max, min, count, sum, avg 를 제공한다고 한다.

자세한 부분은 문서 를 확인하자.

하지만 JPQL 또한 String으로 쿼리를 작성해야하며, 프로그래머가 실수 할 수 있다는 단점이 있다.

물론 취향차이긴 하지만, 나는 JPQL 또한 나쁘지 않다고 생각을 한다.


QueryDSL 이란?

QueryDSL은 정적 타입을 이용하여 SQL과 같은 쿼리를 생성하게 해주는 프레임워크이다.

복잡한 쿼리, 동적 쿼리를 구현하는 것에 있어서 JPA가 한계가 발생하기 때문에 이 문제점을 해결해주고자 사용하는 기술이 QueryDSL이다.

QueryDSL을 작성하면 컴파일 시에 오류를 발생하여 잘못된 쿼리가 실행되는 것을 방지할 수 있다.

또한 , QueryDSL 은 JPA 뿐만 아닌 SQL, MongoDB 등 다양한 언어에 서비스를 제공한다.

@Repository
@RequiredArgsConstructor
public class MemberRepositoryInformationImpl implements MemberRepositoryInformation {

  private final JPAQueryFactory jpaQueryFactory;

  @Override
  public Optional<MemberEntity> findByEmail(String email) {
    QMemberEntity member = QMemberEntity.memberEntity;

    return Optional.ofNullable(jpaQueryFactory.selectFrom(member)
        .where(member.email.eq(email))
        .fetchFirst());
  }
}

먼저 Query DSL을 작성하기 위해 gradle을 추가해야한다.

implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"

이렇게 추가하고

QueryDSL에서 사용하고 있는 JPAQueryFactory를 공용으로 사용하기 위해서 Config 파일을 만들자.

@Configuration
@RequiredArgsConstructor
public class QueryDSLConfig {

  private final EntityManager entityManager;

  @Bean
  public JPAQueryFactory jpaQueryFactory() {
    return new JPAQueryFactory(entityManager);
  }
}

이렇게 설정하면 위에서 QueryDSL을 만들어서 사용하면 된다.


정리

1. 간단한 것은 JPA가 제공하는 기본 Query Method를 사용하자.
2. 복잡한 쿼리, 조인이 필요시에 JPQL 이나 QueryDSL을 사용하자.
profile
백엔드 개발자가 되고 싶어요

0개의 댓글