Repository 인터페이스:
JpaRepository<Entity, ID> 인터페이스를 상속받는 것만으로 기본적인 CRUD(생성, 조회, 수정, 삭제) 메서드(e.g., save(), findById(), findAll(), delete())를 자동으로 제공받습니다.쿼리 메서드 (Derived Query Methods):
findByUsernameAndEmail(String username, String email)@Query 어노테이션:
value 속성에 JPQL을, nativeQuery = true 설정 시 SQL을 작성합니다.페이징 및 정렬:
PagingAndSortingRepository를 상속받거나 JpaRepository의 메서드에 Pageable 객체를 인자로 전달하여, 손쉽게 페이징(Pagination) 및 정렬(Sorting) 기능을 구현할 수 있습니다.Q-Type (Query Type):
Q 접두사가 붙은 정적 클래스(Q-Type)를 자동으로 생성합니다 (e.g., User 엔티티 → QUser).QUser.user.username.eq("test"))JPAQueryFactory:
JPAQueryFactory를 Spring Bean으로 등록하여 주입받아 사용합니다.동적 쿼리 (BooleanBuilder):
WHERE 절이 달라지는 경우)에 매우 유용합니다.BooleanBuilder 객체에 if 문 등을 사용하여 조건이 만족할 때만 and(), or() 메서드로 쿼리 조건을 추가합니다.BooleanBuilder builder = new BooleanBuilder();
if (username != null) builder.and(qUser.username.eq(username));
if (email != null) builder.and(qUser.email.eq(email));
// factory.selectFrom(qUser).where(builder).fetch();
서브쿼리 (JPAExpressions):
JPAExpressions 유틸리티 클래스를 사용하여 SELECT, WHERE, HAVING 절 등에서 서브쿼리를 작성할 수 있습니다.// 특정 그룹의 평균 나이보다 많은 사용자 조회
// JPAExpressions.select(qUser.age.avg()).from(qUser).where(qUser.group.name.eq("A"))
동적 정렬 (OrderSpecifier):
OrderSpecifier를 사용하여 동적으로 정렬 조건을 구성할 수 있습니다.UserRepositoryCustom).JPAQueryFactory를 주입받아 QueryDSL 쿼리 로직을 작성합니다 (e.g., UserRepositoryImpl).[Repository 인터페이스 이름] + Impl 형태로 지어야 Spring Data JPA가 자동으로 연결합니다.JpaRepository를 상속받는 기존 Repository 인터페이스가 Custom Repository 인터페이스를 함께 상속받도록 합니다 (e.g., interface UserRepository extends JpaRepository<User, Long>, UserRepositoryCustom {}).UserRepository는 Spring Data JPA의 기본 CRUD와 쿼리 메서드를 제공하면서, 동시에 QueryDSL로 구현된 복잡한 동적 쿼리 메서드까지 사용할 수 있게 됩니다.JpaRepository와 쿼리 메서드를 통해 보일러플레이트 코드를 줄여 개발 생산성을 높입니다.JPAQueryFactory를 사용하여 타입-세이프한 Java 코드로 동적 쿼리를 작성할 수 있게 하여, 컴파일 시점 오류 감지와 높은 가독성을 제공합니다.