-
[ Querydsl ] ๋์ ์ฟผ๋ฆฌ ๋ง๋ค๊ธฐ(BooleanExpression, BooleanBuilder)JPA 2022. 3. 22. 01:26๋ฐ์ํ
Querydsl์์ ๋์ ์ฟผ๋ฆฌ ๊ตฌํํ๋ ๋ฐฉ๋ฒ
Querydsl์์๋ ๋์ ์ฟผ๋ฆฌ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด BooleanBuilder์ Where ๋ค์ค ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํ๋ ๋ ๊ฐ์ง ๋ฐฉ์์ด ์๋ค.
๋๋ค ๊ฐ์ 'Expression' ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ธฐ ๋๋ฌธ์ Where๋ฅผ ์ฒ๋ฆฌํ๋ค๋ ๋ชฉ์ ์ ๊ฐ์ง๋ง, ์์ฑํ๋ ๋ฐฉ๋ฒ๊ณผ ์กฐ๊ฑด์ ์ถ๊ฐํ๋ ๋ฐฉ์์ ์ฐจ์ด๊ฐ ์๋ค.
1. BooleanBuilder
@Test public void ๋์ ์ฟผ๋ฆฌ_BooleanBuilder() throws Exception { String usernameParam = "member1"; Integer ageParam = 10; List<Member> result = searchMember1(usernameParam, ageParam); Assertions.assertThat(result.size()).isEqualTo(1); } private List<Member> searchMember1(String usernameCond, Integer ageCond) { BooleanBuilder builder = new BooleanBuilder(); if (usernameCond != null) { builder.and(member.username.eq(usernameCond)); } if (ageCond != null) { builder.and(member.age.eq(ageCond)); } return queryFactory .selectFrom(member) .where(builder) .fetch(); }
BooleanBuilder๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋ ์ฑ๋ ์ข์ง ์๊ณ ์ฝ๋๋ฅผ ํ์ ํ๋๋ฐ ์๊ฐ๋ ์ค๋ ๊ฑธ๋ฆฌ๊ฒ ๋๋ฉฐ ์ด๋ค ์ฟผ๋ฆฌ๊ฐ ๋๊ฐ์ง ์์ธก์ด ํ๋ค๋ค.
๋ํ ์ฝ๋๋ฅผ ๋ณด๋ฉด ์กฐ๊ฑด๋ฌธ์ ํตํด null ์ฒดํฌ๋ฅผ ํด์ค์ผํจ์ ๋ฌผ๋ก and๋ฉ์๋๋ฅผ ํตํด ํ๋ํ๋ ์กฐ๊ฑด์ ์ถ๊ฐํด์ค์ผ ํ๋ค.
ํ๋์ ์กฐ๊ฑด์ผ ๋์ผ ๋จ์ํ๊ฒ ์ง๋ง ์ ๋ ๊ทธ๋ด์ผ์์์ ํ ๊ณ , ๊ฒฝ์ฐ์ ์๊ฐ ๋ง์์ง์ ๋ฐ๋ผ ์ฝ๋์ ์์ด ์์ฒญ๋๊ฒ ๋์ด๋๊ฒ ๋ ๊ฒ์ด๋ค.
2. BooleanExpression
์ด๋ฌํ BooleanBuilder์ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํด BooleanExpression์ ์ฌ์ฉํ์.
@Test public void ๋์ ์ฟผ๋ฆฌ_WhereParam() throws Exception { String usernameParam = "member1"; Integer ageParam = 10; List<Member> result = searchMember2(usernameParam, ageParam); Assertions.assertThat(result.size()).isEqualTo(1); } private List<Member> searchMember2(String usernameCond, Integer ageCond) { return queryFactory .selectFrom(member) .where(usernameEq(usernameCond), ageEq(ageCond)) .fetch(); } private BooleanExpression usernameEq(String usernameCond) { return usernameCond != null ? member.username.eq(usernameCond) : null; } private BooleanExpression ageEq(Integer ageCond) { return ageCond != null ? member.age.eq(ageCond) : null; }
BooleanExpression์ ์์์ฝ๋์ฒ๋ผ ๋ฉ์๋๋ฅผ ๋ฐ๋ก ๋บ๊ธฐ๋๋ฌธ์, ๊ฐ์ฅ ์ค์ํ ๋ก์ง์ด ์์ ์ค๊ฒ๋์ด ๊ฐ๋ ์ฑ์ด ๋์์ง๊ณ ๋ฉ์๋ ๋ช ์ ํตํด ๊ตณ์ด ๋ฉ์๋์ ๋ด์ฉ์ ๋ณด์ง ์๋๋ผ๋ ์ฝ๊ฒ ์ด๋ค ๋ด์ฉ์ธ์ง ํ์ ์ด ๊ฐ๋ฅํ๋ค.
๋ํ null์ ๋ฐํํ๊ฒ ๋๋ฉด Where์ ์์ ์กฐ๊ฑด์ ๋ฌด์๋์ด ์์ ํ๊ณ , BooleanExpression์ ํ์ฉํ๋ฉด ์๋์ฒ๋ผ and์ or๊ฐ์ ๋ฉ์๋๋ค์ ์ด์ฉํด BooleanExpression๋ค์ ์กฐํฉํด ์๋ก์ด BooleanExpression์ ๋ง๋ค ์ ์์ด ์ฌ์ฌ์ฉ์ฑ์ด ๋๋ค.private BooleanExpression allEq(String usernameCond, Integer ageCond) { return usernameEq(usernameCond).and(ageEq(ageCond)); }
์ฐ์ํ ํ์ ๋ค์ Querydsl ํ์ฉ๋ฒ์์๋ ๋์ ์ฟผ๋ฆฌ๋ BooleanExpression์ ์ฌ์ฉํ๋ผ๊ณ ๋์์๋ค.
๊ฒฐ๋ก ์ ๋์ ์ฟผ๋ฆฌ์ BooleanExpression์ ์ฌ์ฉํ์ !
1) ๊ฐ๋ ์ฑ์ด ๋ฐ์ด๋จ
2) null ๋ฐํ ์ Where์ ์์ ๋ฌด์๋๊ธฐ ๋๋ฌธ์ ์์
3) and, or๊ฐ์ ๋ฉ์๋๋ค์ ์ด์ฉํด BooleanExpression์ ์กฐํฉํด ์๋ก์ด BooleanExpression๋ฅผ ๋ง๋ค ์ ์์ด ์ฌ์ฌ์ฉ์ฑ์ด ์ข๊ธฐ ๋๋ฌธ์ !
๋ฐ์ํ'JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ Querydsl ] ํ๋ก์ ์ (Projections)๊ณผ ๊ฒฐ๊ณผ๋ฐํ (ํ๋กํผํฐ์ ๊ทผ, ํ๋์ง์ ์ ๊ทผ, ์์ฑ์ ์ฌ์ฉ) (0) 2022.03.28 [ JPA ] ๋ณตํฉํค(composite key) ๋งคํ (@EmbeddedId) (0) 2022.02.21