Post

[Querydsl] Where ํŒŒ๋ผ๋ฏธํ„ฐ

๐Ÿ“Œ ๋“ค์–ด๊ฐ€๋ฉฐ

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” QueryDSL๋กœ ๋™์  ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋‘ ๋ฐฉ์‹์„ ์ •๋ฆฌํ•œ๋‹ค. ์กฐ๊ฑด์„ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋ถ™์˜€๋‹ค ๋—๋‹ค ํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ด๋‹ค.

๋ฐฉ์‹๋„๊ตฌ
BooleanBuilder์กฐ๊ฑด์„ ํ•˜๋‚˜์˜ ๋นŒ๋”์— ๋ˆ„์ 
Where ๋‹ค์ค‘ ํŒŒ๋ผ๋ฏธํ„ฐBooleanExpression ๋ฉ”์†Œ๋“œ๋ฅผ ๋‚˜์—ด (null์ด๋ฉด ๋ฌด์‹œ)

1. BooleanBuilder

1
2
3
4
5
6
7
8
9
10
public List<Member> findMembersByCondition(String name, Integer age) {
    BooleanBuilder builder = new BooleanBuilder();
    if (name != null) builder.and(member.name.eq(name));   // ์žˆ์„ ๋•Œ๋งŒ ์ถ”๊ฐ€
    if (age != null)  builder.and(member.age.eq(age));

    return queryFactory
        .selectFrom(member)
        .where(builder)
        .fetch();
}

๐Ÿ’ก if๋กœ ๊ฐ’์ด ์žˆ์„ ๋•Œ๋งŒ ์กฐ๊ฑด์„ and๋กœ ๋ˆ„์ ํ•œ๋‹ค. null์ธ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์กฐ๊ฑด์—์„œ ๋น ์ง„๋‹ค.

2. Where ๋‹ค์ค‘ ํŒŒ๋ผ๋ฏธํ„ฐ (๊ถŒ์žฅ)

where()์— ์—ฌ๋Ÿฌ BooleanExpression์„ ๋‚˜์—ดํ•˜๋ฉด null์ธ ๊ฒƒ์€ ์ž๋™์œผ๋กœ ๋ฌด์‹œ๋œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
public List<Member> findMembers(String name, Integer age, String teamName) {
    return queryFactory
        .selectFrom(member)
        .where(eqName(name), eqAge(age), eqTeamName(teamName))   // null์€ ๋ฌด์‹œ๋จ
        .fetch();
}

private BooleanExpression eqName(String name) {
    return name != null ? member.name.eq(name) : null;   // null ๋ฐ˜ํ™˜ ์‹œ ์กฐ๊ฑด ์ œ์™ธ
}
private BooleanExpression eqAge(Integer age) {
    return age != null ? member.age.eq(age) : null;
}

๐Ÿ’ก ์กฐ๊ฑด์„ ๋ฉ”์†Œ๋“œ๋กœ ๋ถ„๋ฆฌํ•˜๋ฉด ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ๊ฐ€๋…์„ฑ์ด ์ข‹์•„์ง„๋‹ค. where(A, B, C)๋Š” A AND B AND C์ด๋ฉฐ, null์ธ ์ธ์ž๋Š” ๊ฑด๋„ˆ๋›ด๋‹ค.

3. ์กฐ๊ฑด ์กฐํ•ฉ

๋ฉ”์†Œ๋“œ๋ฅผ ์กฐํ•ฉํ•ด ๋” ๋ณต์žกํ•œ ์กฐ๊ฑด๋„ ๋งŒ๋“ ๋‹ค.

1
2
3
private BooleanExpression eqNameOrTeamName(String name, String teamName) {
    return name != null ? member.name.eq(name) : member.team.name.eq(teamName);
}

๐Ÿ“ ์ •๋ฆฌ

1
2
3
4
QueryDSL ๋™์  ์ฟผ๋ฆฌ
โ”œโ”€ BooleanBuilder   if๋กœ ์กฐ๊ฑด ๋ˆ„์  (builder.and)
โ”œโ”€ Where ๋‹ค์ค‘       where(A, B, C) โ€” null ์ž๋™ ๋ฌด์‹œ
โ””โ”€ ์กฐํ•ฉ             ๋ฉ”์†Œ๋“œ ๋ถ„๋ฆฌ๋กœ ์žฌ์‚ฌ์šฉยท๊ฐ€๋…์„ฑโ†‘
๊ฐœ๋…ํ•œ ์ค„ ์ •์˜
BooleanBuilder์กฐ๊ฑด์„ ๋ˆ„์ ํ•˜๋Š” ๋นŒ๋”
BooleanExpression์กฐ๊ฑด ํ•˜๋‚˜(null์ด๋ฉด ๋ฌด์‹œ)
Where ๋‹ค์ค‘ ํŒŒ๋ผ๋ฏธํ„ฐ์กฐ๊ฑด ๋ฉ”์†Œ๋“œ๋ฅผ ๋‚˜์—ด

๋™์  ์ฟผ๋ฆฌ๋Š” QueryDSL์˜ ๊ฐ•๋ ฅํ•œ ์žฅ์ ์ด๋‹ค. ํŠนํžˆ Where ๋‹ค์ค‘ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐฉ์‹์€ ์กฐ๊ฑด์„ ๋ฉ”์†Œ๋“œ๋กœ ๋ถ„๋ฆฌํ•ด ์žฌ์‚ฌ์šฉยท๊ฐ€๋…์„ฑ์ด ์ข‹์•„, BooleanBuilder๋ณด๋‹ค ์‹ค๋ฌด์—์„œ ์„ ํ˜ธ๋œ๋‹ค.

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.