봄날은 갔다. 이제 그 정신으로 공부하자

JpaRepository DB 조회 방법 본문

학습

JpaRepository DB 조회 방법

길재의 그 정신으로 공부하자 2025. 11. 17. 11:11

1. findBy 함수 사용
JpaRepository에서 기본적으로 제공하는 함수로 “findBy” + 컬럼명으로 조합됨.
예를들어 idx가 일치하는 사용자 조회

Optional<User> findByIdx()



​userType이 일치하고 salary가 100보다 큰 사용자 조회

List<User> findByUserTypeAndSalaryCreaterThen()



2. @Query 어노테이션 사용
@Query을 사용하여 아래와 같이 조회 쿼리 직접 작성할 수 있습니다.
idx가 일치하는 사용자 조회

@Query(“SELECT usr FROM USER AS usr WHERE usr.idx = :idx”)
Optional<User> findUser(Long idx);


​userType이 일치하고 salary가 100보다 큰 사용자 조회

@Query(“SELECT usr FROM USER AS usr WHERE usr.name = :name AND usr.salary > :salary”)
List<User> findUsers(String name, Long salary);



3. JPAQueryFactory 사용

조건이 복잡해지면 위 방식 DB를 조회하는 것에 한계가 있습니다.

사용자가 집접 쿼리를 작성할 수 있는 방법이 JPAQueryFactory 방식입니다.

이방식은 사전에 해야 할 것이 몇개 있습니다.

step1. interface class 생성

public interface UserRepositoryCustom {
    Optional<User> findUser(Long idx);
    List<User> findUsers(String name, Long salary);
}



step2. interface class 상속

@Repository
public interface UseJpaRepository extends JpaRepository<User, Integer> UserRepositoryCustom {
    ...
}



step3. interface 를 상속받아 implement class 생성

@RequiredArgsConstructor
public class UserRepositoryCustom implements UserRepositoryCustom {
    ...
}




step4. 검색을 위한 cond class 구현

@Setter
@Getter
@Builder
public class UserSearchCond {
    private Long idx;
    private String name;
    private Long salary;
}



step5. JPAQueryFactory를 사용해 implement class 구현 및 검색 조건 함수 추가
class에 검색을 위해 아래 함수들을 추가한다.

@RequiredArgsConstructor

public class UserRepositoryCustom implements UserRepositoryCustom {
    // 검색을 위해 아래 함수들을 추가한다.
    private BooleanBuilder allCondForUser(UserSearchCond cond) {
        Long idx = cond.getIdx();
        String name = cond.getName();
        Long salary = cond.getSalary);
        BooleanBuilder builder = new BooleanBuilder();
        builder.and(idxEq(idx));
        builder.and(nameEq(name));
        builder.and(salarydEq(salary));
        return builder;
    }

    /** idx 조건 (null이면 무시) */
    private BooleanExpression idxEq(Long idx) {
        return idx == null ? null : user.idx.eq(idx);
    }

    /** name 조건 (null이면 무시) */
    private BooleanExpression nameEq(String name) {
        return name == null ? null : user.name.eq(name);
    }

    /** idx 조건 (null이면 무시) */
    private BooleanExpression salaryEq(Long salary {
        return salary == null ? null : user.salary.eq(salary);
    }
}




step6. JPAQueryFactory를 사용해 implement class 구현

@RequiredArgsConstructor
public class UserRepositoryCustom implements UserRepositoryCustom {
    private final JPAQueryFactory queryFactory;

    @Override
    Optional<User> findUser(Long idx) {
       // 검색 조건 생성
        UserSearchCond cond = UserSearchCond
                .builder()
                .idx(idx)
                .build();

        // 검색 조건에 맞는 직원 조희
        Optional<User> user = queryFactory
                .selectFrom(user)
                .where(allCondForUser(cond))
                .fetch();
        reutrn user;
    }

    @Override
    List<User> findUsers(String name, Long salary){
       // 검색 조건 생성
        UserSearchCond cond = UserSearchCond
                .builder()
                .name(name)
                .salary(salary)
                .build();

        // 검색 조건에 맞는 직원 목록
        List<User> users = queryFactory
                .selectFrom(user)
                .where(allCondForUser(cond))
                .fetch();
        reutrn users;
    }
}
Comments