๐Ÿ”ฅ TIL - Day 66 Jpa exist ์ตœ์ ํ™”

Kim Dae Hyunยท2021๋…„ 11์›” 28์ผ
0

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
77/93

๐Ÿ“Œ JPA์—์„œ exist ์ฟผ๋ฆฌ ์‚ฌ์šฉํ•˜๊ธฐ

JPA์˜ ๋„์›€์„ ๋ฐ›๋Š”๋‹ค๋ฉด exist ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์‰ฌ์šด ์ผ์ด๋‹ค.

๋‚ด๊ฐ€ ์ด๋ฒˆ์— ๊ตฌํ˜„ํ•˜๊ณ ์ž ํ•œ ๊ธฐ๋Šฅ์€ ์กฐ์ž‘ (์ˆ˜์ •,์‚ญ์ œ ..)ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒŒ์‹œ๊ธ€์˜ ์ฃผ์ธ์ด ํ˜„์žฌ ๋กœ๊ทธ์ธ๋œ ์‚ฌ์šฉ์ž๊ฐ€ ๋งž๋Š”๊ฐ€ ์— ๋Œ€ํ•œ ๊ฒƒ์ด๋‹ค.

ํ˜„์žฌ ๊ฒŒ์‹œ๊ธ€๊ณผ ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๋กœ ๊ฒŒ์‹œ๊ธ€ db์— exist์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆฌ๋ฉด ๋œ๋‹ค.

boolean existsByIdAndRequestUser(Long id, User requestUser);

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์•„์ฃผ ์•„๋ฆ„๋‹ต๊ฒŒ ์›ํ•˜๋Š” ์ฟผ๋ฆฌ์™€ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ“Œ ์กฐ๊ธˆ ๋ณต์žกํ•ด์ง„๋‹ค๋ฉด ?

์ด๋ฒˆ์— ๋‚ด๊ฐ€ ์กฐ๊ฑด์œผ๋กœ ์‚ฌ์šฉํ•œ ์นผ๋Ÿผ์€ 2๊ฐœ์ด์ง€๋งŒ ์ด๋ณด๋‹ค ๋งŽ์€ ์กฐ๊ฑด์„ ํ•„์š”๋กœ ํ•˜๋Š” ์ฟผ๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ๋‹ค.
๋„ค์ด๋ฐ ๊ธฐ๋ฐ˜ ์ฟผ๋ฆฌ๊ฐ€ ๋„ˆ๋ฌด ๋ณต์žกํ•ด์ง€๋Š” ๊ฒฝ์šฐ ๋ณดํ†ต @Query๋ฅผ ์ด์šฉํ•ด์„œ ์ง์ ‘ JPQL์„ ๊ตฌ์„ฑํ•œ๋‹ค.

ํ•˜์ง€๋งŒ JPQL์˜ ๊ฒฝ์šฐ exist ํ‚ค์›Œ๋“œ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ์กด์žฌ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•ด์•ผ ํ•œ๋‹ค.
๋ณดํ†ต ์ง‘๊ณ„์ฟผ๋ฆฌ๋ฅผ ์ด์šฉํ•ด์„œ ์กฐํšŒ๋œ ๊ฒฐ๊ณผ์˜ count๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.

์›๋ž˜ ์ฟผ๋ฆฌ๋ฅผ JPQL๋กœ ๋ฐ”๊ฟ”๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

@Query(
        "select count(r.id) > 0 from ReviewRequest r " +
                "where r.id = :id and r.requestUser = :requestUser"
)
boolean existsByIdAndRequestUserJPQL(Long id, User requestUser);

ํ…Œ์ŠคํŠธ๋„ ์ž˜ ํ†ต๊ณผ๋˜๋Š” ๊ฑธ๋กœ ๋ณด์•„ ๊ฒฐ๊ณผ๋„ ๋™์ผํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ๋‚ด๊ณ  ์ฟผ๋ฆฌ๋„ ๊ทธ๋ ‡๊ฒŒ ๋ณต์žกํ•˜์ง€ ์•Š์œผ๋‹ˆ ์ถฉ๋ถ„ํžˆ ๋Œ€์ฒด ๊ฐ€๋Šฅํ•  ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค...


์œ„ ์ฟผ๋ฆฌ๋Š” ์ฟผ๋ฆฌ๊ฐ€ ๋ณต์žกํ•ด์ง€๋Š” ๊ฒฝ์šฐ exist ๊ธฐ๋Šฅ์„ JPQL์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด count๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒƒ์ธ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.
count์˜ ๊ฒฝ์šฐ ์ผ๋‹จ ๋ชจ๋“  row๋ฅผ ์กฐํšŒํ•œ๋‹ค. select ์ ˆ์—์„œ >0 ์กฐ๊ฑด์„ ๊ฑธ์—ˆ์ง€๋งŒ ์˜๋ฏธ์—†๋‹ค. ๊ทธ๋ƒฅ ๋‹ค ์กฐํšŒํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๊ฐ’์ด >0 ์ธ์ง€๋ฅผ ํŒ๋‹จํ•œ๋‹ค. ์ด๋Š” ์„ฑ๋Šฅ์ƒ ํฐ ์ด์Šˆ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

์›๋ž˜ JPA์˜ exist์˜ ๊ฒฝ์šฐ ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋ฉด ๋์— limit๊ฐ€ ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

limit๊ฐ€ 1๋กœ ์„ค์ •๋˜๋ฉด์„œ ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•˜๋Š” row๋ฅผ ์ฐพ์•˜์„ ๋•Œ ๋ฐ”๋กœ true๋ฅผ ๋ฆฌํ„ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

count์™€ exist( + limit)์˜ ์„ฑ๋Šฅ์ฐจ์ด๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์œผ๋ฉด ๋งŽ์„์ˆ˜๋ก ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•˜๋Š” ํ•„๋“œ๊ฐ€ ์•ž์— ์žˆ์„์ˆ˜๋ก ๋” ํฌ๊ฒŒ ๋ฒŒ์–ด์ง€๊ฒŒ ๋œ๋‹ค.


๐Ÿ“Œ ๋ณต์žกํ•œ ์ฟผ๋ฆฌ => Querydsl

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ ๋‚ด๊ฐ€ ์ •ํ•œ ๋ฃฐ ์ค‘ ํ•˜๋‚˜๋Š” ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋Š” ๋ฐ˜๋“œ์‹œ Querydsl๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
exist ์ฟผ๋ฆฌ๊ฐ€ ๋ณต์žกํ•ด์ง€๋Š” ๊ฒฝ์šฐ ์ง์ ‘ JPQL์„ ์ž‘์„ฑํ•œ๋‹ค๊ณ  ํ–ˆ๋‹ค. ๋ณต์žกํ•œ๊ฑฐ๋‹ˆ๊นŒ JPQL ๋ง๊ณ  Querydsl๋กœ ์ž‘์„ฑํ•ด๋ณด์ž.

JPQL์—์„œ๋„ ์ง์ ‘์ ์œผ๋กœ exist๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์•˜๊ณ  Querydsl๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ด๋‹ค.

but ์ง์ ‘ ๊ตฌํ˜„์€ ๊ฐ€๋Šฅํ•˜๋‹ค.
(์ฝ”๋“œ๋Š” jojoldu ๋‹˜์˜ ์ฝ”๋“œ๋ฅผ ์ฐธ๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค.)

๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๊ธฐ๋Šฅ์€ ์•„๋ž˜ ๋‘ ๊ฐœ์ด๋‹ค.

  • ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•˜๋Š” row๋ฅผ ์ฐพ์•˜๋‹ค๋ฉด ์กฐํšŒ๋ฅผ ๋ฉˆ์ถ”๊ณ  true๋ฅผ ๋ฆฌํ„ด
  • ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•˜๋Š” row๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ๋‹ค๋ฉด false๋ฅผ ๋ฆฌํ„ด

์ฒซ๋ฒˆ์งธ ๊ธฐ๋Šฅ์€ limit 1 ์„ ํ†ตํ•ด ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•˜๋‹ค. Querydsl์˜ fetchFirst()์ด limit 1์„ ๋Œ€์‹ ํ•œ๋‹ค.

๋‘๋ฒˆ์งธ ๊ธฐ๋Šฅ์€ ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๊ฐ€ null์ธ์ง€ ์ฒดํฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•˜๋‹ค. null์ด๋ผ๋ฉด ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•˜๋Š” row๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ด๋ฏ€๋กœ fasle๊ฐ€ ๋ฆฌํ„ด๋œ๋‹ค.

@Override
public boolean isMyReviewRequest(Long reviewId, User user) {
    Integer exist = query.selectOne()
            .from(reviewRequest)
            .where(reviewRequest.id.eq(reviewId).and(reviewRequest.requestUser.eq(user)))
            .fetchFirst();

    return exist != null;
}

์ฟผ๋ฆฌ๊ฒฐ๊ณผ

profile
์ข€ ๋” ์ฒœ์ฒœํžˆ ๊นŒ๋จน๊ธฐ ์œ„ํ•ด ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๐Ÿง

0๊ฐœ์˜ ๋Œ“๊ธ€