개발자

JPA 다이나믹 쿼리 파라미터 DTO 사용?

2023년 04월 06일조회 103

항상 선배님들의 답변으로 큰 도움을 얻고 있습니다! JPA queryDsl을 사용한 다이나믹 쿼리 생성시 코딩 패턴에 대한 질문 드리고 싶습니다. 제가 작업할 땐 보통의 자바사용법(?) 처럼 DTO를 사용해서 처리하고 있습니다. 근데 서칭을 하다보니 저와 같은 패턴은 잘 없고 파라미터에 필요한 만큼 변수를 받아 사용하시더라구요? where 문도 저처럼 한꺼번에 메소드로 만들어서 사용하시지 않고 컬럼 조건 하나당 하나씩 만드셔서 그걸 전부 명시 하는 것 같은데 혹시 문서 작성에 정형화 된 코딩 패턴이 있다면 공유 부탁드립니다. 아래 참고 링크 입니다. https://velog.io/@hyunho058/QueryDSL-Where%EC%A0%88-%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.
profile picture
익명님의 질문

답변 1

커리어리 AI 봇님의 프로필 사진

QueryDSL을 사용한 다이나믹 쿼리 생성 시에도 여러 가지 접근 방식이 있습니다. 보통은 조건별로 메서드를 분리하여 사용하는 것이 좋은데, 이렇게 하는 이유는 각각의 조건을 재사용하기 쉽고 가독성이 좋아지기 때문입니다. 아래 예시를 참고하세요. 이렇게 각 조건별로 메서드를 분리하면 재사용성과 가독성이 좋아집니다. 그러나 프로젝트의 요구 사항과 코딩 스타일에 따라 DTO를 사용하는 방식도 충분히 유효합니다. 팀의 코딩 스타일과 일관성을 유지하고 가독성이 좋은 방법을 선택하는 것이 중요합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class CustomRepositoryImpl implements CustomRepository {
    private final JPAQueryFactory queryFactory;

    public CustomRepositoryImpl(EntityManager em) {
        this.queryFactory = new JPAQueryFactory(em);
    }

    @Override
    public List<OutputDTO> findSomething(InputDTO input) {
        return queryFactory
                .select(new QOutputDTO( ... ))
                .from(엔티티)
                .innerJoin(엔티티)
                .where(
                    hasSomething1(input.getSomething1()),
                    hasSomething2(input.getSomething2())
                )
                .fetch();
    }

    private BooleanExpression hasSomething1(String something1) {
        return something1 != null ? 엔티티.something1.eq(something1) : null;
    }

    private BooleanExpression hasSomething2(String something2) {
        return something2 != null ? 엔티티.something2.eq(something2) : null;
    }
}

커리어리 AI 봇의 답변을 평가해 주세요!

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

목록으로
키워드로 질문 모아보기

실무, 커리어 고민이 있다면

새로운 질문 올리기

지금 가입하면 모든 질문의 답변을 볼 수 있어요!