[ShowMyCNFT] @Query, SpringDataJpa, Querydsl

junghan·2023년 4월 20일
0

SpringBootProject

목록 보기
28/35
post-thumbnail

@Query, Spring Data JPA, 그리고 Querydsl은 모두 Spring Framework에서 제공하는 데이터베이스 쿼리를 작성하는 방법입니다.


@Query

@Query는 JPA에서 제공하는 어노테이션으로, 사용자가 직접 SQL 쿼리를 작성할 수 있습니다. 이는 간단한 쿼리를 작성할 때는 유용하지만, 복잡한 쿼리를 작성하는 경우에는 가독성이 떨어지고 유지보수가 어렵습니다.

@Query 어노테이션을 사용하여 이름을 기준으로 사용자를 검색하는 메서드

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    @Query(value = "SELECT * FROM users WHERE name = ?1", nativeQuery = true)
    List<User> findByName(String name);
}


Spring Data JPA

Spring Data JPA는 Spring Framework에서 제공하는 JPA 구현체입니다. 이를 사용하면 쿼리를 작성하는 대부분의 코드를 자동으로 생성할 수 있습니다. 그러나 이를 사용하면 복잡한 쿼리를 작성하기 어려울 수 있습니다. 또한 Spring Data JPA는 SQL을 사용하는 것이 아니라, JPA 쿼리 언어를 사용하기 때문에 데이터베이스 종류에 따라 약간의 차이가 있을 수 있습니다.

Spring Data JPA를 사용하여 이름을 기준으로 사용자를 검색하는 메서드

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    List<User> findByName(String name);
}


Querydsl

Querydsl은 Java에서 제공하는 타입 안정성을 지원하는 쿼리 빌더입니다. 이를 사용하면 자바 코드를 작성하여 SQL 쿼리를 생성할 수 있으며, 객체 지향적인 쿼리를 작성할 수 있습니다. 또한 Querydsl은 JPA, JDO, SQL, MongoDB 등 다양한 데이터베이스 기술을 지원합니다. 이는 사용자가 쿼리를 작성하는 데 필요한 지식을 최소화하고, 코드의 가독성과 유지보수성을 높일 수 있습니다.

Querydsl를 사용하여 이름을 기준으로 사용자를 검색하는 메서드

@Repository
public interface UserRepository extends JpaRepository<User, Long>, QuerydslPredicateExecutor<User> {
    default List<User> findByName(String name) {
        QUser qUser = QUser.user;
        JPQLQuery<User> query = from(qUser).where(qUser.name.eq(name));
        return query.fetch();
    }
}

규모가 있는 프로젝트에서의 데이터 조회는 FK의 조인, 복잡한 조건 등으로 인해 이런 Entity 클래스만으로 처리하기 어려워 조회용 프레임워크를 추가로 사용합니다. 대표적 예로 querydsl, jooq, MyBatis 등이 있습니다. 조회는 위 3가지 프레임워크 중 하나를 통해 조회하고, 등록/수정/삭제 등은 SpringDataJpa를 통해 진행합니다. 개인적으로는 querydsl를 추천합니다.
TIP) 쿠팡, 배민 등 JPA를 적극적으로 사용하는 회사에서는 Querydsl를 적극적으로 사용 중입니다.



어떤 것이 개발에 적합한가?

@Query는 간단한 쿼리를 작성할 때 유용하지만, 복잡한 쿼리를 작성하는 경우에는 가독성이 떨어지고 유지보수가 어렵습니다.
Spring Data JPA는 코드를 자동으로 생성하므로 쿼리 작성 시간을 줄일 수 있지만, 복잡한 쿼리를 작성하기 어려울 수 있습니다.
Querydsl은 Java에서 제공하는 타입 안정성을 활용하여 객체 지향적인 쿼리를 작성할 수 있으며, 다양한 데이터베이스 기술을 지원하여 유연성이 높습니다.

profile
42seoul, blockchain, web 3.0

0개의 댓글